Java

Java / 지역 클래스, 익명 클래스

Dear-J 2025. 2. 27. 23:18

지역 클래스(Local Class)

내부 클래스의 특별한 종류의 하나

>> 내부 클래스의 특징을 그대로 가짐

 

지역 변수와 같이 코드 블럭 안에서 정의

 

변수의 생명 주기

클래스 변수 : 프로그램 종료 까지, 가장 길다(메서드 영역)

>> 자바가 클래스 정보를 읽어 들이는 순간부터 프로그램 종료까지 존재

 

인스턴스 변수 : 인스턴스의 생존 기간(힙 영역)

>> 본인이 소속된 인스턴스가 GC되기 전까지 존재, 생존 주기가 긴 편

 

지역 변수 : 메서드 호출이 끝나면 사라짐(스택 영역)

>> 스택 영역의 스택 프레임 안에 존재, 생존 주기가 아주 짧음

 

지역 변수 캡처

지역 변수의 생명주기는 짧고, 지역 클래스를 통해 생성한 인스턴스의 생명 주기는 긺

지역 클래스를 통해 생성한 인스턴스가 지역 변수에 접근해야 하는데

>> 생명 주기가 달라 인스턴스는 살아있지만 지역 변수는 이미 제거된 상태일 수 있음

 

지역 클래스의 인스턴스를 생성하는 시점에 필요한 지역 변수를 복사해서 생성한 인스턴스에 함께 넣어둠

>> 접근이 필요한 지역 변수만 캡처

 

사실상 final(Effectively final)

지역 클래스가 접근하는 지역 변수는 절대 중간에 값이 변하면 안됨

>> final로 선언하거나 사실상 final 이어야 함 (자바 규칙)

 

지역 변수에 final 키워드를 사용하진 않았지만 실제로는 final 키워드를 넣은 것처럼 중간에 값을 변경하지 않는 지역 변수

 

왜 값이 바뀌면 안돼?

>> 동기화 문제 : 스택 영역에 존재하는 지역 변수의 값과 인스턴스에 캡처한 캡처 변수의 값이 서로 달라지는 문제 

>> 지역 변수의 값을 변경하면 인스턴스에 캡처한 변수의 값도 변경해야 함

>> 개발자 입장에서 예상하지 못한 곳에서 값이 변경 될 수 있음, 디버깅 어려움

>> 멀티 쓰레드 상황에서 동기화가 매우 어려우며 성능에 나쁜 영향

 

익명 클래스(Anonymous Class)

지역 클래스의 특별한 종류의 하나, 클래스의 이름이 없음

 

클래스의 이름을 생략하고 클래스의 선언과 생성을 한번에 처리

 

new 다음에 바로 상속 받으면서 구현 할 부모 타입을 입력

 

익명 클래스 특징

>> 이름 없는 지역 클래스를 선언하면서 동시에 생성

>> 부모 클래스를 상속 받거나 인터페이스를 구현해야 함

>> 기본 생성자만 사용

 

익명 클래스 장점

클래스를 별도로 정의하지 않고도 인터페이스나 추상 클래스를 즉석에서 구현

>> 코드가 간결해짐

 

 

 

'Java' 카테고리의 다른 글

Java / 예외 처리 - 실습  (0) 2025.03.02
Java / 예외 처리 - 이론  (0) 2025.02.28
Java / 중첩 클래스, 내부 클래스  (0) 2025.02.27
Java / 열거형 - ENUM  (0) 2025.02.25
Java / 래퍼, Class 클래스  (0) 2025.02.24