반응형

모든 타입에서 작동하는 함수와 클래스를 만드는 것에도 가치가 있습니다. 하지만 제네릭의 진정한 능력은 제약이 있을 때 더욱 강력해집니다. 제네릭의 제약에 대해 알아보겠습니다.


제네릭 제약

제네릭 제약 조건은 타입 매개 변수로 전달할 수 있는 타입을 한정하는 것 이라고 설명할 수 있습니다.

위에서 todoNumber라는 프로퍼티를 가지는 TodoItem이라는 인터페이스를 정의하였습니다. 클래스 Todo에서 타입 매개변수 T를 제한하는데 TodoItem을 사용하고 있습니다. <T extends TodoItem>처럼 적어주었는데요. 이렇게 하므로 Todo클래스를 객체화할 때 T에 전달하는 모든 타입에 todoNumber 프로퍼티가 있는지 담보할 수 있습니다. 만약 todoNumber 프로퍼티가 없다면 컴파일러에서 에러가 발생합니다. 제약을 주었지만 제네릭 클래스의 기능이 더욱 강력해졌습니다.

조금 더 연습을 해보겠습니다.

 

제약을 가지는 제네릭 클래스 만들고 사용하기

인터페이스로 TodoItem을 만들었고 프로퍼티로 title을 가지고 있습니다. 그리고 TodoItem을 extends 하는 T를 타입 매개변수로 Toto클래스를 제네릭 클래스로 만들어 주었습니다.

find메서드와 printTitle메서드에 주목해 주세요. 제약 조건을 추가했으므로 메서드에서 title프로퍼티를 참조가 가능해집니다. 당연할 수도 있지만 T 가 TodoItem 확장한다는 제약을 주지 않았다면 해당 프로퍼티를 참조할 수 없으므로 에러가 납니다.

만든 제네릭 클래스를 사용하는 코드를 작성해 보겠습니다.

new로 Todo클래스의 인스턴스 myTodo 만들 때 TodoItem을 타입 매개변수로 넣어주고 있습니다. myTodoItem 변수는 title을 프로퍼티로 가지고 있습니다. 따라서 myTodoItem의 add로 아이템을 추가할 수 있습니다.

인스턴스를 생성할 때 title을 가지지 않는 타입 매개변수를 설정하면 어떻게 될까요?

noTitleItem은 title 프로퍼티를 가지지 않는 인터페이스입니다. Todo를 생성할 때 noTitleItem을 타입 매개변수로 설정하면 에러가 나는 걸 확인할 수 있습니다.

에러의 내용을 보면 noTitleItem은 title이 없으므로 TodoItem의 제약을 만족하고 있지 않다고 나옵니다.


이처럼 제네릭은 코드를 재사용할 수 있는 매우 유용한 도구입니다. 또한 제네릭에 제약 조건을 줌으로 제네릭을 몇 가지 타입으로만 제한하는 것이 제네릭의 구현을 보다 창의적으로 수행할 수 있게 도와줍니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기