Language

·Language/Java
7 -> 8 메모리 구조 변화JDK 8 버전부터는 JDK 7 버전까지 사용되었던 `PermGen(Permanent Generation의 약자)`가 제거되고, `Metaspace`라는 영역이 Native Memery에 추가되었다. 1. PermGen(Permanent Generation)PermGen이란 JDK 7 버전까지 사용되던 메모리 구조로 클래스 메타데이터, 상수 풀, static 변수 등을 저장하는 데 사용되었다.  아래 이미지와 같이 JVM 메모리상 위치는 heap 영역 내부에 포함되어 있다. 기본적으로 힙 영역에 있으니 고정된 크기를 할당받는다.  ❌ PermGen 방식의 문제점PermGen 영역의 크기는 힙 영역 안에 존재하므로, 고정된 크기의 메모리 영역이다. 그렇기 때문에 실행이 되는 도..
·Language/Java
콜바이 밸류와 콜바이 래퍼런스의 기본 개념프로그래밍 언어에서 함수나 메서드를 호출할 때 인자 전달 방식에는 크게 두 가지가 있다. 콜바이 밸류(Call By Value)콜바이 래퍼런스(Call By Reference)이 두 방식은 인자를 전달하는 메커니즘의 차이를 가지며, 이로 인해 함수 내부에서 인자의 값을 변경했을 때 외부에 미치는 영향이 달라진다.  1. 콜바이 밸류(Call By Value)콜바이 벨로는 값에 의한 호출로, 함수을 호출할 때 인자의 값을 값을 복사하여 함수의 매개변수로 전달하는 방식이다. 따라서 함수 내부에서 값을 변경해도 원본 데이터에는 영향을 미치지 않는다. 이로 인해 함수 호출 후에도 원본 값이 유지된다. 이러한 특성 덕분에 부작용을 최소화할 수 있다. 2. 콜바이 래퍼런스(..
·Language/Java
스레드와 메모리앞서 자바의 메모리 구조 포스팅에서 Stack과 Heap, Method Area에 대해 알아봤다. 스레드의 경우 JVM 메모리를 이해하는 것이 중요하다. 그러므로 간단하게 Stack과 Heap, Method Area에 대해 정리해 보고 시작하자.  StackStack은 Stack Frame 단위로 나누어져 있으며, 새로운 메서드가 실행되거나 탈출할 때마다 Stack Frame이 생성 및 소멸을 한다. Stack Frame에는 메서드 내부의 로컬 변수를 관리하는 `Local Variables Array`와 연산 과정을 일시적으로 저장하는 `Operand Stack`, 그리고 메서드 종료 시 돌아와야 할 주소나 그 외 메서드에 대한 정보를 가지고 있는 Frame Data로 구성되어 있다. He..
·Language/Java
제네릭(Generic)제네릭(Generic)은 클래스 내부에서 사용할 데이터 타입을 외부에서 저장하는 기법을 의미한다. 객체별로 다른 타입의 자료가 저장될 수 있도록 한다. 1. 제네릭 클래스 기본문법 및 사용법// 제네릭을 사용한 클래스 정의class Box { private T item; public void setItem(T item) { this.item = item; } public T getItem() { return item; }}제네릭 클래스 `Box `에서 사용하는 `` 기호는 다이아몬드(Diamond)라고 불린다. 제네릭을 사용한 클래스를 제네릭 클래스(Generic Class)라고 하며, 타입 매개변수를 지정하여 다양한 타입을 처리할..
·Language/Java
예외 계층자바는 프로그램 실행 중에 발생할 수 있는 예상치 못한 상황, 즉 예외(Exception)를 처리하기 위한 메커니즘을 제공한다. 이는 프로그램의 안정성과 신뢰성을 높이는 데 중요한 역할을 한다. 자바는 예외 처리를 위한 다음 키워드를 사용한다. `try` , `catch` , `finally` , `throw` , `throws` 자바에선 객체가 기본 구성이 되며, 예외 처리용 객체도 존재한다. 위 그림은 자바 예외에 대한 객체에 대한 계층이다. `Object` : 자바에서 기본형을 제외한 모든 것은 객체로 구성되어 있다. 예외도 객체이므로 모든 객체의 최상위 부모 객체인 `Object`를 최상위 부모로 사용한다.`Throwable` : 최상위 예외이다. 하위는 `Exception`과 `Erro..
·Language/Java
Class 클래스`Class` 클래스는 자바 리플렉션 API의 일부로, 클래스 및 인터페이스의 메타데이터에 접근할 수 있도록 한다. `Class` 객체는 특정 클래스에 대한 정보를 캡슐화하며, 클래스 이름, 상위 클래스, 구현한 인터페이스, 메서드, 생성자 등의 정보를 제공한다. Class 조회다음과 같이 3가지 방법을 통한 조회가 가능하다.Class clazz = String.class; // 1.클래스에서 조회Class clazz = new String().getClass();// 2.인스턴스에서 조회Class clazz = Class.forName("java.lang.String"); // 3.문자열로 조회 조회된 `Class`클래스의 객체를 이용한 주요 기능은 다음과 같다. `getDeclared..
·Language/Java
클래스 로더 (Class Loader)클래스 로더(Class Loader)는 Java 가상 머신(JVM)에서 클래스를 동적으로 로드하는 역할을 한다. 클래스 로더는 JVM이 애플리케이션을 실행할 때 필요한 클래스를 메모리에 로드하고, 이를 초기화하는 과정을 담당한다. JVM은 애플리케이션 실행 시 필요한 모든 클래스를 미리 로드하지 않고, 필요할 때마다 동적으로 로드하기 때문이다.  따라서 클래스 로드는 Java 애플리케이션의 유연성과 확장성을 높이는 중요한 역할을 한다. 클래스 로더의 종류부트스트랩 클래스 로더 (Bootstrap Class Loader)JVM의 기본 라이브러리(rt.jar, tools.jar 등)를 로드한다.일반적인 자바 코드가 아닌 C++로 구현되어 있다.BIOS처럼 JVM의 초기 ..
·Language/Java
Wrapper 클래스자바에는 기본 타입과 Wrapper 클래스가 존재한다. 기본 타입(Primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(Wrapper class)라고 한다.기본형 타입 : int, long, float, double, boolean 등Wrapper 클래스 : Integer, Long, Float, Double, Boolean 등 근데 기본형이 있는데 왜 래퍼 클래스라는 것을 만들어 굳이 객체화시키는 것일까?자바는 객체지향언어이며, 객체가 중심으로 개발이 이루어진다. 그런데 자바 안에서 객체가 아닌 것들이 있는다. 바로 기본형(Primitive Type)이다.  기본형에 경우 객체가 아니기 때문에 다음과 같은 한계를 지닌다.객체가 아니기 때문에 객체 지향 ..
·Language/Java
문자열 상수와 String문자열의 본질은 문자 배열이며, 문자열은 인코딩 규칙에 따라 저장된다. 자바에 경우 네이티브 코드와 달리 다국어 지원을 기본으로 처리하여 문자열 관리가 용이하다.  문자열 상수는 불변 객체(Immutable Object)로, 읽기 전용(Read-Only) 문자 배열로 표현된다.  배열은 고정된 크기를 가지지만, 자바에서는 `" "` 안의 문자열을 가변적으로 사용 가능하다. 따라서 문자열 크기가 변하는 과정에서 `overflow` 문제가 발생할 수 있다. 문자열 저장 방식의 변화JDK 8 이전에는 문자열 데이터를 `char[]` 배열로 관리되었다. 모든 문자를 `UTF-16`으로 저장하여, 문자당 2바이트가 할당되었다. 예를 들어 알파벳이나 숫자처럼 1바이트로 표현한 문자도 2바이..
·Language/Java
불변객체(Immutable Object)불변 객체는 객체를 초기화 후 내부 상태(객체 내부의 값, 필드, 멤버 변수)를 변경할 수 없는 객체를 말한다. 읽기 전용(read-only) 객체로 불리며, 내부 상태는 외부에 노출되지 않거나 방어적 복사(Defensive Copy)를 통해 제공된다. 내부의 값이 변경되지 않음에 따라 객체 상태 값에 `final`로 선언한다. 그럼 내부에서 값을 변경할 수 있는 `setter`사용이 불가해진다. 그럼 이 클래스는 생성자를 통해서만 값을 설정할 수 있게 된다. 이후에는 값을 변경하는 것이 불가능하다.public class ImmutableString { private final String value; // 필드는 final로 선언하여 재할당 방지 // ..