1. 자바 9에 개선 및 최적화된 String 내부 구조 (JEP254: Compact Strings)[ 자바 8까지의 String 클래스의 문제점 ]자바 8까지는 내부적으로 char형 배열을 사용하여 문자열을 다루고 있었다.public final class String implements java.io.Serializable, Comparable, CharSequence { private final char value[]; private int hash; // ...} 하지만 이러한 방식은 메모리 비효율적인 문제가 있었다. 왜냐하면 자바의 Char 타입과 String 타입은 유니코드를 통해 전 세계적으로 일관되게 텍스트 데이터를 표현하고자 그 당시에 주목받던 UTF-1..
1. 값 객체(Value Object)와 불변성(Immutablity)[ 값 객체(Value Object) 와 참조 객체(reference object) ]프로그래밍을 하다 보면, 사물을 복합적으로 표현하는 것이 유용한 때가 있다. 예를 들어, 좌표는 x 값과 y값으로 표현될 수 있고, 금액은 숫자와 통화로 구성될 수 있다.class Point( val x: Int, val y: Int,) 이때 두 객체가 동일한지를 판단해야 하는 경우가 있는데, 예를 들어 두 Point 객체가 모두 (2, 3)이라는 좌표를 나타낸다면, 이를 동일하게 취급하는 것이 합리적일 수 있다.val p1 = Point(2, 3);val p2 = Point(2, 3);check(p1 == p2) 이렇듯 속성 값에 의해..

1. 자바 스레드의 여러 가지 상태들[ 여러 종류의 스레드 상태들(Thread State) ]자바 공식 문서(자바 23 기준)에 따르면 다음과 같은 자바 스레드 상태가 존재한다.NEW스레드가 생성되었으나 아직 시작되지 않은 상태아직 OS 스레드는 아직 존재하지 않으며, Thread.start()를 호출해야 OS가 실제로 스레드를 생성하도록 신호를 보냄RUNNABLE스레드가 실행 가능하여 운영 체제의 자원(예: 프로세서)을 기다리고 있거나 JVM 내에서 실행중인 상태운영체제의 스케줄러가 각 스레드에 CPU 시간을 할당하여 실행하므로, Runnable 상태의 스레드는 스케줄러의 실행 대기열에 포함되어 있다가 차례로 CPU에서 실행됨BLOCKED스레드가 모니터 락(동기화 락)을 기다리며 블록된 상태이 상태의 ..
아래는 자바 언어 아키텍트인 Brian Goetz의 “Background: how we got the generics we have (Or, how I learned to stop worrying and love erasure)” 포스팅을 재구성하여 작성한 것입니다. 해당 포스팅은 현재의 제네릭에 도달하게 된 과정과 그 이유에 초점을 맞추고, 현재 제네릭이 우리가 구축하려는 "더 나은" 제네릭에 어떤 영향을 미칠지에 대한 토대를 마련하기 위해 작성되었습니다. 특히 2004년 Java에 제네릭을 추가하기 위해 소거가 실제로 합리적이고 실용적인 선택이었음을 강조하며, 소거로의 전환을 선택하게 한 많은 강요들이 지금도 여전히 작동하고 있을 수 있음을 강조하고자 합니다. 1. 오늘날의 제네릭이 되기까지 제..

1. H2 데이터베이스에서 @Transactional(readOnly=true)일때 save를 호출하는 경우[ H2 데이터베이스에서 @Transactional(readOnly=true)일때 save를 호출하는 경우 ]다음과 같이 트랜잭션을 시작하고 데이터를 저장하는 로직이 있다고 하자. 그런데 실수로 @Transactional을 readOnly로 설정하고 작업했다면 어떻게 동작할까?@RestControllerclass SystemController( private val memberRepository: MemberRepository,) { @GetMapping("/member") @Transactional(readOnly = true) fun health() { memb..