1. 제네릭이란?
· 최상위 클래스인 Object를 사용함으로써 모든 객체들을 받을 수 있기 때문에 컴파일 오류가 직접적(빨간줄)로 보이지 않고,
실시간 에러(출력에서)를 발생시킨다.
· 가장 큰 문제는 실시간 오류가 발생하지않고, 전혀 다른 값을 출력하는 경우인데 이와 같은 문제점들을 보완하기 위해
제네릭를 사용한다.
· 제네릭 타입을 이용함으로써 잘못된 타입이 사용되어 문제 발생 시 사전에 컴파일 과정에서 제거가 가능하고,
객체의 타입을 컴파일 시에 체크하여 객체 타입의 안정성이 증가하고 형변환도 감소한다.
· 제네릭 타입은 < > 으로 표현하고, 그 사이에는 타입 파라미터를 가진다.
2. 제네릭의 기본 문법
· Object ob는 어떠한 객체든 받아들이며, Object 부분을 <> 타입으로 변경하여 정의한다.
· ex) Box<T> box = new Box<T>(); → Box<T> box = new Box<>(); 이와 같이 객체 생성할 때 뒤에 오는 T는 생략가능
3. 제네릭 사용하는 이유?
· 2번의 Box<T>를 기반으로 Apple class 작성
· Box<Apple>에서 Apple은 타입인자, Box<Apple> 전체는 매개변수화 타입이라 정의한다.
· 제네릭을 사용하지 않은 상태라면 아래와 같이 "Apple" 을 set하는 경우 오류가 발생되지 않지만,
제네릭을 기반으로 작성하면 다형성이 적용되지 않기 때문에 오류가 발생되며, 따로 형변환을 요구하지 않는다.
4. 제네릭 메소드에 대하여 설명하시오.
· 제네릭은 클래스 전부가 아닌 함수에도 사용가능하며 이를 제네릭 메소드라 명칭한다.
· ex) public static <T> Box<T> makeBox(T o), 매개변수 타입과 리턴 타입으로 타입파라미터를 갖는 메소드
· 매개변수 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드이며, 메소드 리턴 타입 앞에 명시해준다.
5. 제네릭 클래스의 타입 인자 제한하는 방법과 효과는?
· 상속 및 구현 관계를 이용하여 타입을 제한한다. (extends 키워드 사용)
· 인스턴스 생성 시 타입 인자로 상위클래스인 Number 혹은 이를 상속하는 class만 접근 가능하다.
· 타입 인자를 제한하기 전(Object)에는 어떤 타입이든 받아들이지만, 타입을 제한함으로써 사전에 오류를 방지한다.
· 타입 인자를 인터페이스로도 제한이 가능하며, 상속과 인터페이스 동시 제한도 가능하다.
6. 제네릭 클래스와 상속
· 아래와 같이 타겟 타입이 다르다면 상속이 불가능하다.
7. 와일드카드<?>란?
· 아래의 예시와 같이 타입 파라미터를 대치하는 타입으로, <>안에 Integer, String을 인자로 전달 가능하다.
※상한제한: 전달되는 인스턴스의 T는 Number 또는 이를 상속하는 자식클래스
※하한제한: 하위타입이나 하위타입의 상위타입 접근 가능, 즉 Integer, Number, Object로 제한
※메소드 오버로딩
· 아래 구문은 메소드 오버로딩이 인정되지 않는다. (why? <...> 내부 내용은 소실되므로 오버로딩x )
· 아래 구문은 인자가 다르므로 메소드 오버로딩이 인정된다.
8. 아래가 오류가 발생하는 이유를 설명하시오.
· super Toy는 Plastic인데, Toy의 상위클래스이므로, 자식 = 부모는 성립되지 않아 넣는 것은 가능하지만,
꺼내는 것은 불가능하다. (다형성이 적용되지 않음)
'bitcamp > JAVA' 카테고리의 다른 글
컬렉션 프레임워크 (0) | 2021.02.05 |
---|---|
제네릭_연습문제 (0) | 2021.01.26 |
자바의 기본 class_연습문제 (0) | 2021.01.25 |
자바의 기본 class (0) | 2021.01.25 |
Object 클래스_연습문제 (0) | 2021.01.25 |