collection을 배우기 전에 generic 에 대해서 알아보자.
Apple 클래스 만들자.
사과 클래스에 필드는 없고, toString 메서드만 오버라이딩 하였다.
위에서 만든 Apple 클래스로 만들어진 인스턴스를 담는 AppleBasket 이라는 클래스를 만들었다.
사과바구니 클래스는
필드로 사과 객체를 갖는다.
메서드는 게터와 세터가 있다.
이번에는 바나나 클래스를 만들었다.
사과 클래스 처럼 필드는 없고, 투스트링 메서드만 오버라이딩 하였다.
이버에는 바나나를 담을수 있는 BananaBasket 클래스를 만들었다.
필드로 바나나 객체를 갖는다.
메서드는 게터와 세터
메인에서 실행해 보았다.
사과바구니 클래스로 생성된 ab는 AppleBasket 타입의 인스턴스 이다.
ab는 필드로 Apple 객체만 있기 때문에 바나나 객체를 담을 수 없다.
이런식으로 사과 바나나 와 같은 과일 클래스들을 만들어 줄 때마다 바구니 클래스를 추가시켜줘야한다.
# 각 과일에 맞는 바구니 클래스를 매번 만들어주는 것은 매우 번거롭다.
# 바스켓 클래스를 하나만 만들어 놓고 원할때 마다 원하는 과일을 담을 수 있는 바구니를 복제해서 만들어주는
회사와 계약 하여 새로운 과일이 생기면 바구니회사에 의뢰 한다. 제네릭을 이런식으로 쉽게 생각해보자.
== 제네릭 활용 하기==
# 제네릭 클래스는 객체가 생성되기 전까지 타입을 알수 없다. [ 객체가 생성되면 타입이 결정된다. ]
# 필드명 선언은 추상적으로 한다.
ex) 사과나 키위 등의 구체적인 이름이 아닌 과일로 선언
ex) 개나 고양이 등의 구체적인 아름이 아닌 동물로 선언
#필드 타입은 F나 E 처럼 혼동되지 않도록 제네릭인 것을 알수 있도록 작성한다.
# 클래스명 앞에 타입을 써준다. <F>
=== 우리는 인터페이스를 통해 한 바구니에 많은 과일을 담을수 있는 것을 배웠다.
하지만 여기서 제네릭을 통해 하고 싶은 것은
각 객체인 사과나 바나나가 한바구니에 섞이지 않고 담기게끔 하는 것이다.
Fruit 인터페이스를 생성해보았다. [한 바구니에 다양한 과일이 담기게끔 하는 실습]
사과 클래스에 과일 인터페이스 명시
바나나에도 인터페이스 과일 명시
Basket 클래스에 게터와 세터를 만들어준다.
타입은 모두 F 이다. (아직 정해지지 않았다.)
바나나와 사과에 Fruit 인터페이스 명시하여 객체에 다형성에 의해
Basket 클래스로 생성된 basket의 필드 fruit는 바나나와 사과를 모두 담을 수 있다.
-
- 제네릭 활용하기
Basket<F> 클래스의 타입은 F로 구체화 시키지 않았었는데
클래스 생성할때 Apple 타입으로 구체화 시켰다.
그 후 Apple 타입으로 만든 Basket에는 사과만 담을수 있게 된다.
제네릭을 사용하여 한가지 과일만 담을수 있는 바구니를 만들수 있게 되었다.
포도클래스를 만들어보았다.
바스켓을 만들때 <타입> 을 Grape로 하면 포도만 담을수 있는 바구니 객체가 만들어진다.
제네릭은 객체 생성전까지 타입을 모른다.
객체가 생성될때 타입이 결정되는데 이는 타입의 안정성을 제공한다.
제네릭<타입> 에 과일이 아닌 객체가 타입이 되는 것을 막는 방법.
장난감 클래스를 만들어 보았다.
바구니가 장난감을 담을수 있게 되었다.
제네릭의 <F에 상속으로 타입 제한을 걸어준다.>
바구니에 F 타입에 과일을 상속 시켰다.
장난감은 Fruit 클래스를 상속받지 않았다.
== 제네릭을 사용하여 단방향 리스트 알고리즘의 저장 데이터타입에 제한을 풀어 주려고 한다.
'JAVA' 카테고리의 다른 글
java_컬렉션_ 배열과 연결리스트 성능 비교_22.06.16(day18) (0) | 2022.06.16 |
---|---|
java_컬렉션(List)_22.06.16(day18) (0) | 2022.06.16 |
java_API_22.06.15(day17) (0) | 2022.06.16 |
java_API_22.06.15(day17) (0) | 2022.06.16 |
java_API_22.06.15(day17) (0) | 2022.06.15 |