[자바/JAVA] 짧게 후려치는 Generic의 개념과 문법

Generic

Generic(제네릭)과 관련해 자료를 찾아보니 생각보다 깊은 내용이 다루어지고 있었다. 보통은 문법과 활용 예제를 설명하고 땡 하는 느낌이라면 Generic은 이 기능이 자바에 도입되기까지의 과정과 Generic 대신 다른 방법을 사용하면 겪는 부작용 등까지 파고드는 느낌이랄까. 사실 온전히 이해하지는 못했다. 그러나 현재 수준에선 일단 대략적인 흐름만 기억하고 넘어가기 위해 기록을 한다.

 

Generic은 JDK 1.5 버전부터 도입됐다. 1.5 버전의 Release Date은 2004년이다. 현재 Generic의 중요도 치고는 비교적 가까운 시기에 탄생한 것으로 받아들이는 분위기 같다. 아무래도 아직 현업에 있는 시니어 개발자들이 1.5 이전 버전을 사용해본 경험이 있고 Generic 탄생 이전에 겪은 부작용이나 시행착오들이 쌓여있다 보니 그런 게 아닐까 추측한다.

짧은 요약

이해한 내용을 짧게 정리하자면 이렇다. 여러 타입의 변수를 이용하다보면 동일한 형태의 결과를 내는 작업을 수행함에도 코드의 중복을 피할 수 없게 된다. 이 같은 중복을 피하기 위한 방법으로 자바의 특징인 상속을 이용할 수 있다. 모든 클래스의 부모가 되는 Object를 이용하는 방법이다. 예를 들어

class StudentInfo{
    public int grade;
}
class EmployeeInfo{
    public int rank;
}

변수가 다르지만 사실상 동일한 형태의 두 클래스의 코드를

class Person{
    public Object info;
}

로 구현하고 활용하는 식이다.

 

그러나 이 방법으로 코딩 하면 매번 Object 데이터 타입으로 형변환을 해줘야 한다는 점과 당초 의도와 다른 코딩을 하더라도 컴파일 시 검출이 안 되는 부작용을 가지고 있다. 이런 비효율과 부작용을 동시에 해결해주는 기능이 바로 Generic이다. 참고: 생활코딩-제네릭

문법

클래스명 뒤에 <T>를 표기해주고 내용에는 데이터 타입이 들어가는 자리에 T를 넣어주면 된다.

public class GenericEx1<T> {
    T info;

    public void set(T n) {
        info = n;
    } // 받은 값(n)을 인스턴스 변수 info에 넣는 메서드
}

T에는 여러 타입이 적용될 수 있다. 다른 클래스에서 객체를 생성해서 접근할 땐 클래스명<데이터타입>으로 사용한다.

public class GenericMain {
    public static void main(String[] args) {
        GenericEx1<String> ge = new GenericEx1<String>(); // T를 String 타입으로 활용
        String s = "java";
        ge.set(s);
    }
}

GenericEx1에 있는 인스턴스 T에 Strnig 타입 "java"를 담은 s가 저장된다.

 

이번엔 Integer 타입 참조변수를 추가해본다.

GenericEx1<Integer> ge2 = new GenericEx1<>(); // T를 Integer 타입으로 활용
        Integer i = 1;
        ge2.set(i);

GenericEx1에 있는 인스턴스 T에 Integer 타입 1을 담은 i가 저장된다.

또한 GenericEx1<Integer> ge2 = new GenericEx1<>();를 보면 알 수 있듯, new 뒤에 <>는 공백으로 둘 수 있다.

반응형

댓글

Designed by JB FACTORY