이 영역을 누르면 첫 페이지로 이동
butter_shower 블로그의 첫 페이지로 이동

butter_shower

페이지 맨 위로 올라가기

butter_shower

[Java] 제네릭 프로그래밍

  • 2019.12.16 03:19
  • Computer Engineering/Java
글 작성자: _rian

제네릭 프로그래밍(Generic Programming) 이란?

작성한 코드를 다양한 타입의 객체에 대해 재사용한다는 객체 지향 기법이다.

제네릭(Generic) : 클래스를 정의할 때 구체적인 타입을 적지 않고 변수 형태로 적어 놓는 것이다. 객체를 생성할 때 구체적인 타입을 기재한다.

제네릭 클래스 설계

선언

class 클래스이름<타입매개변수> {
    // 메서드나 필드에 필요한 타입을 타입 매개변수로 나타낸다.
    필드;
    메서드;
}

 

타입 매개변수는 객체를 생성할 때 구체적인 타입으로 대체한다.

아래는 그 예시!

 

전형적인 타입 매개변수

타입 매개변수 설명
E 원소 (Element)
K 키 (Key)
N 숫자 (Number)
T 타입 (Type)
V 값 (Value)

 

제네릭 객체 생성

 

 


제네릭의 제약

  • 기초 타입을 제네릭 인수로 사용 불가
  • 정적 제너릭 타입 금지
  • 제너릭 타입의 인스턴스화 금지. 즉, new T() 등 금지
  • 제네릭 타입의 배열 생성 금지
  • 실행 시간에 제네릭 타입 점검 금지
    예를들어, a instance of ArrayList<String>
  • 제네릭 클래스의 객체는 예외로 던지거나 잡을 수 없다.
  • 제네릭의 서브타입 허용 않음

 


제네릭 메소드

의미와 선언 방법

  • 타입 매개변수를 사용하는 메서드
  • 제네릭 클래스 뿐만아니라 일반 클래스의 멤버도 될 수 있음
  • 제네릭 메서드를 정의할 때는 타입 매개변수를 반환 타입 앞에 위치
  • 제네릭 메서드를 호출할 때는 구체적인 타입 생략 가능 -> 다이아몬드 연산자 : <>
  • JDK 7과 JDK 8의 경우 익명 내부 클래스에서는 다이아몬드 연산자 사용 불허
  • JDK 9부터는 익명 내부 클래스에서도 다이아몬드 연산자 사용 가능

 

정의와 호출 방법

제네릭 메소드와 둘 이상의 자료형

 


제한된 타입의 제네릭 메소드

제네릭 타입에 대한 범위 제한

1. 사용 방법

T가 상속 또는 구현하는 클래스의 자료형이 되어야 함을 명시함.

 

주의 : 부모 인터페이스인 경우도 implements가 아니라 extends 사용

 

 


제한된 메소드와 배열

제네릭 메소드로의 배열 전달

1. 배열도 인스턴스 이므로 제네릭 매개변수에 전달 가능. 

하지만 이렇게 전달을 하면 다음과 같은 문장을 쓸 수 없음

2. 다음과 같이 매개변수를 선언하면, 매개변수에 전달되는 참조값을 배열 인스턴스의 참조값으로 제한할 수 있음

3. 이렇게 선언하면 참조 값을 배열 인스턴스의 참조값임이 100% 보장되므로 [] 연산을 허용함

 


와일드카드 타입

1. 제네릭 타입 <?> : Unbounded wildcards (제한 없음)

2. 제네릭타입 <? extends 상위타입>

  • Upper Bounded Wildcards (상위 클래스 제한)
  • 상위 타입을 상속하는 클래스의 인스턴스라면 무엇이든지 참조 가능

3. 제네릭타입 <? super 하위타입>

  • Lower Bounded Wildcards (하위 클래스 제한)
  • 하위 타입이 상속하는 클래스의 인스턴스라면 무엇이든지 참조 가능

 

 


제네릭 클래스의 상속

제네릭 타입을 부모 클래스로 사용할 경우..

1. 타입 파라미터는 자식 클래스에도 기술해야 함

- 인스턴스 생성 시 자료형 지정

 

2. 추가적인 타입 파라미터를 가질 수 있음

 

3. 제네릭 클래스의 자료형을 결정해서 상속하는 것도 가능

 

 

 


제네릭 타입의 구현

제네릭 인터페이스를 구현할 경우, 제네릭 인터페이스를 구현한 클래스도 제네릭

 

'Computer Engineering > Java' 카테고리의 다른 글

[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map  (0) 2019.12.16
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류  (0) 2019.12.15
[Java] 중첩 클래스와 람다식  (0) 2019.12.11
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends  (0) 2019.12.11
[Java] 추상클래스와 인터페이스  (0) 2019.11.22

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map

    [Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map

    2019.12.16
  • [Java] 예외처리 - try~catch 문, throws문, 예외의 종류

    [Java] 예외처리 - try~catch 문, throws문, 예외의 종류

    2019.12.15
  • [Java] 중첩 클래스와 람다식

    [Java] 중첩 클래스와 람다식

    2019.12.11
  • [Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends

    [Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends

    2019.12.11
다른 글 더 둘러보기

정보

butter_shower 블로그의 첫 페이지로 이동

butter_shower

  • butter_shower의 첫 페이지로 이동

검색

메뉴

  • All Categories
  • About Me
  • Guest Book

카테고리

  • 전체보기 (223)
    • 💫 주인장 이야기 (17)
    • 🌱 와글와글뻘글 (27)
    • IT Trends (11)
    • 주인장 일상 (0)
    • 📒 내 마음대로 독서 서평 (12)
    • 머신러닝 꿈나무 (30)
      • 기본 개념 (6)
      • Hands-on! (5)
      • Paper Review (5)
      • 캐린이의 Kaggle (1)
    • 알고리즘 Algorithm (33)
      • PS (8)
    • Computer Engineering (75)
      • Python (8)
      • Cloud Computing (9)
      • C (9)
      • C++ (0)
      • Java (6)
      • Django 장고 (4)
      • 임베디드 시스템 (10)
      • 병렬 처리(Parallel Processing) (9)
      • 데이터 통신 Data communication (4)
      • 유닉스 시스템 (Unix System) (3)
      • GitHub (1)
      • 마이크로 프로세서 (micro processor) (1)
      • 데이터 마이닝 (1)
    • Error Note 🚨 (3)
    • 영어 공부 (6)
      • Live Academy (6)
    • HOBBY (2)
      • Film Log (2)

최근 글

정보

_rian의 butter_shower

butter_shower

_rian

나의 외부 링크

  • Github
  • Facebook
  • Instagram
  • LinkedIn
  • Twitter

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © _rian. Designed by Fraccino.

티스토리툴바