🧑‍💻복습/자바

자바 제네릭 문법 레퍼런스와 인스턴스 (extends : sub와 super)

우동한그릇 2023. 7. 21. 13:49
반응형

* 제네릭 문법

 

 

 

// # 제네릭의 타입 파라미터로 많이 사용하는 이름
// - 보통 긴 이름을 사용하지 않고 다음과 같이 한 개의 대문자로 된 이름을 많이 사용한다.

//

// T - Type이라는 의미를 표현할 수 있어 많이 사용하는 이름이다.

// E - Element라는 의미로 목록의 항목을 가리킬 때 사용한다.

// K - Key 객체를 가리킬 때 사용한다.

// N - Number의 의미로 숫자 타입을 가리킬 때 주로 사용한다.

// V - Value의 의미로 값의 타입을 가리킬 때 사용한다.

// S,U,V 등 - 한 번에 여러 타입을 가리킬 때 두 번째, 세 번째, 네 번째 이름으로 주로 사용한다.

//

// 그러나 이름을 짓는 것은 개발자 마음이다.

// 다만, 다른 개발자와의 원활한 소통을 위하여

// 가능한 위의 규칙에 따라 이름을 사용하기 바란다.

 

 

예제 )

 

// 파라미터 타입 - 레퍼런스와 인스턴스
package com.eomcs.generic.ex02;

public class Exam0110 {

  static class Box<T> {
    void set(T obj) {}
  }


  public static void main(String[] args) {
    Box<String> box1 = new Box<>();
    Box<Integer> box2 = new Box<>();
    Box<Member> box3 = new Box<>();

    // box1 = new Box<Object>(); //컴파일오류
    // box2 = new Box<String>(); //컴파일오류
    // box3 = new Box<Object>(); //컴파일오류
  }
}

 

// 파라미터 타입 - 레퍼런스와 인스턴스 - 기본
package com.eomcs.generic.ex02;

public class Exam0111 {

  static class A {
  }
  static class B1 extends A {
  }
  static class B2 extends A {
  }
  static class C extends B1 {
  }

  // /*
  // * Object
  // * |
  // * A
  // * / \
  // * B1 B2
  // * | \
  // * C D
  // */
  static class Box<T> {
    void set(T obj) {}
  }


  public static void main(String[] args) {

    Box<B1> box1;
    // <B1>을 담는 박스만 올 수 있다. 서브클래스도 못온다.

    // box1 = new Box<A>(); //컴파일 오류!
    // box1 = new Box<Object>(); //컴파일 오류!
    box1 = new Box<B1>();
    // box1 = new Box<C>(); //컴파일 오류!



  }
}

 

// 파라미터 타입 - 레퍼런스와 인스턴스 - 상속 관계 : extends
package com.eomcs.generic.ex02;

public class Exam0112 {

  static class A {
  }
  static class B1 extends A {
  }
  static class B2 extends A {
  }
  static class C extends B1 {
  }

  // /*
  // * Object
  // * |
  // * A
  // * / \
  // * B1 B2
  // * | \
  // * C D
  // */


  static class Box<T> {
    void set(T obj) {}
  }

  public static void main(String[] args) {
    Box<? extends B1> box1;
    // <B1>의 기능을 가진 박스라면 올 수 있다. <- B1이나 B1의 자식들 !

    // box1 = new Box<A>(); //컴파일 오류!
    // box1 = new Box<Object>(); //컴파일 오류!
    box1 = new Box<B1>();
    box1 = new Box<C>(); // <- B1의 자식인 C도 올 수 있는 것이다.
    // box1 = new Box<C>(); //컴파일 오류!

  }
}

 

// 파라미터 타입 - 레퍼런스와 인스턴스 - 상속 관계 : super
package com.eomcs.generic.ex02;

public class Exam0113 {

  static class A {
  }
  static class B1 extends A {
  }
  static class B2 extends A {
  }
  static class C extends B1 {
  }

  // /*
  // * Object
  // * |
  // * A
  // * / \
  // * B1 B2
  // * | \
  // * C D
  // */


  static class Box<T> {
    void set(T obj) {}
  }

  public static void main(String[] args) {
    Box<? super B1> box1;
    // <B1>이 담겨있는 박스거나 B1의 수퍼클래스가 담겨있는 박스라면 올 수 있다. <- B1이나 B1의 자식들 !

    box1 = new Box<Object>(); // B1의 수퍼클래스
    box1 = new Box<A>(); // B1의 수퍼클래스
    box1 = new Box<B1>(); // B1 자신 클래스
    // box1 = new Box<C>(); //컴파일 오류! 자식클래스로서, 더 많은 기능이 담겨있어서 오류 !

  }
}

 

 

반응형