[Java] 제네릭 (Generics) 사용법

반응형

컴퓨터 프로그래밍에 제네릭이라는 용어가 있습니다. 제네릭 타입은 클래스나 인터페이스 또는 메서드를 정의할 때 타입을 파라미터로 사용합니다. 즉 가변 타입 클래스, 인터페이스, 메서드라고 생각하면 조금 알기 쉽습니다. 제네릭은 다음과 같은 두 가지 장점이 있습니다. 또한 다음의 장점은 코드의 재사용성을 높혀줍니다.

 

  • 컴파일시 강한 타입 체크를 할 수 있다. (Stronger type checks at compile time)
  • 형변환 코드를 없앤다. (Elimination of casts)

 

 

ArrayList

 간단한 예로 Java에서 자주 쓰는 ArrayList로 예를 들겠습니다. 다음과 같은 코드를 사용할 때 객체 생성시 타입이 String으로 정해지고 우리는 이 값을 사용하기 위해서 형변환을 하지 않습니다.

 

 

 하지만 다음과 같은 경우 객체 생성시 타입이 정해지지 않고 값을 사용하기 위해서 String으로 형변환이 필요합니다.

 

 

클래스에서 제네릭 사용하기

 타입 파라미터를 만들어서 커스텀 클래스를 만들어보겠습니다. 두 가지 멤버변수를 가지고 있는 클래스로 제네릭을 이용해서 해당 타입을 동적으로 변경해보겠습니다.

 

 

 이제 테스트를 해보겠습니다. Point값이 Integer 또는 String일 때 두가지 경우입니다. 제네릭의 장점을 볼 수 있습니다. 형변환을 하지 않아도 되며 오브젝트 타입이 아니기 때문에 컴파일시 강한 타입체크가 가능합니다.

 

 

 

 

Raw Type

 다음과 같이 타입을 정하지 않은 경우를 Raw Type이라고 합니다. 때문에 Integer 변수에서 해당 값을 받을 수 없습니다. Object 형이기 때문이죠. Object 타입으로 받던지 아니면 Integer로 형변환을 해서 대입해야 합니다. 제네릭의 장점인 컴파일 타입에 강한 타입을 지정할 수 있다는 의미도 결국 이러한 문제를 방지하기 위함입니다. 어떠한 값이 정해질 때 타입이 불 분명하면 형변환을 다른 타입으로 잘못하거나 해당 타입에 잘못된 값을 넣었을 때 형변환하는 과정에서 런타임 에러가 발생하기 마련입니다. 제네릭을 사용한다면 미리 이런 문제를 사전에 방지가 가능합니다. Integer 형태의 Point 객체를 만들려면 생성자에서 무조껀 Integer 값을 전달해야 하기 때문이죠.

Generics 타입을 정하지 않은 경우


 

 

 

 다음과 같이 형변환을 하면 Raw Type도 사용이 가능합니다. 다만 Intellij IDEA 같은 프로그램에서는 경고를 표출합니다. 제네릭의 올바른 사용이 아니기 때문이죠. 

 

 

 

Multiple Type Parameters

 다음과 같이 여러개의 타입 파라미터를 가지고 있는 제네릭 클래스를 만들 수도 있습니다. 대신 이번에는 타입의 심볼이 서로 다릅니다. 타입이 하나일 때는 보통 T를 사용하고 여러개일 때는 특정 문자열로 지정이 가능합니다. 물론 하나 일때도 꼭 T를 쓰지 않아도 됩니다. 다음은 일반적으로 많이 쓰는 제네릭 타입입니다.

T Type
E Element
K Key
V Value
N Number
S, U, V 2nd, 3rd, 4th

 

 

이제 Point객체를 생성할 때 두개의 타입을 넣어줄 수 있습니다. 

Multiple Type Parameters


 

 

 

제네릭 메서드 사용하기

 클래스와 인터페이스에서도 제네릭을 사용할 수 있지만 다음과 같이 메서드에서도 제네릭을 사용할 수 있습니다. 차이점은 클래스로 선언할 경우 클래스 옆에 타입을 정해주지만 제네릭 메서드의 경우 리턴 타입 앞에 타입 파라미터를 써줍니다. 이렇게 제네릭 메서드를 만들면 공통으로 처리할 메서드에 다양한 응답값을 반환해야 하는 경우에 유용하게 사용 가능합니다. (예, 통신 객체)

 

https://docs.oracle.com/javase/tutorial/java/generics/index.html

 

Lesson: Generics (Updated) (The Java™ Tutorials > Learning the Java Language)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

반응형

댓글

Designed by JB FACTORY