본문 바로가기

lang/java

제네릭

* 자바 살짝 오랜만이라 복습 겸 유튜브 생활코딩님의 강의 듣고 정리

 

제네릭이란?

-> 클래스 내부에서 사용할 데이터 타입을 클래스 외부에서 정의하는 것!

두 개의 데이터 타입을 생성함 (String, StringBuilder)

 


 

제네릭을 왜 사용하는가?!

 

살펴보기 위해 아래의 코드를 보자.

이 코드는 중복이 많다! StudentPerson-StudentInfo, EmployeePerson-EmployeeInfo 의 관계가 같아 같은 동작한다.

따라서 중복 없애도록 코드 재작성

new Person()안에 StudentInfo 객체 or EmployeeInfo 객체가 오길기대하면서 코드 짬

근데 한참 뒤에 이 코드를 보아 이 생각이 안 나서 info값이 들어오면 된다 생각해 그냥 

Person p1= new Person("부장"); 

이렇게 입력하면 원래 의도와 벗어나게 되는 것! ( 원래 의도는 StudentInfo/ EmployeeInfo객체  들어오는거라)

-> 결국 Person의 생성자에 들어올 수 있는 데이터의 데이터 타입을 Object 타입으로 지정해 버리면서 "부장"과 같은 아무 애들도 들어올 수 있게 됨. (다른 데이터타입이 들어오는 걸 금지시키는 효과가 없어져 버려 "타입이 안전하지 않다는 문제" 발생)

따라서 코드의 중복성 제거 + 타입이 안전하다는 장점 이 두 가지 모두를 잡기 위해 제네릭 사용하는 것!! 

 


 

 제네릭의 특징

 

1.복수의 제네릭

 

복수의 제네릭인 경우는 T,S처럼 서로 이름이 다르고 comma를 찍어야 한다.

 

근데 여기 사진을 보면 int에 밑줄쳐지면서 오류라고 뜬다.

Why??

-> 제네릭(T,S)로는 참조데이터타입만 올 수 있고 기본 데이터타입은 올 수 없기 때문!!

  -> 기본 데이터타입 : int, char, double,...

-> 기본 데이터타입은 wrapper 클래스로 감싸야 사용 가능!!

  -> wrapper 클래스란? 기본데이터타입을 객체인 것 처럼 만들 수 있는 객체 (기본 데이터타입을 객체로 포장하는 객체)

    -> int에 대한 wrapper클래스 -> Integer, double에 대한 wrapper클래스 -> Double

 

따라서 위 사진의 코드 문제를 해결하기 위해 int -> Integer로 수정, 1을 객체로 만들기

cf ) intVaue() : Integer라는 wrapper클래스가 가지고 있는 메소드로, wrapper클래스가 담고 있는 원래의 숫자 (1)을 원시데이터타입인 int 1로 돌려줌

 

2. 제네릭의 생략

맨 마지막 줄을 보면 <> 안에 데이터 타입을 명시했는데 우리는 그 위 두 줄에 있는 생성자의 매개변를 통해 <EmployeeInfo, Integer>라고 타입을 명시 안 해도 유추할 수 있다.

따라서 제네릭을 이렇게 명시 안 해도 T와 S를 자바가 유추할 수 있다 

-> 코드가 간단해짐!

 

 

제네릭은 클래스 레벨뿐만 아니라 메소드(함수)에도 사용 가능함!

  -> 메소드 안에서 info라는 매개변수를 사용하는데 이 매개변수 타입을 아직 확정하고 싶지 않은 경우에 사용

메소드 안에서 U로 지정된 데이터 타입이 info라는 매개변수의 제네릭 데이터 타입이 된다

근데 위에서 살펴봤던 경우들과 마찬가지로 자바는 데이터 타입을 추론할 수 있기 때문에 

p1.<EmployeeInfo>printInfo(e); 대신 p1.printInfo(e); 라고 해도 된다

'lang > java' 카테고리의 다른 글

이중배열 , 덱  (0) 2024.01.24
null 값 return 할 때 defualt값 처리  (0) 2024.01.22
자바 개념 복기  (0) 2024.01.17
배열 정렬  (0) 2024.01.12
Collections framework  (0) 2023.12.19