Hello

Java Generic 본문

try

Java Generic

nari0_0 2019. 9. 18. 18:35
728x90

내일 LIst Generic에 대해서 보충 예정. 

 
generic은 클래스 내부에서 사용할 데이터 타입을 제약하는 것. 외부로 부터 타입을 강제화 시켜 사용한다.

 

이전에는 Object로 받아서 모든 종류의 객체를 형변환 해서 사용을 했지만, 성능의 문제와 형변환할 때 타입이 맞지않으면 컴파일 단계에서 알 수 없고 런타임 시점에 에러를 확인할 수 있었다.

 

Generic이 생기면서 지정한 타입으로 객체를 생성할 때 해당 타입으로 객체 내부가 구성되어 생성된다. 즉, 어떤 타입이든 한 가지 타입을 정해서 담을 수 있다.

 

static 키워드는 맴버변수를 사용할 없고 generic의 <T>은  인스턴스변수로 간주되어 참조가 불가능 하다. 그래서 static 키워드가 붙은 맴버변수, 메소드는 호출되는 객체에 모두 동일한 동작을 해야 하기때문에 generic을 사용할 수 없다. 

ex) static T t; ->X

 

제네릭은 컴파일 시점에서 타입이 도출되지 않아서 배열로 선언은 가능하나 생성하는 것은 불가능 하다. set을 통해 해당 타입의 배열을 대입만 가능.

 

기본 제네릭 사용 예제)

 

제네릭을 이용해 클래스를 Box 클래스를 정의

public class Box<T>{

     private T t;

     public T get(){ return t; }

     public void set(T t) { this.t = t; }

}

Box 클래스를 인스턴스화

Box<String> boxStr = new Box<>();

 

내부적으로 String으로 구성

public class Box<String>{

     private String t;

     public String get(){ return t; }

     public void set(String t) { this.t = t; }

}

 

<>안의 타입은 Box의 타입변수, 매개변수라고 한다. 위의 코드에서 Box의 타입변수는 String 이다.

boxStr은 무조건 String 타입만 사용할 수 있게 강제화 되었다.

 

 

제네릭 제한 사용 예제)

public abstract class Animal{

     private String name;

     public String getName(){ return name; }

     public void setName(String Name) { this.name = name; }

     public abstract String action();

}

 

public class Cat extends Animal{

     private String name;

     public String action(){return "캣츠"}

}

 

public class Dog extends Animal{

     private String name;

     public String action(){return "멍즈"}

}

 

특정 클래스의 자식으로 제한

public class AnimalAct<T extends Animal>{

     public T animal;

     AnimalAct(T t) { this.animal = t; }

}

 

AnimalAct 클래스 인스턴스화

AinmalAct<Cat> cat = new AnimalAct(new Cat());

AinmalAct<Dog> cat = new AnimalAct(new Dog());

-Animal 클래스와 이를 상속받은 클래스(Dog, Cat)만 AnimalAct를 사용할 수 있다.

 

제한된 타입을 선언 하는 방법은 타입을 명시할 때 extends 키워드를 붙이고 상위 타입을 명시하여 사용한다.

<T extends SuperClassName>

 

 

정의 할 땐 T

생성 할 땐 ?

728x90

'try' 카테고리의 다른 글

spring boot에 swagger2 적용  (0) 2020.01.29
JAVA Stream  (0) 2019.10.01
객체와 객체지향 프로그래밍  (0) 2019.09.10
2019.09.03  (0) 2019.09.03
2019.09.01  (0) 2019.09.01