[Java] Arrays.copyOf가 얕은 복사인 이유 — 어셈블리까지 내려가기
·
Java
ArrayList가 가득 차면 어떻게 동작할까?내부 배열이 1.5배로 리사이징되면서 `Arrays.copyOf()`로 기존 요소를 복사한다.이때 복사된 배열은 원본과 같은 객체를 참조한다. 얕은 복사이기 때문이다. 그런데 얕은 복사인 걸 어떻게 알 수 있을까?그걸 확인하기 위해 JDK 소스부터 HotSpot 소스, 그리고 어셈블리 stub까지 따라가 봤다.전체 호출 체인 ArrayList.add(E) → ArrayList.grow() → Arrays.copyOf(T[], int) → System.arraycopy(...) // native 진입점 → JVM_ArrayCopy (jvm.cpp) → ObjArrayKlas..
[Java] 다형성, 컴포지션, DI - 세 개념을 한 줄로 잇기
·
Java
다형성을 학습하다가 Effective Java의 "상속보다는 컴포지션을 사용하라"는 문장이 떠올랐다. 그 과정에서 implements와 컴포지션의 관계가 머릿속에서 명확히 정리되지 않아 개념을 다시 정리해본다.다형성이란다형성(polymorphism)은 같은 메소드 호출이 실제 객체에 따라 다르게 동작하는 성질이다.Payment payment = new KakaoPayment();payment.pay(1000);위 코드에서 변수 타입은 Payment지만, 실제 실행되는 것은 KakaoPayment.pay()다. 즉 다형성의 핵심은부모 타입(인터페이스/상위 클래스)으로 객체를 다룰 수 있고실제 어떤 구현이 실행될지는 런타임에 결정된다는 점이다.왜 필요한가 - 결제 예시다형성이 없는 코드public class..
[Java] enum - 왜 안전한가, private 생성자로 강등되는 이유
·
Java
enum이란enum은 상수(변하지 않는 고정된 값)의 집합을 표현하는 열거형 클래스다.상수를 단순히 `public static final int`로 정의하지 않고 enum으로 정의하면, 컴파일러가 여러 안전장치를 자동으로 끼워준다.그 안전장치들이 어떻게 만들어지는지, 왜 enum이 "싱글톤처럼 동작한다"고 불리는지 정리해봤다.enum은 왜 안전한가1. 타입 체크 가능상수를 int나 String으로 관리하면, 메서드 파라미터로 정해진 상수 외의 다른 값이 넘어와도 컴파일러가 막지 못해 런타임에 가서야 터진다.반면 반면 enum은 타입 자체가 정해져 있어 잘못된 값이 넘어오는 순간 컴파일 에러로 막힌다.enum Status { WAITING, PROCESSING, DONE}void process(Sta..
[Java] equals() & hashCode() 깊게 보기 - 31의 의미, String 내부 동작
·
Java
equals()와 hashCode()Java에서 객체를 비교할 때 가장 헷갈리는 개념이 ==, equals(), hashCode()이다. 이 셋이 어떻게 다른지, 왜 equals()를 오버라이드하면 hashCode()도 같이 오버라이드해야 하는지,그리고 hashCode() 내부에서 왜 하필 31을 곱하는지까지 정리해봤다.객체 비교 3가지=대입 연산자==동일성 비교 — 같은 객체인가? (주소값)equals()동등성 비교 — 논리적으로 같은가? (내용) 기본형은 주소 개념이 없으니 ==으로 값 자체를 비교한다.반면 참조형(객체)은 == 이 참조값을 비교하기 때문에 내용이 같아도 다른 객체로 판별된다.Person p1 = new Person("홍길동", 20);Person p2 = new Person("홍길동..
[Java] synchronized 동작 원리 - 모니터 락, CAS
·
Java
synchronized`synchronized`는 같은 프로세스(JVM) 안에서 동기화를 보장하는 키워드이다. 동기화란, 여러 스레드/프로세스가 공유 자원(같은 객체나 변수)에 접근할 때 데이터를 일관되게 유지하도록 맞추는 것을 의미한다.더 정확히 말하면, 실행 순서와 메모리 상태를 서로 맞추는 것이다. 단일 스레드 환경에서도 동작 자체는 보장되지만, 경쟁 자체가 없기 때문에 사실상 멀티 스레드 환경에서만 의미가 있다. 여기서 원자성(Atomicity) 과 Thread safe 의 개념을 구분해야 한다.원자성 vs Thread safe원자성특정 연산이 중간에 끊기지 않고 완전히 실행되거나, 아예 실행되지 않는 성질을 말한다.// i++는 사실 3단계 연산int temp = i; // 1. read..