yooniiverse
개발 블로그
yooniiverse
전체 방문자
오늘
어제
  • 분류 전체보기
    • 운영체제
    • 네트워크
    • ~2023.02
      • 외부교육
      • 대외활동
      • 스터디
      • 동아리
      • TIL
      • IT지식
      • 기타
      • 트러블 슈팅
      • 프로그래밍
      • Python
      • Java
      • JS
      • DB(SQL)
      • JSP
      • Spring
      • 기술면접
      • 자바
      • 코딩테스트
      • 자료구조
      • 알고리즘
      • 백준 문제풀이
      • 인공지능
      • 머신러닝
      • 프로젝트
      • 안드로이드 앱개발
      • 웹개발
      • 웹 서비스
      • 웹퍼블리싱
      • Node.js 백엔드 개발
      • CS
      • 1일 1CS지식
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 정보처리기사
      • 도서 리뷰
      • 개발 관련 도서
      • 기타 도서

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yooniiverse

개발 블로그

~2023.02/Java

[자바의 정석] 지네릭스(Generics)

2022. 6. 25. 22:09

1. 지네릭스란?


다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다.

객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.

  • 의도하지 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 잘못 형변환되어 발생할 수 있는 오류를 줄여준다는 뜻이다.

 

 

2. 지네릭 클래스의 선언


지네릭 타입은 클래스와 메서드에 선언할 수 있다.

// Box 클래스 정의

class Box {
  Object item;
  
  void setItem(Object item) {this.item = item;}
  Object getItem() {return item;}
}
// Box 클래스를 지네릭 클래스로 변경

class Box<T> { // 지네릭 타입 T를 선언
  T item;
  
  void setItem(T item) {this.item = item;}
  T getItem() {return item;}
}

타입 변수는 T(type), E(element), K(key), V(value)과 같은 기호를 사용할 수 있다. 이들은 기호의 종류만 다를 뿐 '임의의 참조형 타입'을 의미한다는 것은 모두 같다.

Box<String> b = new Box<String>(); // 타입 T 대신, 실제 타입을 지정
b.setItem(new Object()); // 에러. String 이외의 타입은 지정 불가
b.setItem("ABC"); // OK. String 타입이므로 가능
String item = (String) b.getItem(); // 형변환 필요 없음

지네릭스 클래스가 된 Box클래스 객체를 생성할 때에는 위와 같이 참조변수와 생성자에 타입 T대신에 사용될 실제 타입을 지정해주어야 한다.


주의

Box b = new Box(); // OK. T는 Object로 간주됨
b.setItem("ABC"); // 경고. unchecked or unsafe operation
b.setItem(new Object()); // 경고. unchecked or unsafe operation

지네릭이 도입되기 이전의 코드와 호환을 위해, 지네릭 클래스인데도 예전의 방식으로 객체를 생성하는 것이 허용된다.

다만 지네릭 타입을 지정하지 않아서 안전하지 않다는 경고가 발생한다.

Box<Object> b = new Box<Object>();
b.setItem("ABC"); // 경고 발생 안함
b.setItem(new Object()); // 경고 발생 안함

타입 변수 T에 Object 타입을 지정하면, 타입을 지정하지 않은 것이 아니라 알고 적은 것이므로 경고가 발생하지 않는다.


지네릭스의 제한

class Box<T> {
  static T item; // 에러
  static int compare(T t1, T t2) {...} // 에러
  ...
}

모든 객체에 동일하게 동작해야하는 static 멤버에 타입 변수 T를 사용할 수 없다. T는 인스턴스 변수로 간주되기 때문이다. static 멤버는 인스턴스 변수를 참조할 수 없다.

class Box<T> {
  T[] itemArr; // OK. T타입의 배열을 위한 참조변수
  ...
  T[] toArray() {
    T[] tempArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
    ...
    return tmpArr;
  }
  ...
}

또한 지네릭 타입의 배열을 생성하는 것도 허용되지 않는다.

지네릭 배열 타입의 참조변수를 선언하는 것은 가능하지만, new T[10] 과 같이 배열을 생성하는 것은 안된다는 뜻이다.

지네릭 배열을 생성할 수 없는 것은 new 연산자 때문인데, 이 연산자는 컴파일 시점에 타입 T가 뭔지 정확히 알아야 한다.

new와 마찬가지로 instanceof 연산자도 T를 피연산자로 사용할 수 없다.

 

 

 

 

출처 : 자바의 정석 3판

'~2023.02 > Java' 카테고리의 다른 글

객체지향 프로그래밍 정리  (0) 2022.03.19
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 설계하기  (0) 2021.12.30
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 만들기  (0) 2021.12.29
자바 기초 _ [토픽1] 자바 왕기초 _ 배열  (0) 2021.12.29
자바 기초 _ [토픽1] 자바 왕기초 _ 조건문과 반복문  (0) 2021.12.29
    '~2023.02/Java' 카테고리의 다른 글
    • 객체지향 프로그래밍 정리
    • 자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 설계하기
    • 자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 만들기
    • 자바 기초 _ [토픽1] 자바 왕기초 _ 배열
    yooniiverse
    yooniiverse

    티스토리툴바