본문 바로가기

Java16

[JAVA] GC의 내부 동작 가비지 컬렉터는 힙 메모리에서 더 이상 사용되지 않는 객체를 탐지하고 제거하여 메모리를 회수하는 역할을 한다. 프로그래머가 명시적으로 메모리를 해제하지 않아도 메모리 누수를 방지하고, 힙 메모리를 효율적으로 사용하도록 돕는 역할을 한다. GC의 주요 동작 과정1. 루트 탐색GC는 사용중인 객체와 사용되지 않는 객체를 구분하기 위해 먼저 GC Roots에서부터 참조를 탐색한다. GC Roots는 다음을 포함한다스택에 저장된 지역 변수현재 실행 중인 스레드의 참조정적 변수네이티브 코드에서의 참조GC는 루트부터 시작하여 참조 그래프를 따라가며 도달 가능한 객체를 활성(Reachable) 객체로 표시한다 2. 참조 그래프 탐색모든 GC Roots에서 시작하여 연결된 객체를 탐색하고 활성 객체로 마킹한다.도달할 .. 2024. 12. 9.
[JAVA] 객체가 생성될 때 Stack과 Heap은 객체가 생성될 때 발생하는 과정1. 객체 생성 요청객체를 생성하기 위해 new 키워드를 호출한다.Class obj = new Class(); 객체를 힙 메모리에 할당하고, 객체의 참조(reference)를 반환한다. 2. 힙 메모리에 메모리 할당1. 힙 영역에 공간 확보JVM은 객체를 저장할 크기만큼의 메모리를 힙에서 확보한다2. 메모리 초기화할당된 메모리를 초기화한다모든 인스턴스 변수는 기본 값으로 초기화 된다3. 객체의 메타데이터 설정객체가 어떤 클래스의 인스턴스인지 식별하기 위해 클래스 메타데이터가 연결된다가상 메서드 테이블에 대한 참조가 포함된다(다형성 지원을 위함)3. 생성자 호출1. 스택에 생성자 호출 정보 저장생성자를 호출하면 생성자의 매개변수와 지역 변수가 스택에 저장된다호출된 생성자가 객.. 2024. 12. 9.
JAVA Error & Exception Error와 Exception은 문제가 발생했음을 나타내는 객체다 ㅇ Error애플리케이션 실행 중에 복구할 수 없는 심각한 문제를 나타낸다. 개발자가 예외 처리(try-catch)로 복구할 수 없는 문제JVM이나 시스템의 문제가 원인인 경우가 많음ex 메모리 부족, 스택오버플로우 주요 하위 클래스OutOfMemoryError : 힙 메모리가 부족할 때 발생StackOverflowError : 재귀 호출이 너무 깊어져 스택 메모리가 초과될 때 발생NoClassDefFoundError : JVM이 필요한 클래스를 찾을 수 없을 때 발생처리 방법 : 보통 에러는 애플리케이션 내에서 복구할 수 없으므로 예외 처리로 잡지 않고 프로그램을 중단하거나 로그를 남긴다.public class ErrorExample {.. 2024. 12. 2.
JAVA 오토박싱 & 오토언박싱 Java에서 기본형 데이터와 그에 대응하는 래퍼 클래스 간의 자동 변환을 말한다 Java5 부터 도입되어 코드 작성이 더 간단하고 직관적이게 되었다. 기본형 : int, double, boolean 등 원시 데이터 타입래퍼 클래스 : 기본형을 객체로 감싸는 클래스 (Integer, Double, Boolean 등) 사용 이유 : 객체를 필요로하는 컬렉션(List, Map 등) 이나 제네릭과 함께 사용할 수 있도록 기본형을 객체로 변환 ㅇ 오토박싱기본형 데이터를 해당하는 래퍼 클래스 객체로 자동 변환하는 것public class Example { public static void main(String[] args) { int num = 10; // 기본형 타입 Integer wrappe.. 2024. 12. 2.
JAVA 캐스팅 캐스팅이란 객체나 변수의 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다 Java에서는 데이터 타입이 엄격하게 처리되므로 타입이 서로 다른 객체나 변수 사이에서 값이나 객체를 처리하려면 캐스팅이 필요하다. 기본형 타입의 캐스팅과 참조형 타입의 캐스팅으로 나뉜다. ㅇ 기본형 타입의 캐스팅작은 범위의 타입을 큰 범위로 변환 : 자동 형변환큰 범위의 타입을 작은 타입으로 변환 : 명시적 형변환int a = 10;double b = a // 자동 형변환int c = (int)b; // 명시적 형변환 ㅇ 참조형 타입의 캐스팅클래스 간의 상속 관계에서 객체 타입을 변환하는 것부모와 자식 사이에서만 가능하며 업캐스팅과 다운캐스팅이라 한다 업캐스팅자식 클래스의 객체를 부모 클래스 타입으로 변환하는 것자동변환자.. 2024. 12. 2.
JAVA JVM(Java Virtual Machine) JVM의 기능은 크게 2가지로 말할 수 있다.1. 자바 프로그램이 어느 기기나 운영체제에서도 실행될 수 있도록 하는 것2. 프로그램 메모리를 관리하고 최적화 하는 것 ㅇ 구성 요소Class LoaderJava 바이트 코드를 JVM에 로드한다클래스 파일을 읽고 검증하며 메모리에 적재한다런타임 시 필요한 클래스들을 동적으로 로드한다실행엔진바이트코드를 실제 실행 가능한 형태로 변환한다ㅇ 인터프리터ㅇ JIT 컴파일러가비지 컬렉션사용되지 않는 메모리(객체)를 자동으로 해제하여 메모리 누수를 방지한다Runtime Data Area(메모리 영역)JVM이 프로그램 실행 중 데이터를 저장하고 관리하는 메모리 구조ㅇ Method Area : 클래스 정보, 메서드, 상수 풀 등이 저장ㅇ Heap : 객체가 저장 되는 공간 .. 2024. 12. 2.
JAVA String, StringBuffer & StringBuilder String 불변 객체, 한 번 생성된 문자열을 수정할 수 없다가비지 컬렉션으로 제거되어야 한다문자열 연산시 새로운 객체를 만드는 오버헤드가 발생한다객체가 불변하므로 멀티 쓰레드 환경에서 안전하다String : 문자열 연산이 적고, 조회가 많은 멀티 스레드 환경에서 좋다 StringBuffer & StringBuilder가변 객체, 문자열 수정 시 새로 객체를 생성하지 않고 크기를 변경클래스의 메서드가 동일함StringBuffer : 멀티 쓰레드 동기화 적용 스레드 안전StringBuilder : 멀티 쓰레드 동기화 x 스레드 안전 x  특성StringStringBufferStringBuilder불변성불변가변가변스레드 안전스레드 안전스레드 안전(Synchronized)스레드 안전 x속도느림느림빠름사례읽기.. 2024. 12. 2.
JAVA 컴파일 과정 개발자가 자바 소스코드 (.java) 를 작성한다자바 컴파일러가 자바 소스파일을 컴파일한다. 이때 자바 소스코드를 바이트 코드(.class) 파일로 변환한다. 아직 컴퓨터가 읽을 수 없는 JVM이 이해할 수 있는 코드다. 컴파일된 바이트 코드를 JVM의 클래스 로더에게 전달한다클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역 즉 JVM의 메모리에 올린다클래스 로더 세부 동작a. 로드 : 클래스 파일을 가져와서 JVM 메모리에 로드한다b. 검증 : 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어 있는지 확인한다c. 준비 : 클래스가 필요로 하는 메모리를 할당한다.(필드, 메서드, 인터페이스 등)d. 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 .. 2024. 12. 2.
JAVA Stack & Queue Stack과 Queue는 선형 데이터 구조다. 데이터를 삽입하고 삭제하는 방식을 정의하며, 특정 상황에서 효율적으로 데이터를 처리하기 위한 용도로 사용한다. 서로 다르게 동작하며, 동작 방식에 따라 적합한 사용 사례가 다르다. JAVA에서 Stack은 Class로 Queue는 인터페이스로 제공된다. ㅇ Stack개념스택은 LIFO(Last In, First Out) 구조다. 가장 나중에 추가된 데이터가 가장 먼저 처리되는 후입선출 구조다. 비유하자면 쌓아논 접시를 생각할 수 있다. 접시를 쌓을 때는 맨위에 접시를 올리고 꺼낼 때도 맨 위에서 꺼내기 때문이다. 주요 연산push : 스택의 맨 위에 데이터를 추가하는 연산pop : 스택의 맨 위에서 데이터를 제거하고 반환하는 연산peek : 스택의 맨 위에 .. 2024. 10. 4.