강의 내용
문자열
- 문자열은 생각보다 메모리를 많이 잡아먹는다.
- 문자열은 constant pool에 저장되어 동일 값일 경우 공유된다. → new 키워드 사용하여 초기화 시 값이 동일해도 별도로 생성하기 때문에 new 키워드로 생성하는 것은 지양하는 것이 좋다.
- 동등성 : 객체 내 “값”이 일치 → equals
- 동일성 : 객체 “자체"가 일치(주소값) → ==
- 하드코딩된 값은 컴파일 시에 최적화되므로 런타임 시에 객체를 생성하지 않는다 → 뭔소리여
- final 키워드를 붙인 문자열들을 더한 값을 출력하면 전부를 더한 값으로 바뀌어 컴파일 된다 → 뭔소리여
- final 키워드는 컴파일 시에 사용하며 컴파일이 종료되면 final 키워드는 사라진다.
- final 키워드를 붙이면 JVM 이 해당 값이 불변이라는 것을 파악하고 최적화를 한다.
- JVM 버전에 따라 다르지만 문자열을 지속적으로 더하면 버전에 맞춰 String 타입을 변형하여 최적화한다. (8버전은 StringBuilder, 11버전은 **StringConcatFactory) → JVM 의 모든 동작을 모르기도 하고 JVM 에게 맡기는 것보다 직접 최적화를 하는 것이 좋다! JVM 은 모든 부분에서 최적화되어야 하고 여러 경우에 수에 맞추어야 하기 때문에 내 상황에 최적화 되는 것은 아닐 수도 있다.**
- StringConcatFactory 로 바뀐 이유 : StringBuilder 로 최적화가 되는 방식은 원본 변수 타입 자체를 바꾸는 것이 아닌 더해지는 때마다 new StringBuilder 로 바꾸고 더한 값을 원본 값에 더한다.
- StringBuffer : 쓰레드 세이프, 개발한 사람이 후회한 타입, 스트링을 더하는 것 뿐인데 멀티 쓰레드를 보장하여 과하게 보완하였다, 아무도 사용 안함
- StringBuilder : 내부에서 바이트로 저장하고 배열의 사이즈를 미리 정할 수 있기 때문에 문자열로 사용하기에 가장 좋고 빠르다.
- StringConcatFactory : 중간에 로직이 복잡하기도 하고 새로 객체를 생성하기도 해서 StringBuilder 가 더 빠르다.
리스트
- List는 ArrayList, LinkedList 두 가지가 있으며 보통 ArrayList 를 많이 사용한다.
- ArrayList : 배열의 일급 컬렉션, 배열을 감싸 사용하기 좋게 기능을 제공한다. 배열은 크기가 정해지기 때문에 ArrayList 는 내부에서 크기가 넘어갈 경우 크기를 키우는 것을 제공한다. 결국 하나의 배열. 객체 접근 시 인덱스로 바로 접근 가능. 추가/삭제 시 한칸씩 당겨줘야 함. 초기 크기는 JVM 에 따라 다르다.
- LinkedList : 값들이 주소값을 기준으로 연결되어 있어 메모리에 연속적으로 위치하고 있지 않을 수 있음. 값 접근 시 앞에서든 뒤에서든 순차적으로 찾아야 한다. 추가/삭제 시 주소값만 연결하면 되기 때문에 속도가 빠르다.
제네릭