[ITWILL : JAVA]기본클래스 이외에 자바 구성요소3 : annotation, generic
💡 핵심 요약 (TL;DR)
기본클래스 이외에 자바 구성요소3 : annotation, generic의 동작 원리를 이해하고 실제 프로젝트에 적용하기 위한 실무 가이드다. * 함수형인터페이스 중 익명클래스를 사용했다면 람다식사용가능을 적용할 수 있다.
ITWILL학원 : 18강 JAVA BY 윤미영강사
annotation(애노테이션)과 generic(제네릭)에 대해 정리해봤다.
1 annotation 애노테이션
- 사전적 의미는 주석이다
- 애노테이션은 개발자가 읽기 위한 주석이 아니라 컴파일러등에게 전달하는 일종의 메타데이터이다.
- 메타데이터란 : 다른 데이터를 설명해주는 데이터로 속성 정보라고도 한다.
- 함수형인터페이스란 : 인터페이스 중에서 한 개의 abstract메서드를 가진 인터페이스.
- 함수형인터페이스 중 익명클래스를 사용했다면 람다식사용가능
| 애노테이션 | 설명 |
|---|---|
| @Override | 컴파일러에게 재정의된 메서드라고 알려줌 |
| @Deprecated | 앞으로 없어질 수 있으니 사용을 자제하라고 알려줌 ex)보안적인 이슈가 발생했거나 더 좋은 성능의 메서드로 대체를 권장할 때 사용함 |
| @SupressWarnings(“all/unused”) | 컴파일러에게 특정 경고 메시지를 무시하라고 알려줌 ex)경고내용에 이미 알고 있으니 컴파일러가 보여주지 않아도 될때 사용함 |
| @Functionallnterface | 함수형 인터페이스라는 것을 알려줌 |
2 Generic
- 제네릭의 사전적 의미 : 일반화
- 장점 : 컴파일 시점에서 사용할 수 있는 객체타입을 체크함 -> 프로그램의 안정성이 획기적으로 향상되고 코드도 줄어듬.
- 타입 파라미터를 사용하면 클래스에 넘겨줄 수 있는 데이터타입을 제한할 수 있다.
1 | // 꺽쇠 전체<T>를 제네릭이라고 부른다. |
- 사용처 : 데이터 저장 구조
- 사용 주의점
- 타입 파라미터는 인스턴스변수임 -> static멤버에는 타입파라미터 적용못함.
- 타입 파라미터를 이용해서 객체생성 못함 why? new 연산자는 컴파일 타입에 정확한 타입을 알아야하는데 클래스 내부에서 파라미터만 보아선 타입을 알 길이 없기때문에.
- 타입 파라미터에서 사용가능한 메서드는 Object에 선언된 것으로 한정한다 why? 아직 타입이 정해지지 않은 상태에서 누구의 메서드를 가져다 쓸 수 없기때문에 최상위클래스인 Object의 메서드들만 사용가능.
2-1 사용 가능한 파라미터 타입의 제한
- 가변인자 : 파라미터의 갯수를 모를때 가변인자를 사용할 수 있다
- 가변인자 파라미터 타입의 제한 제네릭 예시 코드
1 | class NumberBox<T extends Number>{ |
메서드 오버로딩과 가변인자의 차이점은 무엇일까?
- 메서드 오버로딩 : 다양한 데이터 타입 받을 수 있음
- 가변인자 : 데이터타입 한 종류만 받을 수 있음
메서드 오버로딩 예시 코드
1 | OverloadConstructorPerson(String name, int age, boolean isHungry){ |
2-2 메서드에 선언된 제네릭
1 | public class TypeParam<T> { |
만약 객체생성시 TypeParam<String> tpmt = new TypeParam<>()하고싶다면 어떻게하면될까?
생성자 오버로딩을 하면된다.
1 | //생성자오버로딩 |
에러가 뜨지않고 객체생성은 잘되지만 멤버변수의 데이터타입이 제네릭이기때문에 멤버변수에 값을 넣을수도없고 파라미터도 없기때문에 현 코드에서는 쓸수있는 방법이 없다.
2-3 와일드카드의 사용
- 제네릭 메서드에서는 사용되는 타입 파라미터에 제한을 두기 위해 와일드카드로 ‘?’를 사용
- 단독사용 가능
- extends나 super와 함께 사용가능.
| 기호 | 설명 |
|---|---|
| <?> | 타입의 제한이 없으며 <? extends Object>와 동일 |
| <? extends T> | 와일드카드의 상한을 제한. 이 타입 파라미터에는 T와 T를 상속받은 자손만 대입할 수 있다. |
| <? super T> | 와일드카드의 하한을 제한. 이 타입 파라미터에는 T와 그 조상타입만 대입할 수 있다. |
- 예시 코드
- getClass() : 객체가 속하는 클래스의 정보를 알아내는 메소드이다.
- getName() : 클래스의 이름을 리턴하는 메소드이다.
1 | class Person{}; |
[ITWILL : JAVA]기본클래스 이외에 자바 구성요소3 : annotation, generic