본문 바로가기
내일배움캠프

내일배움캠프 11일차 TIL - 제너릭에 대하여

by Kiwimel0n 2024. 1. 8.
  • 오늘의 키워드

Generic, 타입

  • 오늘 배운 내용 정리

Generic 제너릭이란 단어는 사전적 의미로는 포괄적인 , 총칭의 , 일반적으로 라는 의미가 있다. 

자바에서의 Generic이란 중복되거나 필요없는 코드를 줄여주는 것, 데이터 형식에 의존하지 않고, 값이 여러 다른 타입들을 가질 수 있도록 하는 방법으로

타입을 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것이다.

 

보통 자바스크립트나 파이썬과 같은 약타입 언어에서는 타입을 지정해 줄 필요가 없기에 하나의 함수만 구현하면 끝이다.

더보기
function plusReturnFunction(a, b) {
    return a + b;
}

const a = 1;
const b = 2;
const c = 1.1;
const d = "hello";

plusReturnFunction(a + b); // 3
plusReturnFunction(a + c); // 2.1
plusReturnFunction(a + d); // 1hello

 

자바스크립트 에서의 함수 구현

하지만 타입을 지정해 주는 타입언어인 자바 같은 경우는 타입을 지정해주어야 한다.

그래서 똑같은 로직을 수행하는 함수를 타입을 지정해야 한다는 이유로 여러 번 구현해야 한다.

public class Generic {
    public String plusReturnFunction(int a, int b) { ... }

    public String plusReturnFunction(int a, long b) { ... }

    public String plusReturnFunction(int a, String b) { ... }
}

 

객체를 이용하여 우회를 할 수도 있겠지만,

public class Generic {
    public Object plusReturnFunction(Object a,Object b) { ... }
}

 

이러한 경우 타입의 안전성이 침해를 받게 된다.

메서드 구현 부분인 {...}의 블록 안에는 타입의 지배를 받고 있는 중이기 때문이다.

ex) 두타입이 다르다면 연산자를 사용하기 위해 같은 타입으로 맞춰줘야 하는데 , 어떠한 타입으로 맞추어야 하는가? int? long?

int와 long인 순서로 형변환하는 코드를 작성하였는데 long과 int로 들어오면 어떻게 해야 하는가?

 

이렇듯 타입의 안정성이 침해가 되어 부수적인 코드가 늘어나게 된다.

 

 

제너릭 문법

// 1.
public class Generic<T> {
   // 2.
    private T t;
    // 3.
    public T get() {
        return this.t;
    }

    public void set(T t) {
        this.t = t;
    }

    public static void main(String[] args) {
	// 4.
        Generic<String> stringGeneric = new Generic<>();
	// 5.
        stringGeneric.set("Hello World");
				
        String tValueTurnOutWithString = stringGeneric.get();

        System.out.println(tValueTurnOutWithString);
    }
}

 

1. 제너릭은 클래스 또는 메서드에 사용할 수 있다. 클래스 이름 뒤에 <> 문법 안에 들어가야 할 타입변수를 지정

타입 변수를 보통 T로드는 것은 일정의 컨벤션으로 딱히 다른 이유가 없다면 T를 사용하는 것이 좋다.

자주 사용되는 변수명으로는 T, U, V, E 등이 있다.

타입 설명
<T> Type
<S>,<U>,<V> 2번째,3번째,4번째 타입
<V> Value
<E> Element
<K> Key
<N> Number
    2. 선언 해둔 타입 변수는 해당 클래스 내에서 특정한 타입이 들어갈 자리를 대신 들어갈 수 있다. 2번에서는 private의 프로퍼티인 t의 타입이 들어가야할 자리에 들어갔다.
    3. 메서드의 리턴타입에 들어가는 것 역시 마찬가지
    4. 제너릭을 통해 구현한 클래스를 사용하는 부분으로 클래스에 선언 했기 때문에 인스턴스를 만들기 위해서 타입변수에 들어가 실제 변수의 값을 넣어주어야한다. 여기서는 String이 들어가게 되었다.
    5. 타입변수로 대체 해뒀던 곳에 String이 들어가있기 때문에, 이와 같이 사용 할 수 있다.

 

  • 오늘의 회고

오늘은 집중이 안되고 머릿속에 내용이 들어오지 않아서 진전이 나지 않았다. 내일부터 다시금 마음먹고 집중해서 마지막 주차 강의와 후에 2차 제출까지 해내야겠다.