온라인 강의/김영한의 실전 자바 - 중급 2편

[섹션1] 제네릭 1편

코드몬스터 2024. 8. 3. 09:50
728x90

 

Q. 클래스에서 Integer, boolean, String 등 여러 타입을 한 번에 처리를 어떻게 할까?

 

1. 여러 타입 처리 방법

1) 각 타입을 처리하는 클래스 만들기

장점

  • 컴파일로 정확하게 타입을 알려준다.(타입 안전성O)

단점

  • 각 타입마다 클래스를 만들어야 한다.(코드 재사용X)
// Integer 담당 클래스
IntegerBox integerBox = new IntegerBox();
integerBox.set(10);
Integer integer = integerBox.get();
System.out.println("integer = " + integer);

// String 담당 클래스
StringBox stringBox = new StringBox();
stringBox.set("hello");
String str = stringBox.get();
System.out.println("str = " + str);

2) 클래스의 최상위 부모 Object를 사용

장점

  • 다형성을 활용하여 코드의 중복을 제거하고, 기존 코드를 재사용할 수 있다. (코드 재사용O)
    => 입력 값이 어떤 타입이든 다 받아 줄 수 있다.

단점

  • Object 클래스에서 값을 꺼내면 타입이 Object이다.
  • 입력 값은 타입 상관없이 받아주지만, return 하는 타입을 제대로 확인해야한다.(타입 안전성X)
    => String을 Integer로 캐스팅할 수 없기 때문에 캐스팅 예외가 발생할 수 있다.
ObjectBox integerBox = new ObjectBox();
integerBox.set(10);
Object object = integerBox.get();
Integer integer = (Integer) integerBox.get();
System.out.println("integer = " + integer);

 


2. 제네릭 적용

1) 제네릭

  • 기호(<>)를 다이아몬드라고 부르며, 해당 기호를 사용한 클래스를 제네릭 클래스라고 한다.
  • 제네릭 클래스를 사용할 때는 미리 타입을 결정하지 않는다.
  • 대신 클래스명 오른쪽에 <T>와 같이 선언하며, T타입 매개변수  라고 한다.
  • 생성 시점에 T의 타입을 결정된다.(타입추론)
public class GenericBox<T> {
    private T value;
    
    public set(T value) {
        this.value = value;
    }

    public get() {
        return value;
    }
}
GenericBox<Integer> integerBox = new GenericBox<>();

2) 제네릭 용어와 관례

제네릭(Generic)

  • 일반적인, 범용적인이라는 영어 단어 뜻
    • 특정 타입에 속한 것이 아니라 일반적으로, 범용적으로 사용할 수 있다는 뜻이다.
  • 제네릭 핵심은 사용할 타입을 미리 결정하지 않는다.
  • 클래스 내부에서 사용하는 타입 클래스를 결정하는 것이 아니라, 실제 사용하는 생성 시점에 타입을 결정.

 

메서드의 매개변수와 인자

  • 매개변수(Parameter): String param
  • 인자, 인수(Argument): arg
void mehtod(String param) // 매개변수

void main() {
    String arg = "hello";
    method(arg) // 인자 전달
}

 

제네릭의 타입 매개변수와 타입 인자

  • 메서드는 매개변수인자를 전달해서 사용할 값을 결정한다.
  • 제네릭 클래스는 타입 매개변수타입 인자를 전달해서 사용할 타입을 결정한다.
    • 타입 매개변수: GenericBox<T> 에서 T
    • 타입 인자: GenericBox<Integer>에서 Integer 
void method(String parameter) {

}

void main() {
    String argument = "test";
    method(argument)
}

 

 제네릭 명명 관례

  • 일반적으로 대문자를 사용하고 용도에 맞는 단어의 첫 글자를 사용
  • 키워드(관례이므로 자신한테 맞게 수정해서 사용해도 된다)
    • E - Element
    • K - Key
    • N - Number
    • T - Type
    • V - Value
    • S, U, V etc - 2nd, 3rd, 4th types

3) 제네릭 활용 예제