Loading...

JAVA / / 2022. 1. 20. 17:21

자바 27강. 제네릭

반응형

제네릭(Generic) 프로그래밍 : 데이터 타입을 일반화하는 것

구체적인 타입을 적지 않고 변수 형태로 적어놓는 것을 말한다.

 

사과박스 설계도를 만들고

내용은 똑같은, 사과가 아닌 물을 담는 박스 설계도를 또 만드는 것은

요청할 때마다 메서드를 만드는 것과 같아서

메서드가 100개, 1000개 필요이상으로 많아질 것이다.

 

그렇다면 같은 메서드로 타입이 다른 것들을 리턴할 수는 없을까?

 

public 사과 응답( ) { // return값이 사과타입 
	if(사과요청) {
	    return 사과;
    } else if (딸기요청) {
	    return 딸기;
	}             
}

이 코드가 가능할까?

통신은 정확한 타입을 리턴해야한다.

 

데이터를 요청하면 메서드가 실행되는데

메서드의 return 타입을 if문을 사용해 바꿀 수는 없다.

 

응답( ) 메서드의 리턴타입이 사과인데,

딸기로 변경이 불가능한것이다.

 

다형성을 이용해 추상화 시킨후에

부모의 타입으로 지정해주는건 가능할까?

또한 불가능하다.

아까도 말했다시피 통신은 정확한 타입을 리턴해야한다.

 

그럼 어떻게할까?

 

메서드 박스에 들어갈 타입을

new하는 사람에게 미룰수있다.

 

이때 제네릭을 사용한다.

 

메서드는 리턴타입을 바꿀수 없기때문에,

타입을 미리 정해두지 않고

실행시에 타입을 결정시키기 위해 제네릭을 사용하는것이다.

package ex22;

class 사과 {
    String name = "사과";
}

class 딸기 {
    String name = "딸기";
}

class 오렌지 {
    String name = "오렌지";
}

// return 타입을 변수 T 타입으로 고정
class ResponseBox<T> {  // 꺽새안은 변수자리이기 때문에 
                        // 어떤 알파벳이 들어가도 상관없음, 대신 대문자임
    T data; // new 사과()의 주소가 들어감

    public ResponseBox(T data) {
        this.data = data;
    }
}

public class GenericEx01 {
    public static void main(String[] args) {
        // 꺽새안에 원하는 타입을 지정해준다.
        ResponseBox<사과> rb1 = new ResponseBox<사과>(new 사과());
        System.out.println(rb1.data.name);
        ResponseBox<딸기> rb2 = new ResponseBox<딸기>(new 딸기());
        System.out.println(rb2.data.name);
        ResponseBox<오렌지> rb3 = new ResponseBox<오렌지>(new 오렌지());
        System.out.println(rb3.data.name);
    }
}

 

정리해보면 제네릭은 리턴타입을 고정시킬 수 있고,

고정시키면서 다양하게 리턴할 수 있다.

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형