1. 제네릭 (Generics)
: 컴파일에게 타입 정보를 제공해서 컴파일시 타입체크를 해주는 기능
: 일반 코드를 작성한 후 이 코드를 다양한 타입의 객체에 대하여 재사용하게 만드는 기법
-> 클래스를 하나 만들어고, 내부 메서드에서 하나의 타입이 아닌 여러 타입으로 만들고 싶을 때
- 장점,
① 타입 안정성 제공 : RuntimeException 에서의 ClassCastException 오류가 아닌 Compile 에러를 나타내 수정 가능
② 타입체크와 형변환을 생략할수 있어서 번거로움을 줄여줌
- 예제
class Generic<T> { //<T> 타입변수
T value;
public T getValue() { return value; }
public void setValue(T value) { this.value = value; }
}
public class GenericsEx01 {
public static void main (String[] args) {
//<T>를 <String>타입으로지정해서 value의 값으로 String타입만 가능
Generic<String> v1 = new Generic<String>();
v1.setValue("100");
System.out.println("<T> -> <String> : "+ v1.getValue());
//<T>를 <Integer>타입으로지정해서 value의 값으로 int타입만 가능
Generic<Integer> v2 = new Generic<Integer>();
v2.setValue(100);
System.out.println("<T> -> <Integer> : "+v2.getValue());
//<T>를 <Double>타입으로지정해서 value의 값으로 double타입만 가능
Generic<Double> v3 = new Generic<Double>();
v3.setValue(100.0);
System.out.println("<T> -> <Double> : "+v3.getValue());
//<T>를 <Charcter>타입으로지정해서 value의 값으로 char타입만 가능
Generic<Character> v4 = new Generic<Character>();
v4.setValue('A');
System.out.println("<T> -> <Character> : "+v4.getValue());
}
}
- 제네릭 사용시 주의
위의 코드를 살펴보면, v1,v2,v3,v4객체 모두 참조변수와 생성자에 대입된 타입이 각각 같음을 확인할 수 있다.
Generic<String> v1 = new Generic<String>(); => 타입 일치
만약 이 타입이 일치하지 않는다면 에러가 남 Generic<String> v1 = new Generic<Integer>(); // error
2. Enum
: 상수를 가지고 생성되는 객체들을 한곳에 모아둔 하나의 묶음 (사용자가 지정한 이름으로 0부터 순차적 증가)
- 열거형 사용
enum 열거형이름 { 상수명1, 상수명2, ... }
- 예제
import java.util.Scanner;
class Enum {
// 0 1 2
public enum Item{ Start, Pause, Exit }
public static void main(String[] args) {
Item start = Item.Start; //열거형에 있는 상수명들은 하나의 클래스이다.
Item pause = Item.Pause;
Item exit = Item.Exit;
System.out.println("0: 게임시작 1:일시정지 2. 종료");
System.out.println("숫자를 입력해주세요(0~2) >> ");
Scanner s = new Scanner(System.in);
int n = s.nextInt();
if( n==start.ordinal()) { // ordinal() 열거형 상수 순서 반환
System.out.println("시작합니다");
} else if ( n==pause.ordinal()) {
System.out.println("일시정지합니다");
} else if ( n==exit.ordinal()) {
System.out.println("종료합니다");
} else {
System.out.println("입력오류입니다");
return;
}
switch(start) {
case START:
System.out.println("시작");
break;
case PAUSE:
System.out.println("일시정지");
break;
case EXIT:
System.out.println("종료");
break;
default :
System.out.println("잘못 입력");
break ;
}
}
}
}
- 열거형에 멤버(변수, 메서드)를 추가할 수도 있다.
아래 코드는 열거형에 String manufacturer을 추가하여 필드와 생성자를 함께 작성하였다.
enum NOTEBOOK {
MAC("Apple"), GRAM("Lg"), GALAXY("Samsung");
private String manufacturer;
NOTEBOOK(String manufacturer) {
System.out.println(name()+" 의 제조 : " +manufacturer);
this.manufacturer = manufacturer;
}
public String getmMnufacturer() {
return this.manufacturer;
}
}
public class EnumMain {
public static void main(String[] args) {
NOTEBOOK type = NOTEBOOK.MAC;
switch(type) {
case MAC:
System.out.println("mac "+ NOTEBOOK.MAC.getmMnufacturer());
break;
case GRAM:
System.out.println("gram"+ NOTEBOOK.GRAM.getmMnufacturer());
break;
case GALAXY :
System.out.println("galaxy"+ NOTEBOOK.GALAXY.getmMnufacturer());
break;
}
}
3. 애너테이션(Annotation)
: 프로그램 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형태로 포함시킨 것--> 소스코드에 영향을 미치지 않음!
: /** ~~~~ */ -> 주석안에 소스코드 들에 대한 설명
: @ -> 태그 _ 태그들을 이용해서 주석 안에 정보 저장
- 표준 에너테이션 :
① @Override : 컴파일러에게 오버라이딩하는 메서드임을 알림
② @Deprecated : 앞으로 사용하지 않을 것을 권장하는 대상(새 기능이 나와 기존버전것임을 알려 사용을 권장하지 않는다는 의미)
③ @SuppressWanings : 컴파일러에게 특정 메시지가 나타나지 않게 해줌(프로그래머가 경고임을 알고 적었기 때문에 미리 알려 경고뜨지않게함)
④ @SafeVarargs : 제네릭 타입의 가변인자에 사용
⑤ @Funtioanllnterface : 함수현 인터페이스(인터페이스에 메소드 딱 한개만)
⑥ @Native : native 메서드 앞에서 참조되는 상수
- 예시1.@Override :(자바의 정석 Ex12_9)
- 예시2.@SuppressWanings 와 @Deprecated (자바의 정석 Ex12_11)
참고 : 자바의 정석(남궁성)
'JAVA' 카테고리의 다른 글
JAVA_람다식(Rambda expression) (0) | 2021.08.10 |
---|---|
JAVA_Thread1 (0) | 2021.08.08 |
JAVA_컬렉션 프레임워크(Set, Map) (0) | 2021.08.06 |
JAVA_컬렉션 프레임워크(List) (0) | 2021.08.05 |
JAVA_날짜와 시간 (0) | 2021.08.04 |
댓글