Menu
Coddy logo textTech

요약 - 제네릭 컨테이너

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

challenge icon

챌린지

쉬움

제네릭에 대해 배운 모든 것을 하나로 모으는 다재다능한 저장 시스템을 구축해 봅시다! 모든 유형의 요소를 저장, 검색 및 처리할 수 있는 Container 클래스와 와일드카드의 실제 활용 사례를 보여주는 유틸리티 메서드를 만들 것입니다.

코드는 세 개의 파일로 구성됩니다:

  • Container.java: 항목 컬렉션을 관리하는 제네릭 클래스 Container<T>를 만듭니다. 컨테이너는 내부적으로 요소를 저장하기 위해 ArrayList<T>를 사용해야 합니다. 요소를 추가하는 add(T item), 특정 위치의 요소를 검색하는 get(int index), 항목의 개수를 반환하는 size(), 컨테이너가 비어 있는지 확인하는 isEmpty() 메서드를 포함하세요. 또한 내부 리스트를 반환하는 getAll() 메서드도 추가하세요.
  • ContainerUtils.java: 컨테이너와 함께 작동하는 정적 제네릭 메서드를 포함하는 유틸리티 클래스를 만듭니다:

    printAll(Container<?> container) - 비한정 와일드카드(unbounded wildcard)를 사용하여 모든 컨테이너의 모든 요소를 한 줄에 하나씩 출력합니다.

    countItems(Container<? extends Number> container) - 상한 제한 와일드카드(upper bounded wildcard)를 사용하여 컨테이너에 있는 모든 숫자 값의 합계를 계산하고 결과를 double로 반환합니다.

    addDefaults(Container<? super Integer> container) - 하한 제한 와일드카드(lower bounded wildcard)를 사용하여 정수를 담을 수 있는 모든 컨테이너에 정수 1, 2, 3을 추가합니다.

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - 컨테이너의 마지막 요소를 반환하거나, 컨테이너가 비어 있는 경우 기본값을 반환하는 제네릭 메서드입니다.

  • Main.java: 제네릭 컨테이너 시스템을 하나로 합칩니다! 단어(String), 정수(int), 실수(double)의 세 가지 입력을 받게 됩니다.

    먼저, Container<String>을 생성하고 단어를 두 번 추가합니다. String container:를 출력한 다음 printAll을 사용하여 내용을 표시합니다.

    다음으로, Container<Double>을 생성하고 실수 값을 추가합니다. 빈 줄을 출력한 다음, countItems를 사용하여 Number sum: [sum]을 출력합니다.

    그런 다음 Container<Number>를 생성하고 여기에 addDefaults를 호출합니다. 빈 줄을 출력한 다음, After adding defaults:를 출력하고 printAll을 사용하여 내용을 표시합니다.

    마지막으로, 빈 Container<Integer>를 생성하고 입력받은 정수를 기본값으로 하여 getLastOrDefault를 사용합니다. 빈 줄을 출력한 다음, Last or default: [result]를 출력합니다.

단어(String), 정수(int), 실수(double) 순서대로 세 개의 입력을 받습니다.

이 챌린지는 제네릭 클래스, 제네릭 메서드, 제한된 타입 파라미터 및 세 가지 와일드카드 유형을 모두 결합합니다. 각 부분이 어떻게 다른 목적을 수행하는지 주목하세요. 제네릭 클래스는 타입 안전한 저장소를 제공하고, 제한된 와일드카드는 유연한 읽기 및 쓰기를 가능하게 하며, 제네릭 메서드는 다양한 컨테이너 유형에서 재사용 가능한 작업을 제공합니다!

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: Container<String>을 생성하고 word를 두 번 추가
        // "String container:"를 출력한 다음 ContainerUtils.printAll()을 사용
        
        // TODO: Container<Double>을 생성하고 doubleValue를 추가
        // 빈 줄을 출력한 다음, ContainerUtils.countItems()를 사용하여 "Number sum: [sum]"을 출력
        
        // TODO: Container<Number>를 생성하고 여기에 ContainerUtils.addDefaults()를 호출
        // 빈 줄을 출력한 다음, "After adding defaults:"를 출력하고 ContainerUtils.printAll()을 사용
        
        // TODO: 빈 Container<Integer> 생성
        // intValue를 기본값으로 하여 ContainerUtils.getLastOrDefault()를 사용
        // 빈 줄을 출력한 다음, "Last or default: [result]"를 출력
    }
}

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