Java

제네릭 (Generic)

공부처음하는사람 2024. 7. 10. 23:40


제네릭이란 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타이븡로 대체시키는 기능

 

package ch13.sec01;

public class Box<T> {
    public T content;
}

 

Box 클래스에서 결정되지 않은 content 타입을  T라는 타입 파라미터로 정의했다.

 

<T>는 타입 파라미터를 뜻하는 기호로, 타입이 필요한 자리에 T를 사용할 수 있음을 알려준다.

여기서 Box 클래스는 T를 content 필드의 타입으로 사용했다. 즉 Box 클래스는 T가 무엇인지 모르지만,

Box 객체가 생성될 시점에 다른 타입으로 대체된다는걸 알고있다.

 

package ch13.sec01;

public class GenericEx {
    public static void main(String[] args) {
        //Box <String> box1 = new Box<String>();
        Box<String> box1 = new Box<>();
        box1.content = "안녕";

        String str = box1.content;
        System.out.println(str);

        // Box <Integer>
        Box<Integer> box2 = new Box<>();
        box2.content = 50;
        int value = box2.content;
        System.out.println(value);
    }
}

 

타입 파라미터에서 쓰이는 T는 단지 이름일 뿐이기 때문에 어떤 알파벳을 사용해도 상관 없다.

주의할 점은 타입 파라미터를 대체하는 타입은 클래스 및 인터페이스라는 것을 알아두자.

Box<int>라고 하지 않는 이유는 기본 타입이기 때문에 당연히 안될것이다..

 

 

제네릭 타입

제네릭 타입은 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다. 선언부에 <>가 붙는다.

public class 클래스명<A, B, ...> { .. }
public interface 인터페이스명<A, B, ...> { .. }

 

타입 파라미터는 변수명과 동일한 규칙에 따라 작성할 수 있지만 일반적으로 대문자 알파벳 한 글자로 표현한다.

외부에서 제네릭 타입을 사용하려면 타입 파라미터에 구체적인 타입을 지정해야한다.

지정하지 않는다면 Object 타입이 암묵적으로 사용된다.

 

 

package ch13.sec02.ex02;

public interface Rentable<P> {
    P rent();
}

 

인터페이스도 제네릭 타입으로 선언할 수 있다.

타입 파라미터 P를 리턴 타입으로 사용한 추상 메소드 선언

package ch13.sec02.ex02;

public class HomeAgency implements Rentable<Home> {
    @Override
    public Home rent() {
        return new Home();
    }
}

 

타입 파라미터 P를 Home으로 대체했다.

오버라이딩하는 메서드는 반드시 리턴타입이 Home이어야 한다.

 

 

타입 파라미터는 기본적으로 Object 타입으로 간주된다고 했다. 그 말은 Object가 가지고 있는 메소드를 호출할 수 있다는 것이다.

Box의 내용물을 비교하기 위해 equals() 메소드를 사용해보자

package ch13.sec02.ex03;

public class Box<T> {
    public T content;

    // Box 내용물 비교
    public boolean compare(Box<T> other) {
        boolean result = content.equals(other.content);
        return result;
    }
}

 

Object의 equals() 메소드로 필드값을 비교한다. 다만 Object의 equals()를 오버라이딩 하는 클래스가 있다고 한다면

equals의 값이 달라질 수 있다. (오버라이딩한 메서드가 우선순위를 가지기 때문에 오버라이딩 된 메서드의 값이 나온다)

'Java' 카테고리의 다른 글

제네릭 - 제한된 타입 파라미터/ 와일드카드  (0) 2024.07.11
제네릭(Generic) 메소드  (0) 2024.07.11
어노테이션  (0) 2024.07.10
정규표현식  (0) 2024.07.10
래퍼 (wrapper) 클래스  (0) 2024.07.10