1) String
- 같은 문자가 들어있으면 같은 객체로 봄
- 하드코딩은 컴파일 시 최적화
- 동등성 vs 동일성 : 문자열은
equals()
로 비교하자!
public class A {
public static void main(String[] args) {
String a = "a";
String b = "b";
String c = "c";
System.out.println(a + b + c);
}
}
+
하나마다 메모리 할당, 해제 반복됨
final
을 통해 메모리 최적화 될 때도 있음
2) StringBuilder
- 기존 데이터에 새로운 데이터를 더하는 방식
- 사실 JVM 내에서
StringBuilder
로 자동 변환해줄 때도 있지만, 아닌 경우도 있음
- 변환하더라도, 계속
toString()
으로 변경 (생각보다는 멍청한 JVM)
- 긴 문자열을 더할 땐
StringBuilder
!
3) StringBuffer
결론
1) ArrayList
- 순서대로 저장됨, 인덱스를 통해 바로 값 접근
2) LinkedList
결론
- 보통
ArrayList
사용
- 직접 자료구조 구현 X
- 데이터의 타입을 특정 타입으로 고정
ArrayList<String>
...<> 사용
1) 특징
- 특정 타입으로 제한함으로써 타입 안정성을 제공
- 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결
- 다른 타입을 저장하면 컴파일 에러
2) Non-Generic
- 다양한 종류의 객체의 타입을 추가할 수 있다.(특정 Type => Object)
- 추가한 객체 타입을 사용하려면 다시 형변환을 해야 한다.(Object => 특정 Type)
결론
- 특별히 예외적인 상황이 아니라면
Generic
을 사용한다.
List<String> list = new ArrayList();
형식으로 사용하자
- 제네릭 클래스의 객체를 메소드의 매개변수로 받을 때, 그 객체의 타입 변수를 제한하는 것
super
is a lower bound(최하단 제한)
- T와 그 조상들을 구현한 객체들만 매개변수로 가능
class A { }
class B extends A { }
class C extends B { }
|-------------------------|-------------------|-------------------------------------------|
| wildcard | add | assign |
|-------------------------|-------------------|-------------------------------------------|
| List<? super C> | C | List<Object> List<A> List<B> List<C> |
|-------------------------|-------------------|-------------------------------------------|
| List<? super B> | B C | List<Object> List<A> List<B> |
|-------------------------|-------------------|-------------------------------------------|
| List<? super A> | A B C | List<Object> List<A> |
|-------------------------|-------------------|-------------------------------------------|
extends
is an upper bound(최상단 제한)
- T와 그 자손들을 구현한 객체들만 매개변수로 가능
|-------------------------|-------------------|---------------------------------|
| wildcard | get | assign |
|-------------------------|-------------------|---------------------------------|
| List<? extends C> | A B C | List<C> |
|-------------------------|-------------------|---------------------------------|
| List<? extends B> | A B | List<B> List<C> |
|-------------------------|-------------------|---------------------------------|
| List<? extends A> | A | List<A> List<B> List<C> |
|-------------------------|-------------------|---------------------------------|
예시 코드
public class A {
public static void main(String[] args) {
final Box<? extends Animal> extendsAnimalBox = new Box<>();
Animal animal = extendsAnimalBox.get();
final Box<? super Animal> superAnimalBox = new Box<>();
Object animal = superAnimalBox.get();
}
}
public class Box<T> {
private T value;
public T get() {
return value;
}
}
결론 : PECS
producer
생성 : extends
consumer
소비 : super
참고자료