Java

자바 generic

최데브 2021. 1. 30. 18:44

generic 에 대해서 개념만 알고 실제 프로젝트에 적용해보지는 않았는데

좀 더 확실하게 개념을 공부하고 상세한 예를 통해서 어떻게 사용되는지 찾아보았다.

 

 

generic 은 뭘까

- 제네릭은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법, 또는 다양한 타입의 객체들을 다루는  메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다. 라고 하는데

 

나의 경우는 후자의 표현이 더 와닿았다.

 

 

제너릭을 그럼 왜 사용할까?

모든 기술들이 그런거 처럼 꼭 사용할 필요는 없다.

 

그러나 만약 배열에 값을 추가하고 가져오는 함수를 포함한 클래스가 있다고 치자.

이 배열은 integer 형으로 쓰일수도 있고 string 형으로 쓰일수도 있는데

 

제너릭을 배제하고 생각한다면 두가지 형을 가진 클래스를 각각 만들어주면 된다.

그러나 이렇게 되면 같은 기능을 하는 코드가 중복되고 불필요한 코드만 늘어난다.

형변환으로 해결하면 되지 않느냐? 라고 할 수 있지만 코드 문법상으로는 문제가 생기지 않을수도 있는데

 

런타임에는 타입캐스팅 문제가 발생하기도 한다. 이런 잠재적인 오류는 특정 상황에서 심각한 문제를 발생 시키기도 한다.

 

그래서 이런것들을 해결하고자 제너릭이 있다.

 

public class GenericList<T> {

    private Object[] Data = new Object[5];
    private int size;

    public void add(T value) {
        Data[size++] = value;
    }

    public T get(int idx) {
        return (T) Data[idx];
    }
}

이런식으로 <T> 를 붙여주면서 제너릭을 사용하게 되면 명시적인 형변환 필요없이 외부에서 지정한 타입에 맞게 위 코드가 작동하게 된다.

 

이렇게 하면 자료형 관리에 대한 안정성도 높아지고 중복되는 코드를 줄여 코드의 재사용률을 높이게 된다.

 

또한

public class GenericList<T extends Number>

이런 식으로 exxtends 를 통해 들어오는 매개변수의 범위를 제한할 수 있다.

위는 Number로 범위를 제한한다. 즉 String , char 같은 타입은 들어올 수 없다.

 

주의할 점

제너릭이 편리하고 좋아보이지만 모든 곳에 다 쓸 수 있는건 아니다.

new 연산자로 배열을 생성할 경우에는 타입 T 로 생성하지 못한다.

그 이유는 new 연산자의 경우 heap 영역에 공간이 있는지 체크하고 메모리를 확보하면서 객체를 만드는데

타입에 따라 메모리의 할당 크기가 다르기 때문에 new 연산자의 역할을 수행할 수가 없어진다. 

 

또 static 변수에도 사용이 불가능하다. static 은 모든 인스턴스에 공유되는 공유변수인데 타입이 쓰이는곳 마다 바뀌어서 쓰인다는건 개념이 성립하지가 않는다.

 

static 변수에는 사용이 안되지만, static 메서드에는 사용이 가능하다. 

값 자체가 공유되는 변수와는 다르게 static 메서드는 메서드의 틀이 공유되는것이지 틀 안에서 지역변수처럼 매개변수 타입이 변화하는것은 가능하다.

 

결론

 

제너릭을 사용하면 

- 형변환이 필요없어지고 타입 안정성이 보장된다.

- 코드 재사용률이 높아진다.

 

반응형

'Java' 카테고리의 다른 글

JAVA 시간 차이 계산하기  (0) 2021.04.10
GSON 과 JSON  (0) 2021.03.07
인터페이스와 추상클래스 설명 및 차이점  (0) 2020.04.11