개발/Java(10)
-
String equals에 대한 고찰
String은 값을 할당하는 방법이 2가지가 있다.String str1 = new String("hello");String str2 = "hello";new String으로 할당하면 이는 Heap 메모리에 올라가게 되고Literal로 할당을 하면 String pool에 저장이 된다.Literal로 값을 할당하면 나중에 같은 내용의 String이 있을 때 새로운 객체를 생성하지 않고 기존 객체를 참조한다.그럼 아래와 같은 결과를 얻을 수 있다.@Testvoid test() { String s = "hello"; String s2 = "hello"; assertThat(s == s2).isTrue();}반면에 new로 할당을 하면 Heap 메모리에 올라가게 되므로 String pool에 같은..
2025.01.26 -
Reflection과 객체 생성
Reflection을 사용하는 라이브러리가 정말 많다.Jackson, Mockito, JDK 동적 프록시, JPA 등등보면 어떤 라이브러리를 사용하기 위해서는 기본 생성자가 필요하고 어떤 것은 또 그렇지 않다. 예를 들면 JPA나 Jackson의 경우 기본 생성자가 필요하다.(Jackson의 경우 안그런 경우도 보긴 봤다.) 하지만 JDK 동적 프록시는 직접 코드를 짜서 해보니 필요하지 않더라. 왜 그럴까?JDK 동적 프록시의 경우는 인터페이스를 기반으로 프록시를 생성하고 객체 생성이 아닌 메서드 호출 처리에 초점이 맞춰져 있기 때문에 기본 생성자가 필요 없다.Jackson의 경우 Json을 객체로 역직렬화 할 때 리플렉션을 사용하여 객체를 생성한다. 직접 테스트를 해보니 Jackson 라이브러리에서 파..
2024.12.02 -
equals()와 hashcode()
다음과 같은 클래스가 있다고 하자public class MyClass { private String name; private String wow; public MyClass(String name, String wow) { this.name = name; this.wow = wow; }}이 클래스에 대한 인스턴스를 두개 만들고 비교를 하면 false라고 나온다. 그 이유는 Object의 equals는 주소값이 같은지를 확인하기 때문이다. obj1 == obj2 public static void main(String[] args) { MyClass myClass = new MyClass("MyClass", "wow"); MyClas..
2024.11.30 -
ThreadLocal과 ThreadLocalMap
ThreadLocal은 어떻게 Thread마다 자신의 값을 관리할까?각 Thread 안에는 static한 ThreadLocalMap이라는 구조체를 가지고 있고 ThreadLocal에서 get()을 호출할 경우 ThreadLocalMap에서 ThreadLocal의 객체를 키로 하여 자신의 스레드의 ThreadLocal을 찾는다.ThreadLocal의 get()은 다음과 같다.public T get() { return get(Thread.currentThread());}private T get(Thread t) { ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this)..
2024.11.17 -
Mutex와 Semaphore
Mutex동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘임계구역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이 서로 겹치지 않고 각각 단독으로 실행(상호배제_Mutual Exclution)되도록 하는 기술한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다.여기서 설명하는 Key를 소유한다는게 Java로 따지면 Lock을 얻는 것이라고 할 수 있을 듯…synchronized키워드를 사용하는 것이 Mutex 알고리즘을 사용하는 것이다.ReentrantLock은 자바에서 락을 명시적으로 획득하고 해제하..
2024.10.20 -
메모리 가시성
public static void main(String[] args) throws InterruptedException { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); Thread.sleep(1000); myRunnable.flag = false; } static class MyRunnable implements Runnable { boolean flag = true; @Override public void run() { System.out..
2024.10.20