매개변수 Args
가변 인수
- 메서드를 호출 할 때 인수의 개수가 다를 경우에 사용
- 가변인수는 메서드 안에서는 배열로 처리된다.
- 가변인수는 메서드에서 한 개만 사용할 수 있다.
ex) (int... data, String... str) 컴파일러 오류 - 가변인수는 일반적인 매개변수와 함께 사용이 가능하나
가변인수를 제일 뒤쪽에 배치해야된다
public class ArgsTest {
// 매개변수로 정수들을 받아서 이들의 합계를 계산하여 반환하는 메서드를 작성하시오.
// (단, 이 정수들의 개수는 상황에 따라 달라질 수 있다.
public int sumArr(int[] data) {
int sum = 0;
for(int i=0; i<data.length; i++) {
sum += data[i];
}
return sum;
}
public void tes(int a) {
}
// 가변 인수를 이용한 방법
public int sumArg(int... data) {
int sum = 0;
for(int i=0; i<data.length; i++) {
sum += data[i];
}
return sum;
}
// 가변인수를 일반적인 매개변수와 같이 사용할 경우에는
// 가변인수를 제일 뒤쪽에 배치해야 한다.
public String sumArg2(String name, int... data) {
int sum = 0;
for(int i=0; i<data.length; i++) {
sum += data[i];
}
return name + "씨의 총합 : "+sum;
}
public static void main(String[] args) {
ArgsTest test = new ArgsTest();
// 초기화작업을 안할시에 직접 대입은 변수 선언시에만 가능
int[] numArr = {125, 354, 671}; // 배열 초기화 1
// 사용불가능 - 컴파일 에러
// 변수를 만들 때만 직접 대입할 수 있음
// int[] a;
// a = {1,2,3};
// 배열 변수를 만들고 나중에 초기화
// int[] b;
// b= new int[] {1,2,3,4,5,6};
// 배열 변수를 만듬과 동시에 초기화
int[] testArr = new int[] {100, 200, 300, 400}; // 배열초기화 2
System.out.println(test.sumArr(numArr)); // 변수 대입
System.out.println(test.sumArr(new int[]{1,2,3,4,5})); // 초기화 후 대입
System.out.println(test.sumArg2("홍길동", 1,2,3,4,100)); // 홍길동씨의 총합 : 110
// int k = 100;
// test.tes(k); // 변수를 대입을 하거나
// test.tes(3000); // 직접 값을 넣을 수도 있음
System.out.println(test.sumArg(1,2,3,4,5,6));
}
}
제네릭 타입 Generic Type
class 클래스명<Generic 타입글자>{
private Generic타입글자 변수명; // 변수를 선언 할 때 제네릭을 사용할 경우
public Generic타입글자 메서드명(){ // 메서드의 반환값 타입으로 사용할 경우
...
return 값;
}
public 반환값타입 메서드명(Generic타입글자 변수명, ...){ // 메서드의 매개변수의 타입으로 사용할 경우
...
return 값;
}
}
제네릭 타입 글자로 많이 사용되는 글자
* T ==> Type
* K ==> Key
* V ==> Value
* E ==> Element
// 제네릭을 사용하지 않는 경우
// 모든 타입을 사용하기 위해 모든 것을 포괄하는 Object를 사용함
class NonGeneric{
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) { // wrapper
this.value = value;
}
}
// 제네릭을 사용하는 클래스 만들기
class MyGeneric<T>{
private T value; // 변수에 사용
public void setValue(T value) { // 매개변수에 사용
this.value = value;
}
public T getValue() { // 반환값에 사용
return value;
}
}
public class GenericTest {
public static void main(String[] args) {
NonGeneric non1 = new NonGeneric();
non1.setValue("안녕하세요");
NonGeneric non2 = new NonGeneric();
non2.setValue(200);
String sTemp = (String) non1.getValue(); // Object이기 때문에 형변환
System.out.println("문자열 반환값 : "+sTemp); // 문자열 반환값 : 안녕하세요
int iTemp = (int) non2.getValue();
System.out.println("정수열 반환값 : "+iTemp); // 정수열 반환값 : 200
// 문법적으로 error가 없음 > 컴파일 에러X (Object를 int로 형변환하는것에는 문제가 없음)
// 하지만 실질적인 데이터는 문자열임으로 숫자로 형변환이 불가능 하기 때문에 에러가 뜬다
// 이러한 이유로 제네릭을 사용하여 에러를 방지한다
// int iTemp2 = (int) non1.getValue();
// System.out.println("iTemp2 = "+iTemp2);
// java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
MyGeneric<String> my1 = new MyGeneric<>();
my1.setValue("문자열"); // 제네릭에 맞는 데이터만 저장 가능
// my1.setValue(100); // 오류
MyGeneric<Integer> my2 = new MyGeneric<>();
// my2.setValue("문자열"); // 다른 종류의 데이터를 저장할 수 없다
my2.setValue(100);
String strTemp = my1.getValue(); // 데이터를 꺼내올 때 형변환 없이 꺼내올 수 있다.
int intTemp = my2.getValue();
System.out.println("제네릭 문자열 반환값 : "+strTemp); // 제네릭 문자열 반환값 : 문자열
System.out.println("제네릭 정수열 반환값 : "+intTemp); // 제네릭 정수열 반환값 : 100
// int test = my1.getValue(); //문자열 타입이기 때문에 컴파일 오류
}
}
Enum(열거형)
상수 Const
public final static 타입 이름(대문자) = 값;
public class ConstTest {
public final static int RED = 1;
public final static int GREEN = 2;
public final static int BLUE = 3;
public final static int ONE = 1;
public final static int TWO = 2;
public final static int THREE = 3;
}
public class enumTest {
public static void main(String[] args) {
System.out.println("Red : "+ConstTest.RED); // Red : 1
System.out.println("Three : "+ConstTest.THREE); // Three : 3
// 성격이 다름에도 값이 같아 같다 출력 > 논리적으로 맞지않음
if(ConstTest.ONE == ConstTest.RED) {
System.out.println("같다");
} else {
System.out.println("같지 않다");
}
}
}
enum
- 서로 관련있는 상수 들의 집합을 나타낸다.
- 클래스처럼 보이게 하는 상수
- 작성 방법
- 열거형은 클래스처럼 독립된 Java파일에 만들 수 있다.
- 하나의 java파일에 클래스와 같이 만들 수 있다.
- 클래스 내부에 내부 클래스 처럼 만들 수 있다.
- 열거형의 속성 및 메서드
- 열거형변수.name()
열거형 상수의 이름을 문자열로 반환한다 - 열거형변수.ordinal()
열거형 상수가 정의된 순서값(index값)을 반환한다 (0부터 시작) - 열거형이름.valueOf("열거형상수명")
인수값으로 지정한 '열거형상수명'과 일치하는 열거형 상수를 반환한다 - 열거형이름.상수명
열거형이름.valueOf("상수명")와 같다 - 열거형이름.values()
모든 상수들을 배열로 가져와 반환한다.
- 열거형변수.name()
열거형 선언하기
방법1)
enum 열거형이름 {상수명1, 상수명2, ... , 상수명n}
방법2)
enum 열거형이름{
상수명1 (값1, ... ),
...
상수명n (값n, ... ); // 세미콜론 작성
// '값'이 저장될 변수를 선언한다
private 자료형이름 변수명1;
private 자료형이름 변수명2;
...
private 자료형이름 변수명n;
// 열거형의 생성자를 만든다
// 열거형의 생성자는 '열거형 상수'에 구성된 '값'을 '변수'에 세팅하는 역할을 수행한다
// 열거형 생성자는 묵시적으로 'private'이다.
// 생성자의 매개변수는 '값'과 갯수가 같고 각각의 자료형이 맞아야 한다.
private 열거형 이름(자료형 이름 변수명1, ... ) {
// 위에 선언된 변수들을 매개변수값으로 초기화한다.
...
}
// 위에서 선언한 변수의 값을 외부에서 불러올 수 있는 getter메서드를 작성한다.
}
public class enumTest {
// 클래스 내부에 내부클래스처럼 생성
public enum Color {
RED, GREEN, BLUE
} // 세미콜론 없어도됨
public enum Count {
ONE, TWO, THREE
}
public enum Season{
봄("3월부터 5월까지", 13), 여름("6월부터 8월까지", 26), 가을("9월부터 11월까지", 15), 겨울("12월부터 2월까지", 1); // 값이 있을 땐 ; 써야함
// 값들이 저장될 변수 선언
private String span;
private int temp;
// 생성자 private를 생략해도 private Season과 같음
Season(String month, Integer temp) { // 변수명이 위와 달라도 됨
span = month;
this.temp = temp;
}
// getter
public String getSpan() {
return span;
}
public int getTemp() {
return temp;
}
}
public static void main(String[] args) {
Color mycol = Color.valueOf("GREEN"); // Color.GREEN; 와 동일
Count mycnt = Count.ONE; // Count.valueOf("ONE");
System.out.println("mycol : " + mycol.name()); // mycol : GREEN
System.out.println("mycnt : " + mycnt.name()); // mycnt : ONE
System.out.println("mycol의 ordinal : " + mycol.ordinal()); // mycol의 ordinal : 1
System.out.println("mycnt의 ordinal : " + mycnt.ordinal()); // mycnt의 ordinal : 0
// 서로 다른 종류의 열거형끼리는 비교가 불가능하다.
// if(Color.RED==Count.ONE) {// 오류 }
// 같은 종류의 열거형끼리만 비교가 가능하다.
if (mycol == Color.BLUE) {
System.out.println("같다");
} else {
System.out.println("같지 않다");
}
System.out.println();
Season ss = Season.valueOf("봄");
System.out.println("name : "+ss.name()); // name : 봄
System.out.println("ordinal : "+ss.ordinal()); // ordinal : 0
System.out.println("span : "+ss.getSpan()); // span : 3월부터 5월까지
System.out.println("temp : "+ss.getTemp()); // temp : 13
// 열거형이름.values() 이용하여 전체 상수들에 대한 처리
for(Season s : Season.values()) {
System.out.println(s + " == "+ s.name() + " ==> "+s.getSpan());
}
// 봄 == 봄 ==> 3월부터 5월까지
// 여름 == 여름 ==> 6월부터 8월까지
// 가을 == 가을 ==> 9월부터 11월까지
// 겨울 == 겨울 ==> 12월부터 2월까지
// 열거형을 switch문에서 비교하기
// ==> case 옆에는 '상수명'만 기술해야 한다.
switch (mycol) {
// case 열거형이름.상수명 : ==> 이렇게 작성하는 것은 안된다
// case 상수명 : ==> 올바른 표현
case RED: //Color.RED라고 쓰면 안됨
System.out.println("RED입니다.");
break;
case GREEN:
System.out.println("GREEN입니다.");
break;
case BLUE:
System.out.println("BLUE입니다.");
break;
default:
break;
}
}
}
'JAVA > HIGH JAVA' 카테고리의 다른 글
4/29 Homework - 가위바위보 게임 (0) | 2024.04.29 |
---|---|
[JAVA] 스레드 (0) | 2024.04.29 |
4/25 Homework - 호텔관리 (0) | 2024.04.25 |
[JAVA] Properties (0) | 2024.04.25 |
4/24 Homework - 전화번호 관리/ Scanner next(),nextLine() (0) | 2024.04.24 |