지네릭스의 전반적 개념(2)

2022. 5. 11. 11:33·자바/지네릭스

5. 제한된 지네릭 클래스

- 타입 문자로 사용할 타입을 명시하면 한 종류의 타입만 저장할 수 있도록 제한할 수는 있지만,

그래도 여전히 아래의 코드처럼 모든 종류의 타입을 저장할 수 있다는 것에는 변함이 없다.

FruitBox<Toy> fruitBox = new FruitBox<Toy>();
fruitBox.add(new Toy());
// 과일상자에 장난감을 담을 수 있다?

 

( 이러한 것을 해결하기 위해서는 class 이름 뒤에 아래와 같이 지네릭 타입을 주면 된다. )

class FruitBox<T extends Fruit>{	// Fruit의 자손만 타입으로 지정가능
     ArrayList<T> list = new ArrayList<T>();
     ...
}

public class Exercise002{
      public static void main(String[] args){
              FruitBox<Apple> appleBox = new FruitBox<Apple>()
              // 컴파일 정상
              
              FruitBox<Toy> toyBox = new FruitBox<Toy>();
              // 에러 발생
      }
}

 

 

 

 

5-1. 제한된 지네릭 클래스를 이해하기 위한 예제(1)

: 클래스 이름 뒤에 지네릭을 지정하여 구현한 예제이다.

 

import java.util.ArrayList;

public class Exercise002 {
	public static void main(String[] args){
		FruitBox2<Fruit2> FruitBox2 = new FruitBox2<Fruit2>();
		FruitBox2<Apple2> AppleBox2 = new FruitBox2<Apple2>();
		FruitBox2<Grape2> grapeBox2 = new FruitBox2<Grape2>();
//		FruitBox2<Grape> grapeBox2 = new Fruit2Box2<Apple2>(); // 에러. 타입 불일치
//		FruitBox2<Toy>   toyBox2    = new Fruit2Box2<Toy>();   // 에러.

		FruitBox2.add(new Fruit2());
		FruitBox2.add(new Apple2());
		FruitBox2.add(new Grape2());
		AppleBox2.add(new Apple2());
//		AppleBox2.add(new Grape());  // 에러. Grape는 Apple2의 자손이 아님
		grapeBox2.add(new Grape2());

		System.out.println("Fruit2Box2-"+FruitBox2);
		System.out.println("Apple2Box2-"+AppleBox2);
		System.out.println("grapeBox2-"+grapeBox2);
	}
}
interface Eatable {}

class Fruit2 implements Eatable {
	public String toString() { return "Fruit2";}
}

class Apple2 extends Fruit2 { public String toString() { return "Apple2";}}
class Grape2 extends Fruit2 { public String toString() { return "Grape";}}
class Toy2		          { public String toString() { return "Toy"  ;}}

class FruitBox2<T extends Fruit2 & Eatable> extends Box2<T> {}

class Box2<T> {
	ArrayList<T> list = new ArrayList<T>();
	void add(T item)  { list.add(item);      }
	T get(int i)      { return list.get(i); }
	int size()        { return list.size();  }
	public String toString() { return list.toString();}
}

 

저작자표시 (새창열림)

'자바 > 지네릭스' 카테고리의 다른 글

지네릭 타입의 형변환과 제거  (0) 2022.05.16
지네릭 메서드  (0) 2022.05.13
와일드 카드  (0) 2022.05.12
지네릭스의 전반적 개념(1)  (0) 2022.05.11
'자바/지네릭스' 카테고리의 다른 글
  • 지네릭 타입의 형변환과 제거
  • 지네릭 메서드
  • 와일드 카드
  • 지네릭스의 전반적 개념(1)
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      file
      코딩테스트
      java.lang패키지
      선택 정렬
      serializable
      Arrays
      안드로이드 스튜디오
      TCP 소켓 프로그래밍
      안정 정렬
      불안정 정렬
      람다식
      ServerSocket
      알고스팟
      제자리 정렬
      문자 기반 스트림
      자바 개념
      snail
      코드트리
      InputStream
      다형성
      스트림
      map()
      코딩트리조별과제
      java.time 패키지
      Collections Framework
      outputstream
      소켓 프로그래밍
      중간연산
      유용한 클래스
      역직렬화
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    지네릭스의 전반적 개념(2)
    상단으로

    티스토리툴바