* 자바 살짝 오랜만이라 복습 겸 유튜브 생활코딩님의 강의 듣고 정리
제네릭이란?
-> 클래스 내부에서 사용할 데이터 타입을 클래스 외부에서 정의하는 것!
두 개의 데이터 타입을 생성함 (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 |