본문 바로가기
JAVA

JAVA_제네릭, 열거형, 애너테이션

by haheaven 2021. 8. 7.

 

 

 

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

댓글