클래스 로더(Class Loader)자바는 컴파일 타임이 아닌 런타임(Byte Code를 실행하는 시점)에 클래스를 로드하고 링크하는 특징을 가지고 있습니다. 이를 동적 로드라 합니다. 이러한 동적 로드를 담당하는 것이 JVM의 구성 요소 중 하나인 클래스 로더(Class Loader) 입니다. 클래스 로더(Class Loader)는 JVM의 Runtime Data Area의 메소드 영역(=Method Area, Static Area, Class Area)에 동적으로 클래스를 로드하는 역할을 합니다. 이러한 클래스 로더는 로딩, 링크, 초기화 단계로 나뉘어져 있습니다. 클래스 로더의 3단계로딩(Loading)자바 바이트 코드(.class)를 메소드 영역에 저장합니다.각 자바 바이트 코드(.class)는 ..
여러 JDK가 존재하는 이유여러 JDK가 존재하는 가장 큰 이유는 라이센스 때문입니다.최신 버전의 Oracle JDK 17, 18의 경우 "Oracle No-Free Terms and Conditions(NFTC)" 라이센스가 적용됩니다. 사용 가능한 목적과 대상은 다음과 같으며 회사에서 상용 목적으로는 사용이 불가합니다."internally use the unmodified Programs for the purposes of developing, testing, prototyping and demonstrating your applications, and running the Program for Your own personal use or internal business operations” JAVA..
JVM의 init 메서드, 객체 초기화를 위한 인스턴스 초기화 메서드인스턴스 초기화 메서드(instance initialization method)JVM은 객체 인스턴스를 초기화할 때 init 이라는 고유한 메서드를 활용합니다. 예를 들어, 다음과 같이 Object 객체를 생성하는 코드가 있다고 가정해보겠습니다.Object obj = new Object(); 해당 코드를 컴파일 한 후 Byte Code를 살펴보면 다음과 같습니다.0: new #2 // class java/lang/Object3: dup4: invokespecial #1 // Method java/lang/Object."":()V7: astore_1 JVM은 객체의 초기화를 위해 이라는 특별한 이름의 ..
Static?자바에서 Static를 사용한다는 것은 메모리에 한 번만 할당되고 프로그램이 종료될 때 해제되는 것을 의미합니다.이를 정확히 이해하기 위해선 메모리 영역에 대한 이해가 필요합니다.Static의 메모리일반적으로 우리가 만든 Class는 Static 영역에 생성되고, new 키워드를 통해 생성된 객체는 Heap 영역에 생성됩니다. 객체 생성 시 할당된 Heap 영역의 메모리는 GC(Garbage Collector)에 의해 관리되어 집니다. 하지만 Static를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리 라는 장점을 지니지만, Garbage Collector의 관리 영역 밖에 존재하기 때문에 Static을 자주 사용하면 프로그램의 종료 시까지 메모리가 할당된 채로 존재하..
ReflectionReflection은 구체적인 클래스 정보를 알지 못하더라도, 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 도와주는 자바 API입니다.컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법입니다. 이는 동적 바인딩과 관련이 있습니다. Reflection은 언제 사용하나요?1. 동적으로 클래스 로드 시코드 작성 시점에는 어떤 Class를 사용해야 할지 모르지만, Runtime에 Class를 가져와서 실행해야 하는 경우입니다.대표적으로 Spring의 Annotation 기능의 Reflection을 이용하여 프로그램 실행 도중 동적으로 클래스의 정보를 가져와 사용합니다.2. 테스트 코드 작성 시private 변수를 변경하고 싶거나 privat..
Java Application을 개발하면서 equals()와 hashCode()를 같이 재정의 해야 한다는 말을 들어보신 적 있으신가요?대부분의 IDE(=Ecilpse, Intellij 등)에서도 equals()와 hashCode()를 같이 재정의 하도록 되어있으며, Lombok에서도 @EqualsAndHashCode을 지원하고 있습니다. 그렇다면, 왜 equals()와 hashCode()는 같이 정의해야 할까요? 천천히 알아보겠습니다.equals()만 재정의 하는 경우public class Car { private final String name; public Car(String name) { this.name = name; } // intellij Generate ..
Optional을 설명드리기 이전에 NPE(=NullPointerException)에 대해 간략히 말씀드리고 넘어가겠습니다.NPE는 Java Application을 개발하면서 자주 접하는 Exception 중 하나입니다. 이 NPE를 피하기 위해서 Null 값을 검사하는 로직을 아래와 같이 구성해야 합니다.List names = getNames();// NPE를 방지하기 위해 null 검사를 해야함if(names != null){ names.sort();} 하지만, 변수가 많아질 경우, Null을 검사해야 할 요소가 많아지기 때문에 꽤나 번거로워집니다. 이러한 불편한 점을 개선하고자 등장한 것이 Optional 클래스입니다.Optional 클래스Java8 버전 이후부터 Optional 클래스를 이용..
JDK(=Java Development Kit)란?Java Application을 개발하기 위해 필요한 도구들의 모음입니다.이는 개발자가 Java 코드를 작성하고 컴파일하여 Byte Code로 변환하는데 사용됩니다.JDK는 Java Compiler, JRE, Java Development Tools로 구성되어 있습니다. JDK는 Oracle Corporation에서 출시한 아래 Java 플랫폼들 중 하나를 구현한 것입니다.Java 플랫폼Java SE: Java Platform, Standard Edition표준 자바 플랫폼으로 표준적인 컴퓨팅 환경을 지원하기 위한 자바 가상머신 규격 및 API 집합을 포함합니다.Java EE, Java ME는 구체적인 목적에 따라서 이 Java SE를 기반으로 API 추..
- Total
- Today
- Yesterday