[우아한테크코스 백엔드 4기] 레벨1 - Java 문법특강 : 문자열, List, Generic 필기 정리
문자열
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
을 통해 메모리 최적화 될 때도 있음- 불변(
immutable
)객체이기 때문
- 불변(
2) StringBuilder
- 기존 데이터에 새로운 데이터를 더하는 방식
- 사실 JVM 내에서
StringBuilder
로 자동 변환해줄 때도 있지만, 아닌 경우도 있음 - 변환하더라도, 계속
toString()
으로 변경 (생각보다는 멍청한 JVM) - 긴 문자열을 더할 땐
StringBuilder
!
3) StringBuffer
- 멀티쓰레딩 때 사용
- 우리는 쓸 일 없음
결론
StringBuilder
쓰자
List
- 선형 데이터를 관리하는 인터페이스
1) ArrayList
- 순서대로 저장됨, 인덱스를 통해 바로 값 접근
2) LinkedList
- 노드를 통해 연결되어 있음, 값 추가가 편함
결론
- 보통
ArrayList
사용 - 직접 자료구조 구현 X
Generic
- 데이터의 타입을 특정 타입으로 고정
ArrayList<String>
...<> 사용
1) 특징
- 특정 타입으로 제한함으로써 타입 안정성을 제공
- 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결
- 다른 타입을 저장하면 컴파일 에러
2) Non-Generic
- 다양한 종류의 객체의 타입을 추가할 수 있다.(특정 Type => Object)
- 추가한 객체 타입을 사용하려면 다시 형변환을 해야 한다.(Object => 특정 Type)
결론
- 특별히 예외적인 상황이 아니라면
Generic
을 사용한다. List<String> list = new ArrayList();
형식으로 사용하자
와일드카드
- 제네릭 클래스의 객체를 메소드의 매개변수로 받을 때, 그 객체의 타입 변수를 제한하는 것
<? extends T>
vs < ? super T>
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
참고자료
Author And Source
이 문제에 관하여([우아한테크코스 백엔드 4기] 레벨1 - Java 문법특강 : 문자열, List, Generic 필기 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@betterfuture4/우아한테크코스-백엔드-4기-레벨1-Java-문법특강-문자열-List-Generic-필기-정리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)