제네릭 클래스
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);챌린지
쉬움제네릭 class의 강력한 기능을 보여 주는 선물 레지스트리 시스템을 만들어 봅시다. 모든 유형의 선물 item을 저장할 수 있는 유연한 저장 시스템과, 여러 type parameters를 사용하여 선물 이름과 세부 정보를 연결하는 레지스트리를 만들게 됩니다.
코드를 세 개의 파일로 구성합니다.
GiftBox.java: 모든 유형의 선물을 포장할 수 있는 제네릭 class를 Create하세요.GiftBox<T>에는T유형의 private fielditem과,false로 시작하는 private fieldwrapped(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 fieldrecipient와V유형의 private fieldgift가 있어야 합니다. 두 값을 모두 accepts하는 constructor, getter methodsgetRecipient()및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가 String 및 Integer 유형 모두에서 원활하게 작동하는 것을 확인하세요. 이것이 바로 제네릭의 장점입니다! 또한 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<String> 생성
// TODO: wrap() 메서드를 사용하여 포장
// TODO: getStatus()를 사용하여 상태 출력
// TODO: 선물 가치가 담긴 GiftBox<Integer> 생성
// TODO: 이것은 포장하지 않음 - 상태 출력 (포장되지 않음으로 표시되어야 함)
// TODO: 수신자와 선물 설명을 짝지은 Registry<String, String> 생성
// TODO: getEntry()를 사용하여 레지스트리 항목 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러