728x90
  • 제네릭스(Generics)는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다.
  • ArrayList클래스의 선언에서 클래스 이름 옆의 "<>"안에 있는 E를 "타입 변수"라고 하며, 일반적으로는 Type의 첫 글자를 따서 T를 사용한다.
    타입변수로 반드시 T를 사용해야 하는 것은 아니며, T가 아닌 다른 것을 사용해도 된다.
    ArrayList의 경우 Element의 첫 글자를 따서 E를 사용한다
  • 타입 변수가 여러개인 경우 MAP(K, V)와 같이 쉼표로 구분한다.
    MAP 인터페이스의 경우 Key, Value의 첫 글자를 따서 타입변수로 사용한다.
  • "class Box {}" 와 같이 어떤 클래스가 선언되었다면 아래와 같이 용어들을 정리할 수 있다.
    • Box<T>: 제네릭 클래스, 'T의 박스' 또는 'T 박스'라고 읽는다.
    • T: 타입 변수 또는 타입 매개변수
    • Box: 원시 타입
  • 제네릭 클래스 객체를 생성할 때, 참조변수에 지정해 준 제네릭 타입과 생성자에 지정해 준 제네릭 타입은 일치해야 한다. 각 제네릭 타입이 상속관계에 있어도 일치해야 한다.
    단, 생성된 제네릭 클래스 객체에 데이터를 저장할 때는 자식관계의 객체를 저장할 수 있다.
  • 타입 문자를 이용하여 사용할 타입을 명시하여 한 종류만 저장가능하도록 제한할 수 있지만 그래도 여전히 모든 종류의 타입을 지정할 수 있다는 것에는 변함이 없다.
    이때 제네릭 타입에 'extends' 키워드를 사용하여 특정 타입의 자손들만 대입할 수 있게 추가 제한을 걸 수 있다.
  • 제네릭 클래스를 선언할 때 static멤버에 타입변수 T를 사용할 수 없다.
    또한 제네릭 타입의 배열을 생성하는 것도 허용되지 않는다. 배열을 생성하기 위해서는 new 연산자를 사용해야 하는데 해당 연산자는 컴파일 시점에서 타입 T가 뭔지 정확히 알아야 한다. 하지만 타입 문자는 정해진 타입이 없기 때문에 new 연산자를 사용할 수 없기 때문이다.
  • 열거형은 여러 상수를 선언해야 할 때 편리하게 사용할 수 있는 방법이다.
  • 클래스 내에서 상수를 선언할 때 기본 타입의 경우 값이 같으면 다른 변수일지라도 비교과정에서 값이 같아 true를 반환하게 될 것이다. 하지만 열거형은 값을 비교하기 전에 타입을 먼저 비교하기 때문에 값이 같더라도 타입이 다르면 컴파일 에러가 발생한다.
  • 열거형의 생성자는 제어자가 묵시적으로 private이기 때문에 외부에서 열거형 객체를 생성할 수 없다.
  • 자바에서 소스코드의 주석("/** ~ */")에 소스코드에 대한 정보를 작성하고 "javadoc.exe"라는 프로그램을 실행하면 주석을 HTML파일로 생성해 준다. 이때 주석에 "@"와 함께 미리 정의된 태그를 작성하면 "javadoc.exe"가 HTML 파일을 생성할 때 정보를 읽어서 파일을 작성하는 데 사용한다.
    이 기능을 응용하여 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 바로 "애너테이션"이다.
  • 애너테이션의 요소를 선언할 때는 아래와 같은 규칙이 있다.
    • 요소의 타입은 기본형, String, enum, 애너테이션, Class 만 허용한다.
    • () 안에 매개변수를 선언할 수 없다.
    • 예외를 선언할 수 없다.
    • 요소를 타입 매개변수로 정의할 수 없다.

+ Recent posts