Generic
클래스나 메서드에서 사용할 데이터 타입을 일반화하는 기능
코드의 재사용성과 타입 안정성을 높여줌
성능향상을 위한 제네릭
public class Test3 {
public static void main(String[] args) {
List<A> list=new ArrayList<>();
list.add(new A());
list.add(new B());
}
}
class A{}
class B extends A{}
class Biz{
public static void service(List<A> list) {
for(A o:list) {
//중요한 일...
// if(타입 체킹) {
// 타입 캐스팅
// }
}
}
}
service 메서드에 list 전달은 가능
<A>타입의 list에 A객체와 B객체를 추가해서 둘 다 <A>타입을 가지게 되기 때문
하지만 service메서드 내부에서 타입캐스팅이 필요함.
extends 와일드 카드 사용이 필요한 경우
List<B> list2=new ArrayList<>();
list2.add(new B());
Biz.service(list2);//컴파일 에러 발생
list2의 타입은 <B>이므로 전달 불가능. service메서드는 <A>타입만 받을 수 있음. 제네릭은 따로 명시하지 않으면 상속 관계 허용 안함.
<해결 > extends 와일드 카드 사용이 필요한 경우
Biz.service(list2); // 정상 동작
class Biz{
public static void service(List<? extends A> list) {
for(A o:list) {
//중요한 일...
// if(타입 체킹) {
// 타입 캐스팅
// }
}
}
}
<? extends A>로 수정해서 <A>를 상속받은 타입으로 이루어진 list를 전달 받을 수 있음. <A> 타입도 당연히 가능.
B는 A의 하위 클래스이기 때문에 List<B>가 List<A>의 하위 타입으로 취급될 수 있음.
super 와일드 카드 사용이 필요한 경우
class Biz{
public static void service(List<B> list) {
for(A o:list) {
//중요한 일...
// if(타입 체킹) {
// 타입 캐스팅
// }
}
}
}
컴파일 오류 발생 : List<B>를 List<A>로 전달 불가능
<해결> super 와일드 카드 사용이 필요한 경우
class Biz {
public static void service(List<? super B> list) {
for(A o:list) {
// 중요한 일...
}
}
}
List<? super B> 와일드카드를 사용하여 B의 부모 타입 받을 수 있게 됨.
- 제네릭에서는 타입에 대한 상속관계를 허용하지 않음. 안쪽 상속관계까지 다 파악하지 않고 겉으로 보기에 같은지만 판단함. 허용하려면
- <? extends A> : A를 상속하고있는 하위 클래스들을 허용. 와일드카드라고 함.
- <? super B> B의 상위 클래스들을 허용. => 이 경우에는 특정 상위 클래스 하나만 받아들이는게 아니기 때문에 타입체킹 및 타입 캐스팅이 필요함. => 성능저하
- Homogeneous : 동종, 단일 타입
- Heterogeneous : 이종, 여러 타입 혼합 가능
Collection
List
순서 o, 중복 o
데이터가 입력된 순서 유지
같은 요소(주소값)를 여러 번 저장 가능
같은 주소를 여러 곳에서 가르킬 수 있음
Set
순서 x, 중복 x
내부적으로 hashCode()와 eqauls()를 이용해 중복체그
hashCode() : 객체의 고유한 숫자(해시값)를 반환
equals() : 객체가 논리적으로 같은지를 비교
ArrayList와 sort
ArrayList : 순서 o, 중복 o
Collections.sort()로 정렬
삽입, 삭제 속도 느림 : 내부적으로 배열 사용. 배열은 크기가 고정이므로 삽입, 삭제 시 배열을 다시 만들어야함.
조회 속도 빠름 : 인덱스를 통한 접근 가능
LinkedList와 sort
Collections.sort()로 정렬
삽입, 삭제 속도 빠름 : 삽입, 삭제 시 앞 뒤 요소의 링크만 연결하면 됨
조회 속도 느림 : 앞에서부터 하나씩 찾아가야 함
Hashset과 sort
중복 x, 순서 x
sort하기 위해서 ArrayList로 변환 후 Collections.sort() 사용
TreeSet
중복 x
아이템이 들어가는 순간 정렬
정렬을 시키지 않아도 정렬되어 나옴
HashMap
key-value 구조로 들어가게 됨
key는 중복x, value는 중복o
키정렬 또는 밸류 정렬 가능
'[LG 유플러스] 유레카 > Today I Learned' 카테고리의 다른 글
[TIL][02.14] Stack, Queue, PriorityQueue, Heap, Scanner (0) | 2025.02.16 |
---|---|
[TIL][02.13] 재귀, Serialization, 배열, Exception (0) | 2025.02.13 |
[TIL][02.11] Modifier, Interface, String, Wrapper, Inner, lambda, Generics, Comparable, Comparator (0) | 2025.02.12 |
[TIL][02.10] 배열, 상속, 다형성, abstract (0) | 2025.02.10 |
[TIL][02.07] String, Method, Arrays (0) | 2025.02.10 |