728x90

Comparable은 정렬 기준을 구현하는데 사용

Comparator는 다른 기준으로 정렬하고자 할때 사용

그럼 어떤 기준으로 sort하는 것일까?

 

comparable은 인터페이스이고 compareTo() 메소드가 정의되어 있기 때문에 
사용자 정의 클래스에서는 이 메소드를 오버라이딩하여 다음과 같이 리턴값을 만들어 내야 한다.

리턴타입 메소드 설명
int compareTo(T o) 주어진 객체와 같으면 0을 리턴
주어진 객체보다 적으면 음수 리턴
주어진 객체보다 크면 양수리턴

Comparator도 인터페이스 이고

리턴타입 메소드 설명
int compare(T o1, T o2) o1과 o2가 동등하다면 0리턴
o1이 o2보다 앞에 오게하려면 음수리턴
o1이 o2보다 뒤에 오게 하려면 양수리턴

 

 

sort() 정렬하는 메소드

sort()는 배열을 정렬해주는 메소드이다
오름차순?으로 하고 문자는 아스키코드를 기준으로 정렬해준다.
0과 1, 1과2 이렇게 하나씩 비교를해서 앞에객체(기준)보다 
음수, 양수, 0을 리턴해서 자리를 하나씩 옮겨준다.

 
Collection 클래스의 sort메소드를 사용하기 위해서는 Comparable 와 Comparator 중 하나를 선택해서 사용해야 한다.
그리고 정렬을 하는 기준을 개발자가 직접 정해줘야 한다.

먼저 Comparable 은 객체의 정보를 저장한 DTO클래스에 implement를 해줘야 한다.
사진처럼 추상클래스 Comparable를 implement하고
메소드를 오버라이드 한다.

그리고 개발자가 원하는 기준을 정의하면된다.
사진에서는 총점 tot를 기준으로 잡았다.
위의 설명처럼 
주어진 객체와 같으면 0을 리턴
주어진 객체보다 적으면 음수 리턴
주어진 객체보다 크면 양수를 리턴한다.
배열의 0번째 총점(this.tot)를 1번째 총점(s,tot)와 비교해서 결과를 낸다.
그다음 1번째와 2번째를 비교한다.

이렇게 기준점을 주면 나오는 결과로 sort메소드가 자동으로 정렬을 할 것이다.
그리고 메소드를 구현할 클래스의 부분에 오버라이드를 하고
사진과 같이 선언한다.
파라미터 값으로는 배열을 뜻하는 변수를 넣으면 된다.
다른 예시를 보자
이 클래스에서는 나이age를 기준으로 잡았다.

첫번째 예시에서는 3항 연산자를 했는데 여기선 풀어서 if문으로 했다.
0번째 배열속의 age와 1번째의 age를 비교해서 
-1,0,1을 리턴시킨다.
그다음 순서대로 쭉이어나가고
그 결과에 맞에 sort메소드가 알아서 정렬해준다.

오름차순 내림차순은 보고 생각해보자.
그리고 1번 처럼 선언하면 자동으로 정렬한다.

근데 2번을 보면 Comparator가 있다.
저 클래스에서 Comparator 를 사용한 이유는 나이가 아닌 다른 기준으로 정렬을 하고 싶어서 만든것이다.

오버라이드를 통해 기준을 재정의 함으로써 기준을 바꿀 수 있다.
익명클래스를 이용해서 사용한다.
Comparator<PersonDTO> com 
PersonDTO클래스의 정보를 바탕으로 하는 Comparator메소드를 com이라는 임의의 변수로 선언했다.
그리고 오버라이드 한것을 보면 위의 사진들과 다르게 파라미터를 2개를 받는데 맨위에 설명이 있다

p1과 p2가 동등하다면 0리턴
p1이 p2보다 앞에 오게하려면 음수리턴
p1이 p2보다 뒤에 오게 하려면 양수리턴

동작원리는 똑같다,
사진처럼 코드를 작성하면
이런 결과가 나온다.

이름으로 정렬한 것은 아스키코드를 기준으로 정렬한다.

 

 

 

728x90

'JAVA' 카테고리의 다른 글

팩맨 움직이기1  (0) 2020.10.14
10/14 수업  (0) 2020.10.14
10/13수업  (0) 2020.10.13
(월요일에 복습하기)CalendarMain(캘린더) 만들기, Today  (0) 2020.10.11
Assert  (0) 2020.10.08
728x90

이부분 때문에 객체가 안쌓이고 계속 하나만 남았음


setter를 이용한 방법


DTO클래스에 toSting을 해줘야지 주소값이 아니라 우리가 설정한 값이 나온다.

toString을 안할거면 for문안에 get으로 일일히 선언하면된다.


확인해야하기 때문에 sw라는 변수를 하나 더 설정해준다.

while문에 같은것을 비교하는 코드가 없어서 이코드를 실행하면 저장된 배열을 전부 삭제해버림

if문을 추가해야지 값을 비교해서 원하는 배열만 지울 수 있다.

삭제에서 처음사진처럼하면 오류가 난다.
배열을 삭제하면 0,1,2중에 하나가 지워져 0, ,2 가 아니라 2가 땡겨져서
배열의 숫자?가 변하기 때문이다.
이땐 iteraor를 사용해야 한다.

이터는 먼저 배열의 순서를 이동하고(재배열을 먼저하고) 배열을 지우기 때문에 배열의 순서를 가리키는데 오류가 안난다.
어레이리스트의 remove는 배열을 먼저 지우고 순서는 재배열하기 때문에  삭제를 하고나면 순서를 가르키는곳이 없어서 오류가 난다.

 

Iterator ???


 

글자를 한 글자씩 비교를 한다.

 

정렬하는방법

먼저 DTO클래스에 비교하는 메소드를 추가할 수있도록 implements를 한다.
<>의 내용은 <>를 기준으로 비교를 할 것이라는 것이다.

오버라이드한메소드를 통해 어떤 객체를 기준으로 할것인지(총점인지, 평균인지...)
오름차순으로 할것인지 내림차순으로 할것인지 기준을 선언해준다.
위의 그림에선 tot(총점)을 기준으로 잡았고

위의 사진은 age(나이)를 기준으로 잡았다.
DTO에 오버라이드해서 선언할 때 기준을 정할 수 있다.

DTO에 기준을 정해놨고 이제 sort를 통해 우리가 잡은 기준을 통해 비교를해서 -1,0,1을 도출해 재배열해준다.
메인메소드에 System.out.println(list);으로 선언하면 toString을 거쳐 출력이된다.

다른 기준점으로 정렬을 하고싶으면 메인메소드안에서 오버라이드를 해서 재정의 해주면된다.
아래의 사진은 한클래스에서 tot로 기준점을 잡았는데 이름을 새로운 기준으로 잡고싶어서
오버라이드(익명)를 통해 name을 기준으로 재정의 한 것이다.

//compareToo는 알아서 p1과 p2를 비교해서 -1,0,1을 리턴해준다.
좌항과 우항에 들어갈 기준만 우리가 재정의해주면된다.
위에서 처럼 오름차순 내림차순을 바꾸고 싶으면 *-1을 해주면된다. 그럼 원래 결과값인 (-1.0.1)이 *-1이되어 뒤집어진다.
그리고 기준점인 list, com을 넣어주면 sort에서 알아서 재배열해서 출력해준다.

https://blog.naver.com/cheesedrive/220148513502
https://blog.naver.com/nekh802/221560976931
compareTo를 통해 기준점을 잡은 상태에서 sort()메소드로 재정렬한다.
 

 

 

설명

String 배열 ar에는 String타입의 객체들만 있어서 그냥 sort만 사용해도 sort메소드에서 알파벳 첫번째 부터 비교를 해서
-1,0,1 을 도출해 알파벳 순으로 재정렬 된다

근데 객체배열이 된다면 다양한 타입이 있어서 기준점을 잡아줘야 한다.
그래서 DTO클래스에

implement하고

오버라이드를 해서 기준점을 잡아준다. 

PersonDTO는 아래처럼 String와 int타입이 있어서 위에서 봤던 배열ar처럼 sort메소드가 알아서 기준을 잡지 못한다.

그렇기 때문에 오버라이드를 통해 기준점을 잡아줘야한다. 위의 사지에선 int타입인 age을 기준으로 잡았고
내림차순, 오름차순을 정의했다.

오버라이드한 comparTo메소드를 통해 age를 기준으로 잡았는데 
String타입인 이름으로 같이 기준을 잡고싶으면?

메인메소드안에서 오버라이드를 통해 재정의 해주면된다. 근데 추상클래스라서 new를 못하고 익명클래스를 이용해야 한다.

이런식으로 재정의 하고 기준점을 정해주면되는데
DTO클래스에 우리가 age를 정한거랑 다르게 여기서는 좌항 우항만 정해주면 compareTo가 알아서 -1,0,1을 비교해준다.
저 작업을 해야지 기준점이 생겨서
sort가 새로운 기준을 찾아서 재배열을 할 수 있다.
//여기의 compareTo는 String클래스꺼

Collections.sort(list.com); list를 기준점 com으로 재배열한다.



Stack

LIFO(last in first out)

System.안쓰기
improt해주면됨

 


Queue

 


 

728x90

'JAVA' 카테고리의 다른 글

10/14 수업  (0) 2020.10.14
미완성[메소드]정렬 sort(), Comparable vs Comparator  (0) 2020.10.14
(월요일에 복습하기)CalendarMain(캘린더) 만들기, Today  (0) 2020.10.11
Assert  (0) 2020.10.08
객체배열 숙제 10/07  (0) 2020.10.07
728x90
728x90
728x90

년도와 월을 입력하면 달력 출력하기

package abstracrMethod;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;

public class CalendarMain {
	private int year, month, week, lastDay;
	
	public CalendarMain() throws NumberFormatException, IOException {//기본생성자
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("년도 입력 : ");
		year = Integer.parseInt(br.readLine());
		System.out.print("월 입력: ");
		month = Integer.parseInt(br.readLine());
	}
	
	public void calculator() {
		Calendar cal = Calendar.getInstance(); //클래스 생성
		//이렇게 캘린더를 생성하면 지금당장의 날짜가 기준이됨
		
		//컴퓨터는 기준을 지금 당장의 시간을 기준점으로 잡는데 입력한 달의 날짜를 가져오고싶은거니까
		//기준점을 바꿔야 한다.
		//-------------------------------
		cal.set(Calendar.YEAR, year); //입력한 year이 Calendar.YEAR에 들어가 입력한 해의 정보를 가져온다
		cal.set(cal.MONTH, month-1); //컴퓨터는 0부터 1월을 저장하니까
		//우리가 입력한 월보다 1이 더 작다.
		cal.set(cal.DAY_OF_MONTH, 1); //DAY_OF_MONTH는 1일이 아니라 29일을 기준을 기준으로 잡고 29일부터 나온다.
//									  그래서 기준점을 1로 잡아줘야 한다.
		//-------------------------------
		cal.set(year,  month-1, 1);
		//위의  3줄이랑 이 한줄이랑 같다.
		//-------------------------------
		//이 코드를 지나면 입력값을 통해 x년x월 1일로 기준이 맞춰짐
		week = cal.get(cal.DAY_OF_WEEK);// 입력한 해, 월의 1일이 무슨요일인지 알아내는 코드
		//32번줄에 있는 코드에 설정을 해놨기 때문에 week 줄이 가능
		lastDay = cal.getActualMaximum(cal.DAY_OF_MONTH);//입력한 월에 가장 큰값, 마지막 날을 알아내는 코드
		
	}
	
	
	
	public void disp() {
		System.out.println("일\t월\t화\t수\t목\t금\t토");
		//week는 위에서 구해진 년,월의 정보에 맞는 1일의 요일 정보를 가져온다.
		//일,월,화~토 로 일요일이 1, 토요일이 7이다
		for(int i=1; i<week; i++) {
			System.out.print("\t");
		}//달력에 시작일 빈칸띄우기
		
		for(int i=1; i<=lastDay; i++) {
			System.out.print(i+"\t");
			if(week%7 == 0) {
				System.out.println();
				}
			week++;
		//일을 밑으로 내리는 거는 i가 아니라 1~7까지만 도는 변수 week를 이용하자
		}
	}
		
	public static void main(String[] args) throws NumberFormatException, IOException {
		CalendarMain c = new CalendarMain();
		c.calculator();
		c.disp();
	}

}

 

728x90

'JAVA' 카테고리의 다른 글

미완성[메소드]정렬 sort(), Comparable vs Comparator  (0) 2020.10.14
10/13수업  (0) 2020.10.13
Assert  (0) 2020.10.08
객체배열 숙제 10/07  (0) 2020.10.07
DecimalFormat(숫자 형식 클래스)  (0) 2020.10.01
728x90

Assert는  값이 false일때 임의로 에러를 발생시키는 코드이다.

프로그램을 만드는 중간에 제대로 작동하는지 확인? 하는 역활로 사용할 수 있다.

제곱승을 구하는 프로그램을 만들어보자

package class_constructor02;

import java.util.Scanner;

public class Assert {
	private int x, y;
	
	public void input() {
		Scanner sc = new Scanner(System.in);
		System.out.print("x 입력 : ");
		x = sc.nextInt();
		System.out.print("y입력 : ");
		y = sc.nextInt();
	}
	
	public void output() {
		
		int result = 1;
		for(int i=1 ; i<=y; i++) {
			result *= x;
		}
		System.out.println(x+"의 "+y+"승은 "+result);
	}

	public static void main(String[] args) {
		Assert a = new Assert();
		a.input();
		a.output();

	}

}

a메인 메소드에 전부 작성하지 않고 input()과 output()을 이용해 만들었다.

x는 숫자 y는 몇번 제곱할건지 받는건데 y값에 음수가 들어오면 결과는 무조건 -1이 나온다.
근데 y에 음수가 들어오면 false이기 때문에 

Assert을 이용해 y에 음수가 들어가서 false가 나오면 에러가 나오게 만들어보자

public void output() {
		//y는 반드시 양수만 입력받도록 하겠다
		assert y>=0;
		
		int result = 1;
		for(int i=1 ; i<=y; i++) {
			result *= x;
		}
		System.out.println(x+"의 "+y+"승은 "+result);
	}

간단하게 제곱하는 메소드인 output()의 가장 첫줄에 조건을 넣으면된다
assert y>=0; 을 작성하면 y가 양수이면 true로 그냥 지나치고
y에 음수가 들어오면 false로 에러가 뜬다.

근데 그냥 run을 하면 에러메세지가 나오지않고 1이 나온다.
사전 작업을 해줘야 한다.

이렇게 사진의 순서대로 들어가서 작업을 해주고 Run을 하고 값을 입력하면 된다.

 

여기서 에러메세지에 문구를 넣고 싶으면

assert y>=0 : "y는 0보다 크거나 같아야 한다";

이 줄에 이렇게 메세지를 입력하면 된다. 
그리고나서 에러가 나오면

이렇게 출력해준다.

728x90

'JAVA' 카테고리의 다른 글

10/13수업  (0) 2020.10.13
(월요일에 복습하기)CalendarMain(캘린더) 만들기, Today  (0) 2020.10.11
객체배열 숙제 10/07  (0) 2020.10.07
DecimalFormat(숫자 형식 클래스)  (0) 2020.10.01
가변인자 varArgs  (0) 2020.09.29
728x90
package class_constructor;

import java.util.Scanner;

//객체배열
public class Examination {
	private String name;
	private String dap;//"12311"
	private char[] ox;
	private int score;
	public static final String JUNG = "11111"; //정답
	
	public String getName() {
		return name;
	}
	public String getDap() {
		return dap;
	}
	public int getScore() {
		return score;
	}
	public char[] getOx() {
		return ox;
	}
	
	
	public Examination() {
		Scanner sc = new Scanner(System.in);
		System.out.print("이름 입력 : ");
		this.name = sc.next();  
		System.out.print("답 입력 : ");
		this.dap = sc.next();
		
		ox = new char[5];
		//ox = new char[dap.length()];
	}
	
	//compare()-비교
	public void compare() {
		//for(int i=0 ; i<5 ; i++)// 
		//for(int i=0 ; i<dap.length() ; i++)// 아래꺼랑 같음 
		for(int i=0 ; i<ox.length ; i++) { 
			if(dap.charAt(i) == JUNG.charAt(i)) {
				ox[i] = 'O';
				score +=20;
			}else {
				ox[i] = 'X';
			}
			
		}
	}
	
	
	//여기서 toString안쓰는 이유는 toStrimg은 한번에 출력하는데
	//이 클래스는 한줄한줄 for문을 이용해서 출력하기 때문에 맞지않다.ㅇ

	
	
}
먼저 필드와 정보를 내보낼 getter를 만든다.
ox는 한 글자씩 나갈거니깐 타입을 char로 하는데
5문제에 대한 ox를 나타낼 거니깐 배열로

getter에도 ox는 배열로 해줘야 한다.
기본생성자를 선언
처음 보일 화면이 이름이랑 답을 입력하는거니깐 
입력값을 받는거 선언하고
여기서 ox를 배열로 생성한다.
5문제니깐 5개 크기로
그리고 비교하는 메소드를 만드는데
우리가 답을 입력하는건 String타입,
그리고 상수로 선언한 정답도 String이다.
순서대로 입력한 dap과 JUNG를 비교할려면 그 안에 값들을 하나씩 비교해주면 된다.

그래서 charAt()를 이용해 한개씩 비교하면서
맞으면 O, 틀리면 X를 출력해 OX배열에 입력하고 맞으면 20점식 점수를 늘린다.





package class_constructor;

import java.io.ObjectInputStream.GetField;
import java.util.Scanner;

public class ExaminationMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("인원 수 : ");
		int count = sc.nextInt();
		System.out.println();
		
		Examination[] en= new Examination[count];
		for(int i=0; i<en.length; i++) {
			en[i] = new Examination();
			en[i].compare();
		}
		
		System.out.println();
		System.out.println("이름\t1 2 3 4 5 \t점수");
		
		for(int k=0; k<count; k++) {
			System.out.print(en[k].getName()+"\t");
			for(int i=0;i<en[k].getOx().length; i++) {
				System.out.print(en[k].getOx()[i]+" ");
		}
			System.out.println("\t"+en[k].getScore());
		}
		
	}

}
메인 메소드로 넘어와서 입력값을 받는 Scanner 선언해주고
입력한 인원수 만큼 배열을 만들거니깐 count변수를 만들어준다.
그다음 가장 중요한 객체배열을 선언한다.
Examination을 속성으로 하는 배열을 담는 en을 count만큼 방을 만들어준다.
그다음 for를 돌려서 en[]방에 하나씩 생성자를 넣어주고 compare를 선언해서 비교를 해준다.

앞서 Examination클래스에 입력에 필요한 필드와 입력코드 등을 다 선언했기 떄문에 생성자만 만들면 된다.
마지막으로 입력한 이름과 답을 비교해서 채점한후 점수와 정답을 출력해야 한다.
for를 이용해 count만큼 돌리고 객체배열en[k],getName을 통해 배열에 있는 이름을 불러낸 다음

ox를 통해 채점한 것을 출력한다.
Examination클래스에서 선언한 배열ox와 
charAt()을 이용해 ox를 출력하는 compare메소드를 통해

메인메소드에서 객체배열en[k].getOx()를 이용해 정답에 따라
ooxoo,oxxxxo 이런식으로 출력할 수 있다.
다 하면 결과는 이렇다.
   
   
   
728x90
728x90

 

package abstracrMethod_0929;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberTest {
//추상클래스는 new를 사용할 수 없다!!!!!!
	//자식클래스나 메소드를 이용해야 한다.
	public static void main(String[] args) {
		NumberFormat nf = new DecimalFormat();
		//아무것도 안해도 3자리마다 ,찍고 소수이하 3째자리
		System.out.println(nf.format(12345678.456789));
		System.out.println(nf.format(12345678));
		System.out.println();
        }
 }
12,345,678.457
12,345,678

package abstracrMethod_0929;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberTest {
	public static void main(String[] args) {
		
		NumberFormat nf2 = new DecimalFormat("#,###.##원");
		//소수점 이하의 숫자가 유효숫자가 아닌것은 표현하지 않는다
		System.out.println(nf2.format(12345678.456789));
		System.out.println(nf2.format(12345678));
		System.out.println();
        }
}
12,345,678.46원
12,345,678원

package abstracrMethod_0929;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberTest {
	public static void main(String[] args) {
		
		NumberFormat nf3 = new DecimalFormat("#,###.00원");
		//0을 강제로 표시
		System.out.println(nf3.format(12345678.456789));
		System.out.println(nf3.format(12345678));
		System.out.println();
        
        }
}
12,345,678.46원
12,345,678.00원

package abstracrMethod_0929;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberTest {
	public static void main(String[] args) {

		NumberFormat nf4 = NumberFormat.getInstance();
		nf4.setMaximumFractionDigits(2); //소수이하2쨰자리
		nf4.setMinimumFractionDigits(2); //강제로 0이표시
		System.out.println(nf4.format(12345678.456789));
		System.out.println(nf4.format(12345678));
		System.out.println();
        }
}
        
12,345,678.46
12,345,678.00

package abstracrMethod_0929;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberTest {
	public static void main(String[] args) {

		//NumberFormat nf5 = NumberFormat.getInstance(Locale.US);
		//NumberFormat nf5 = NumberFormat.getCurrencyInstance(Locale.US);//달러표시
		NumberFormat nf5 = NumberFormat.getCurrencyInstance(Locale.JAPAN);//엔화표시
		nf5.setMaximumFractionDigits(2); //소수이하2쨰자리
		nf5.setMinimumFractionDigits(2); //강제로 0이표시
		System.out.println(nf5.format(12345678.456789));
		System.out.println(nf5.format(12345678));
		System.out.println();
        }
}
¥12,345,678.46
¥12,345,678.00

package abstracrMethod_0929;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberTest {
	public static void main(String[] args) {
	
		NumberFormat nf6 = new DecimalFormat("-#.0원");
		//0을 강제로 표시
		System.out.println(nf6.format(123.45));
		System.out.println(nf6.format(1234));
		System.out.println();
        }
   }
-123.5원
-1234.0원

package abstracrMethod_0929;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberTest {
	public static void main(String[] args) {

		NumberFormat nf7 = new DecimalFormat("+#.0원");
		//0을 강제로 표시
		System.out.println(nf7.format(123.45));
		System.out.println(nf7.format(1234));
		System.out.println();
	}
}
+123.5원
+1234.0원
728x90

'JAVA' 카테고리의 다른 글

Assert  (0) 2020.10.08
객체배열 숙제 10/07  (0) 2020.10.07
가변인자 varArgs  (0) 2020.09.29
객체 타입 확인 instanceOf()메소드, indexOf()응용문제  (0) 2020.09.29
Import Static  (0) 2020.09.28
728x90

우리가 오버로드, 파라미터를 받을때 하나받을지, 여러개를 받을지 모른다. 그래서 1,2,3개 등 여러개의 파라미터를 받는 메소드를 만들어 오버로드를 해야한다.

package class_constructor;


public class VarArgs_0928 {
	
	private int sum;
	
	public int sum(int a, int b) {
		return a+b;
	}
	public int sum(int a, int b, int c) {
		return a+b+c;
	}
	public int sum(int a, int b, int c, int d) {
		return a+b+c+d;
	}

	public static void main(String[] args) {
		VarArgs_0928 va = new VarArgs_0928();
		System.out.println("합 = "+va.sum(10,20));
		System.out.println("합 = "+va.sum(10,20,30));
		System.out.println("합 = "+va.sum(10,20,30,40));
	}

}

 내가 아는대로라면 메인메소드에서 인자값(파라미터)를 저렇게 넣을려면 그 인자값에 맞는 메소드를 오버로딩해야 한다. 

근데 저게 100개까지가면...? 파라미터(인자)를 받는 메소드를 100개나 만들어야 하나...?

 

그래서 있는 메소드가 가변인자 varargs이다.
java 1.5부터 추가 되었고 자료형의 인자를 0개 이상 받을 수 있다!

기본 문장은 이렇게 생겼다.

public static int hash(Object ... values)

가변인자를 선언해주면 인자의 수에 제한을 두지 않고 동적으로 받을 수 있다.
동작 원리는 배열을 이용하는 것이다.
여기서 ...은 무조건 3개이다. 무.조.건.

package class_constructor;


public class VarArgs_0928 {

	public int sum(int...ar) {//파라미터를 일정한 배열로 받는 방법, .은 '무조건'3개를 찍어야한다.
		//ar에 아래에 10,20이 들어와 방이 2개가된다
		//ar에 아래에 10,20.30이 들어와 방이 3개가된다
		int hap =0;
		for(int i=0; i<ar.length; i++) {
			hap += ar[i];
		}
		return hap;
	}
	//여기서 인트말고 더블, 뭐 아무거나 받기를 원하면 sum(int ...ar)을 object로 바꾸면 된다.
	//상속이라는 개념 때문에 가능하다. 대신 밑에 상세코드는 바꿔야한다.
	
	
	
	public static void main(String[] args) {
		VarArgs_0928 va = new VarArgs_0928();
		System.out.println("합 = "+va.sum(10,20));
		System.out.println("합 = "+va.sum(10,20,30));
		System.out.println("합 = "+va.sum(10,20,30,40));
	}

}

이렇게 코드를 짜주면 간단하게 내가 원하는 만큼 인자를 넣어줄 수 있다.
위의 코드와 달리 int말고 다른걸 넣고 싶으면 String이나 double,아님 Object를 해주고
밑에 코드를 타입에 맞게 변경해주면 된다.

 

728x90

'JAVA' 카테고리의 다른 글

객체배열 숙제 10/07  (0) 2020.10.07
DecimalFormat(숫자 형식 클래스)  (0) 2020.10.01
객체 타입 확인 instanceOf()메소드, indexOf()응용문제  (0) 2020.09.29
Import Static  (0) 2020.09.28
배열 연습문제 05  (0) 2020.09.24

+ Recent posts