Java 4

[Java] fail-fast vs weakly consistent iterator

자바 컬렉션 프레임워크에서 Map 인터페이스와 관련된 내용을 찾다보면 fail-fast와 fail-safe iterator에 대한 내용이 자주 보인다. 이 주제는 Concurrency(동시성)과 관련이 있는데, Map의 대표적인 구현 클래스인 HashMap의 요소를 for-each문 내부에서 변경할 경우 ConcurrentModificationException을 던지는 것을 한번쯤은 경험해봤을 것이다. 이 예외를 처음 경험한게 코딩테스트 도중이었기에 적잖이 당황했던 기억이 있기에 이번 기회에 정리하고자 한다. HashMap에서의 ConcurrentModificationException 예시 private HashMap map; // 특정 카테고리를 제외한 모든 요소 삭제 public void clear(..

Java 2021.12.20

[Java] jenv로 자바 버전 쉽게 변경하기

java -version과 javac -version이 다르게 표시될 때 터미널에서 java -version과 javac -version을 실행했을 때 Java(JDK)의 버전이 다르게 표시되는 경우가 있다. 개인적으론 특정 버전 설치와 변경이 편리한 jenv를 이용하는 두 번째 방법을 개인적으로 추천한다. 방법 1 먼저 /usr/libexec/java_home -V을 실행하면 다음과 같이 출력이 된다. Matching Java Virtual Machines (3): 15.0.2 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 15" /Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home 1.8.0_311 (x86_..

Java 2021.12.19

[Java] String, StringBuilder, StringBuffer의 차이점

Java를 공부하다보면 String은 불변(immutable) 객체라는 이야기를 많이 듣게 된다. String text = "Java"; text = text + " String"; System.out.println(text); // Java String 아니 위 코드처럼 String 값이 잘만 변하는데 무슨 말이야! 라고 생각될 수 있지만 Java의 String 객체는 변하지 않는다. 객체가 불변일 경우 멀티 쓰레드 환경에서 값이 변경될 일이 없이 때문에 자연스럽게 Thread safe하게 된다. JDK 5 이전에는 String 문자열을 더하면 새로운 String 객체가 생성되고, 기존 객체는 쓰레기가 되어 나중에 GC(Garbage Collection)의 대상이 되었다. 이것이 반복되면 쓰레기가 계속..

Java 2021.12.17

[Java] 문자열 연결 연산 "+"의 내부 구현

아래의 코드에서 문자열 연결 연산자 +의 내부 구현은 어떻게 될까? public class StringConcat { public static void main(String[] args) { String text = "Java"; text = text + " String"; System.out.println(text); // Java String } } JDK 5 이전에는 String 문자열을 더하면 새로운 String 객체가 생성되고, 기존 객체는 쓰레기가 되어 나중에 GC(Garbage Collection)의 대상이 되었다. 이것이 반복되면 쓰레기가 계속 생성될 것이고 성능적인 문제점을 야기하므로 이펙티브 자바의 아이템 63에서는 문자열 연결은 느리니 주의하라라는 내용을 담고 있다. 그런데 JDK 5..

Java 2021.11.29