📚 학습 기록/Java 기초 & 중급

📅 [25.02.20] 자바 중첩 클래스와 내부 클래스 정리

zenjoydev 2025. 2. 20. 15:22

📚 김영한의 자바 중급 -1 섹션 8,9 중첩 클래스, 내부 클래스2
난이도: ⭐⭐⭐☆☆

🔑 핵심 개념 요약

이번 학습을 통해 다음 개념을 정리했습니다:

  • 중첩 클래스와 내부 클래스의 차이
  • 지역 클래스의 특징과 사용법
  • **섀도잉(shadowing)**과 캡처(capture) 개념
  • 자바 내부 클래스의 사용 상황과 이유

💡 중첩 클래스 & 내부 클래스 정리

자바에서 중첩 클래스와 내부 클래스는 외부 클래스와 긴밀하게 연결된 클래스를 정의할 때 사용합니다. 상황에 따라 다음과 같은 특징과 호출 방식을 가집니다.

중첩 클래스

  • static 키워드가 사용된 내부 클래스
  • 외부 클래스와는 별도이며 독립적으로 호출 가능
  • 유틸리티 역할이 많으며 외부 클래스를 참조하지 않음
  • 호출법: 외부클래스.중첩클래스 형태로 호출
  • 추천 상황: 외부 클래스 외부에서 자주 사용하거나, 특정 로직을 독립적으로 캡슐화할 때

내부 클래스

  • 외부 클래스의 멤버 변수와 메서드에 접근 가능
  • 외부 클래스의 참조값을 항상 보관함
  • 호출법: new 외부 클래스().new 내부 클래스()로 생성
  • 사용 이유:
    • 논리적 그룹화
    • 특정 클래스를 외부에 노출하지 않고 사용하고 싶을 때
    • 외부 클래스와의 캡슐화 강화

🏷 지역 클래스

  • 메서드 내에 정의된 클래스
  • 메서드가 호출될 때만 사용 가능
  • 특징:
    • final 키워드로 사실상 값 변경이 불가능한 캡처
    • 메서드의 변수와 함께 생명 주기를 가짐
    • 메서드 밖에서는 사용 불가
  • 장점: 메서드 내의 특정 로직을 캡슐화하여 코드 가독성을 높임

🗒 익명 클래스

  • 이름이 없는 클래스이며 인터페이스나 추상 클래스를 구현할 때 사용
  • 즉석에서 생성하여 일회성으로 사용 가능
  • 선언과 동시에 생성할 수 있어 코드가 간결해짐
  • 유연한 다형성을 제공
  • 자바 내부에서는 외부 클래스 이름 + $숫자로 정의됩니다.
  • 익명 클래스를 더 효율적으로 대체하기 위해 람다 표현식도 자주 사용됩니다.

🔍 섀도잉(Shadowing) 개념

  • 내부 클래스와 외부 클래스에서 동일한 이름의 변수를 정의할 때, 내부 클래스에서 정의된 변수가 우선합니다.
  • 이로 인해 외부 클래스의 변수가 가려지는 현상섀도잉이라 합니다.
  • 해결 방법: 외부클래스명.this.변수명 형태로 외부 클래스의 변수에 접근할 수 있습니다.

⚙️ 캡처(Capture) 개념

  • 내부 클래스에서 **지역 변수에 접근할 때 해당 변수는 사실상 final**로 동작합니다.
  • 메서드가 종료되더라도 내부 클래스가 계속 참조할 수 있도록 값이 복사되며, 값 변경이 금지됩니다.
  • 캡처된 값과 내부 클래스의 동작을 동기화하기 위해 변수 값이 변경되지 않도록 보장됩니다.

📚 변수의 생명 주기

자바의 변수는 메모리 영역에 따라 생명 주기가 달라집니다:

  • 클래스 변수: static 변수이며, 프로그램 종료 시까지 생존
  • 인스턴스 변수: 객체가 힙 영역에서 유지될 때까지 생존
  • 지역 변수: 메서드와 함께 스택 영역에서 할당 및 해제

중첩 클래스와 내부 클래스 주의사항

  • 상황에 따라 클래스 종류를 적절히 선택하세요.
    • 외부 클래스와 독립적일 경우 중첩 클래스
    • 외부 클래스와 강하게 결합되어 있을 경우 내부 클래스
    • 메서드 내부에서만 사용될 경우 지역 클래스
  • 익명 클래스와 람다 표현식은 상황에 맞게 적절히 사용하세요.