@Retention 어노테이션은 다른 어노테이션을 정의할 때 사용되며 해당 어노테이션의 라이프 사이클 즉, 어떤 시점까지 유지되는 지를 정한다. @Retention 어노테이션은 다음과 같이 세 가지 속성을 가지고 있다. RetentionPolicy.SOURCE RetentionPolicy.CLASS RetentionPolicy.RUNTIME RetentionPolicy.SOURCE 이 속성은 어노테이션을 컴파일 시간까지만 유지시키게 하며 컴파일된 클래스 파일에는 포함되지 않는다. 대표적으로 lombok의 @Getter, @Setter 의 경우가 이 속성을 사용하고 있다. @Getter, @Setter 의 경우 런타임 단계에서 특정한 작업을 위한 어노테이션이 아닌 단순 코드 생성을 도와주기 위한 어노테이션..
Supplier Interface 는 함수형 프로그래밍을 지원하는 인터페이스 중 하나이다. Supplier 는 매개변수를 받지 않고 값을 반환하는 함수를 나타내며, 일반적으로 람다 표현식을 사용하여 함수형 인터페이스의 구현체로 활용된다. Supplier 인터페이스는 다음과 같이 하나의 추상 메서드인 get() 을 가지고 있다. package java.util.function; /** * Represents a supplier of results. * * There is no requirement that a new or distinct result be returned each * time the supplier is invoked. * * This is a functional interface * wh..
리플렉션(Reflection) 이란 ? 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말한다. 이 프로그래밍 기법은 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있게 하여 프로그램에 유연성을 더해 준다. 일반적으로 리플렉션은 다음과 같은 방식으로 클래스 정보를 얻어올 수 있다. Class obj = Car.class; Class obj = Class.forName("Car"); 이러한 리플렉션을 개발자가 직접 다루는 경우는 거의 없다. 보통의 경우 구체적인 클래스를 모를 일이 거의 없기 때문이다. 그렇다면 이 자바 API는 언제 활용될까 ? Framework 나 라이브러리, IDE 소프트웨어에서 ..
실행 엔진은 Runtime Data Area 에 적재된 바이트코드들을 실행하고 사용하지 않는 데이터들을 제거하는 역할을 하며 세 가지 장치로 구분된다. - 인터프리터(Interpreter) - JIT Compiler - Garbage Collector 인터프리터(Interpreter) JVM 인터프리터는 런타임 중 바이트코드를 한 라인씩 읽고 Native Code 로 변환하는 작업을 수행한다. 인터프리터는 한 줄씩 기계어로 번역하는 만큼 번역속도는 빠르지만 전체 실행속도는 느리다. 또한 중복되는 바이트코드들에 대해서도 매번 컴파일을 하기 때문에 비효율적이라는 단점이 있다. 이러한 인터프리터 방식의 단점을 보완하기 위해 자바는 1.2 버전부터 뒤이어 설명할 JIT Compiler 를 출시하고 지속적으로 업..
Runtime Data Area(런타임 영역) 은 JVM 이 런타임 환경에서 자바 프로그램을 수행할 때 OS 로부터 할당받는 메모리 영역이다. 이 메모리 영역은 논리적으로 5가지 영역으로 구분한다. Method area Heap PC Register Native Method Stack JVM Stack 색깔을 구분한 이유는 해당 영역을 thread 간 공유하는 지의 여부를 나타내기 위함이다. Method Area 와 Heap Area 는 모든 thread 가 공유하는 자원이고 PC Register, Native Method Stack, JVM Stack 은 Thread 별로 생성이 되어 운영된다. 1. Method Area Method Area 는 JVM 벤더마다 다르게 구현되어 있다. 다만, 거의 모든..
JVM 은 사용자 컴퓨터 운영체제에 맞는 JRE 에 포함되어 있는 소프트웨어로, 바이트 코드로 변환된 자바 코드를 실행시켜주는 역할을 한다. 자바 프로그램을 실행함에 있어 .class 파일에 대한 유효성 검사와 메모리 관리, GC 등의 작업을 수행하기 때문에 매우 중요한 소프트웨어라고 할 수 있다. JVM 내부구조 JVM은 크게 다음과 같이 이루어져 있다. 클래스 로더(class loader) 실행 엔진(execution engine) 인터프리터(interpreter) JIT Compiler 가비지 콜렉터(garbage collector) 런타임 영역(runtime data area) 이번 글에서는 클래스 로더가 무엇이고, 어떻게 동작하는 지 알아보자. Class Loader 클래스 로더는 위 그림에서 ..