Menu
Coddy logo textTech

제네릭 클래스

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 54번째.

이제 제네릭이 왜 유용한지 이해했으니, 자신만의 제네릭 클래스를 만들어 봅시다. 제네릭 클래스는 클래스 이름 뒤의 꺾쇠괄호 안에 하나 이상의 타입 매개변수를 선언하며, 이렇게 선언된 타입 매개변수는 클래스 전체에서 사용할 수 있습니다.

class Box<T> {
    private T content;
    
    public void set(T content) {
        this.content = content;
    }
    
    public T get() {
        return content;
    }
}

T는 타입 매개변수입니다. 인스턴스를 생성할 때 실제 타입으로 대체되는 자리 표시자입니다. 어떤 이름이든 사용할 수 있지만, 일반적으로 대문자 한 글자를 사용합니다. Type에는 T, Element에는 E, Key에는 K, Value에는 V를 사용합니다.

Generic 클래스를 인스턴스화할 때 꺾쇠괄호 안에 실제 타입을 지정합니다:

Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get();  // 캐스팅이 필요 없음

Box<Integer> intBox = new Box<>();
intBox.set(42);
Integer num = intBox.get();

오른쪽에 있는 <>(다이아몬드 연산자)에 주목하세요. Java는 선언에서 타입을 추론합니다. 둘 이상의 타입으로 작업해야 하는 클래스에는 여러 타입 매개변수를 사용할 수도 있습니다.

class Pair<K, V> {
    private K key;
    private V value;
    
    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }
    
    public K getKey() { return key; }
    public V getValue() { return value; }
}

Pair<String, Integer> pair = new Pair<>("age", 25);
challenge icon

챌린지

쉬움

제네릭 class의 강력한 기능을 보여 주는 선물 레지스트리 시스템을 만들어 봅시다. 모든 유형의 선물 item을 저장할 수 있는 유연한 저장 시스템과, 여러 type parameters를 사용하여 선물 이름과 세부 정보를 연결하는 레지스트리를 만들게 됩니다.

코드를 세 개의 파일로 구성합니다.

  • GiftBox.java: 모든 유형의 선물을 포장할 수 있는 제네릭 class를 Create하세요. GiftBox<T>에는 T 유형의 private field item과, false로 시작하는 private field wrapped(boolean)가 있어야 합니다. item을 accepts하는 constructor, item을 반환하는 getItem() method, wrapped를 true로 설정하는 wrap() method, wrapped 상태를 반환하는 isWrapped() method를 포함하세요. wrapped 상태에 depending하여 [item] (wrapped) 또는 [item] (unwrapped)를 반환하는 getStatus() method를 추가하세요.
  • Registry.java: recipient와 해당 선물을 pairs하는 두 개의 type parameters를 가진 제네릭 class를 Create하세요. Registry<K, V>에는 K 유형의 private field recipientV 유형의 private field gift가 있어야 합니다. 두 값을 모두 accepts하는 constructor, getter methods getRecipient()getGift(), 그리고 다음을 반환하는 getEntry() method를 포함하세요: [recipient] -> [gift]
  • Main.java: 선물 레지스트리를 작동시키세요! 세 개의 inputs를 받습니다: recipient 이름(String), 선물 description(String), 선물 값(달러를 나타내는 integer)입니다.

    먼저 선물 description을 containing하는 GiftBox<String>을 만드세요. wrap() method를 사용하여 포장한 다음 상태를 Print하세요.

    다음으로 선물 값(선물 카드 금액을 나타냄)을 containing하는 GiftBox<Integer>를 만드세요. 이 Box는 포장하지 말고, 포장되지 않은 상태임을 보여 주도록 상태를 Print하세요.

    마지막으로 recipient 이름과 선물 description을 pairing하는 Registry<String, String>을 만들고 레지스트리 entry를 Print하세요.

다음 순서로 세 개의 inputs를 받습니다: recipient 이름, 선물 description, 선물 값(integer).

동일한 GiftBox class가 StringInteger 유형 모두에서 원활하게 작동하는 것을 확인하세요. 이것이 바로 제네릭의 장점입니다! 또한 Registry class는 여러 type parameters를 사용하면 임의의 두 유형 사이에 유연한 pairs를 만들 수 있음을 보여 줍니다.

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String recipientName = scanner.nextLine();
        String giftDescription = scanner.nextLine();
        int giftValue = scanner.nextInt();
        
        // TODO: 선물 설명이 담긴 GiftBox&lt;String&gt; 생성
        // TODO: wrap() 메서드를 사용하여 포장
        // TODO: getStatus()를 사용하여 상태 출력
        
        // TODO: 선물 가치가 담긴 GiftBox&lt;Integer&gt; 생성
        // TODO: 이것은 포장하지 않음 - 상태 출력 (포장되지 않음으로 표시되어야 함)
        
        // TODO: 수신자와 선물 설명을 짝지은 Registry&lt;String, String&gt; 생성
        // TODO: getEntry()를 사용하여 레지스트리 항목 출력
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Java 컴파일러