Java 프로그래밍기초 230223 #13 지네릭스/열거형/애너테이션

김춘복·2023년 2월 23일
0

Java 공부

목록 보기
16/20

지네릭스

지네릭스(Generics)

: 컴파일시 타입을 체크해주는 기능.
다양한 타입의 객체를 다루는 메서드, 컬렉션에 들어가는 자료형을 제한하는 기능.

ArrayList<TV> tvList = new ArrayList<TV>();
tvList.add(new Audio()); // 컴파일 에러. 
//ArrayList에 <TV>타입만 들어오게 지정했기때문에 컴파일러가 타입을 체크해 막음.

객체의 타입 안정성을 높이고 타입체크와 형변환을 생략해 코드를 간결하게 해준다.
여러 타입이 들어간 ArrayList에서 지네릭스가 없다면 컴파일은 되는데 런타임과정에서 에러가 나는 경우가 생기는데 지네릭스 덕분에 컴파일 단계에서 방지할 수 있다.

  • 선언 : 클래스를 작성할 때 Object 타입 대신 T와 같은 타입변수를 사용.
    참조변수, 생성자에 T 대신 실제타입을 지정하면 형변환 생략가능.

  • 용어 정리: class Box<T> {}

    Box<T> : 지네릭 클래스. T의 box 혹은 T box로 읽는다.
    T : 타입변수, 타입 매개변수, 지네릭. T는 임의의 문자로 어떤걸 넣어도 된다.
    Box : 원시 타입(raw type)

  • Java 1.5이후 지네릭스가 도입되고 나서 ArrayList같은 클래스 안에 Object 타입이 있는 것들은 일반 클래스에서 지네릭 클래스로 바꼈다. 보통 ArrayList<Object>로 쓴다.

  • 다형성 : 자료타입으로 부모클래스를 선언해도 자손클래스의 객체를 넣을 수 있다.
    지네릭클래스를 생성할 때 참조변수에 지정된 타입과 생성자에 지정된 타입은 일치해야한다.

List<Tv> list = new ArrayList<Tv>();		// Ok. 지네릭타입 일치
List<Product> list2 = new ArrayList<Tv>();	// Error! 지네릭타입 불일치
  • 제약 : 지네릭클래스의 객체를 생성할 때 객체별로 다른 타입을 지정하는 것은 적절하다.
    하지만 모든 객체에 동일하게 동작해야하는 static멤버에는 타입변수<T>를 사용할 수 없다.
    T가 인스턴스 변수로 간주되기 때문이다. 그리고 지네릭 타입의 배열 T[]는 생성할 수 없다.

  • 제한된 지네릭 클래스 : <T extends Fruit>처럼 사용하면 Fruit타입의 자손만 타입으로 지정 가능.

  • 지네릭타입과 원시(primitive) 타입의 형변환은 불가능.

와일드카드

  • 지네릭타입에 와일드카드 ? 를 쓰면 여러타입을 대입가능. 다형성 적용.

    <? extends T> : 와일드카드의 상한 제한. T와 그 자손들만 가능
    <? super T> : 와일드카드의 하한 제한. T와 그 조상들만 가능.
    <?> : 제한없음. 모든 타입이 가능.

ex) 지네릭 타입이 <? extends Product>면 Product와 Product의 모든 자손이 OK

지네릭 메서드

: 메서드의 선언부에 지네릭 타입이 선언된 메서드. 반환타입 바로 앞에 위치.

  • ex) static <T> void sort(List<T> list, Comparator<? super T> c){...}
    static멤버에는 타입 매개변수를 사용할 수 없지만 위처럼 메서드에 지네릭 타입을 선언하고 사용하는 것은 가능하다.

  • 메서드에 선언된 지네릭타입은 지역변수와 비슷하다. 이 타입 매개변수는 메서드 내에서만 지역적으로 사용될 것이므로 메서드가 static인건 상관이 없다.
    지네릭 메서드를 호출할때는 메서드 명앞에 <타입>을 붙여야 한다.



열거형

  • 열거형(enum) : 여러 상수를 선언해야 할 때 편리하게 선언할 수 있는 방법.
    enum 열거형이름 {상수명1, 상수명2, ...}

  • 열거형이름.상수명으로 열거형에 정의된 상수를 사용 가능하다. (static 변수와 비슷)

  • 열거형 상수간 비교에는 .equals()가 아니라 ==로 비교 가능하다.
    부등호는 안되고 .compareTo()를 사용해야 한다.(같으면0, 왼쪽이 크면 양수 / 오른쪽이 크면 음수)

  • .ordinal() 을 사용하면 열거형 상수가 정의된 순서(0부터 시작)를 정수로 반환한다.



애너테이션(어노테이션)

: 앞에 @가 달림. 주석처럼 프로그램에 영향을 미치지 않으면서, 유용한 정보를 제공하는 것.

profile
Backend Dev / Data Engineer

0개의 댓글