switch
JAVA 제네릭 본문
제네릭은 자바에서 데이터 타입을 일반화해줄 때 쓴다.
(타입 체크 같은 느낌.. ts에서 제네릭 쓰는 것처럼?)
제네릭을 쓰면 코드가 간결해지고(타입 체크, 형 변환 생략)
클래스나 메서드 내부에서 사용되는 객체의 타입 안정성 제공된다.
제네릭 특징
* static은 사용 불가능
당연한 이야기겠지만 스태틱은 컴파일 시점에 메모리에 올라가 있을 때 타입이 정해져 있어야 되는데
제네릭은 타입을 정해놓지 않고 타입 지정을 외부에 맡긴다.
즉 클래스 내부에서 사용할 데이터 타입을 외부에서 파라미터 형태로 지정하는 방식임
public class 클래스명 <타입 매개변수>{...}
public interface 인터페이스명 <타입 매개변수>{...}
* 제네릭에는 원시 타입(int, char, boolean 등 ) 사용 불가하고,
String, Integer, Boolean 등은 사용 가능 (+ 이것들은 null 값 사용 가능)
* 제네릭 vs 오브젝트?
object를 사용해서 타입을 선언해줄 수 있지만
여러 타입을 사용하기 위해 object타입으로 선언하면 수동 타입 변환이 많이
발생하여 코드가 복잡해지고, 잘못된 수동 타입 변환을 사용하면 에러도 발생함.
또한 object를 남용하면 런타임 때 무슨 타입이 반환되는지 사용자가 일일이 다 파악해야 하고
사실상 자바의 컴파일 타입을 쓰는 게 의미가 없어진다.
이런 문제 해결 + object남용을 방지하기 위해 제네릭을 사용하는 것인데
예를 들면 object대신 컴파일에 int라고 되어있으면 바로보기 편하다.
또한 제네릭은 제네릭이 없던 버전의 자바와 호환도 되어야 하기에
컴파일 때만 타입을 기억하고 런타임일 때는 다 object로 지워지는 erasure방식을 사용한다.
컴파일 때 한번 체크하고 잊어버리는 게(비 구체화 non-reify라 고함) 제네릭이기 때문에 제네릭을 쓰면 나중에 object가 됨
타입이 소거되어 메서드의 매개변수 타입이 object로 바뀔 때
메서드 시그니처 사이에 불일치를 없애기 위해서 컴파일러는 런타임에 해당 제네릭 타입의 타입 소거를 위한 bridge method를 만들어줌
* 와일드카드
<?> 타입 매개변수에 모든 타입 사용
<? extends T> T타입과 T타입을 상속받는 하위 클래스 타입만 사용
<? super T> T타입과 T타입을 상속받은 상위 클래스 타임만 사용
참고하기 좋은 자료들
http://www.tcpschool.com/java/java_generic_concept
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
https://devlog-wjdrbs96.tistory.com/263
[Java] Generic Type erasure란 무엇일까?
들어가기 전에 이번 글에서는 Generic Type erasure 에 대해서 알아보겠습니다. 저에게는 쉽지 않은 내용입니다 ㅠㅠ 하지만 중요한 내용이니 정리를 열심히 해보겠습니다. 제네릭 은 JDK 1.5에 도입되
devlog-wjdrbs96.tistory.com
https://docs.oracle.com/javase/tutorial/extra/generics/index.html
Lesson: Generics (The Java™ Tutorials > Bonus)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
'java' 카테고리의 다른 글
JVM과 JAVA 메모리 영역 (0) | 2022.05.23 |
---|---|
JAVA OOP 객체지향 프로그래밍 [4. 추상화] (0) | 2022.05.13 |
JAVA OOP 객체지향 프로그래밍 [3. 다형성] (0) | 2022.05.13 |
JAVA OOP 객체지향 프로그래밍 [2. 캡슐화] (0) | 2022.05.12 |
JAVA OOP 객체지향 프로그래밍 [1. 상속] (0) | 2022.05.12 |