JAVA/자바의 정석

[자바의 정석 - 기초편] 7. (12) 디폴트 메서드 / 내부 클래스 / 내부 클래스 제어자 / 익명 클래스

서영22 2023. 12. 1. 21:44

 디폴트 메서드 

 

 

 

 내부 클래스 

클래스 안의 클래스

 

 

 

 

 내부 클래스의 장점 

- 내부 클래스에서 외부 클래스의 멤버들에 쉽게 접근 가능

 

- 코드의 복잡성 감소 (캡슐화)

 

 

 

 내부 클래스의 종류와 특징 

- 내부 클래스의 종류와 유효범위는 변수와 동일

 

 

내부 클래스 특징
인스턴스 클래스 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어짐. 주로 외부클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언
스태틱 클래스 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static 멤버처럼 다루어짐. 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언
지역 클래스 외부 클래스의 메서드나 초기화 블럭 안에 선언하며, 선언된 영역 내부에서만 사용 가능
익명 클래스 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스 (일회용)

 

 

 

 내부 클래스의 제어자와 접근성 

- 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일

 

 

원래 class는 (default) / public 두가지만 사용 가능하지만 내부 클래스는 private / protected / (default) / public 4가지 모두 사용 가능

 

 

 

< 예제 1 >

 

 

static 내부 클래스에서는 외부 클래스의 인스턴스 멤버에 접근 X

 

 

 

 

 

 

< 예제 2 >

 

 

 

 

< 예제 3 >

 

 

인스턴스 내부 클래스 : 외부 클래스의 private 멤버도 접근 가능 (같은 클래스니까)

 

스태틱 내부 클래스 : 외부 클래스의 인스턴스 멤버에 접근 X

 

지역 내부 클래스 : 지역 내부 클래스를 감싸고 있는 메서드의 상수만 사용 가능

* 외부 클래스의 지역변수는 final이 붙은 변수(=상수)만 가능했으나 JDK1.8부터 final이 없어도 변수인데 값이 안바뀐다면 상수로 간주하여 가능

 

 

 

< 예제 4 >

 

 

 

- 객체 생성할 때

 

인스턴스 내부 클래스 :  외부 클래스의 객체를 먼저 생성 ➔ 인스턴스 내부 클래스의 생성

스태틱 내부 클래스 : 외부 클래스 객체 생성 필요 X + (앞에 외부 클래스 이름 붙여주기)

 

 

- 상수 접근할 때

 

인스턴스 내부 클래스 :  외부 클래스 객체 생성 ➔ 내부 클래스 객체 생성 ➔ 사용

스태틱 내부 클래스 :  외부 클래스 객체 생성 X ➔ 내부 클래스 객체 생성 ➔ 사용

 

 

 

< 예제 5 >

 

 

지역 변수 lv :  ~

내부 클래스 iv :  this.~

외부 클래스 iv :  외부클래스이름.this.~

 

 

 

 익명 클래스 (anonymous class) 

이름이 없는 일회용 클래스

 

- 정의와 생성을 동시에

new 조상클래스이름 ( ) {
       // 멤버 선언
}

또는

new 구현인터페이스이름 ( ) {
       // 멤버 선언
}

 

 

 

< 예제 1 >

 

 

 

< 예제 2 >

 

변경전

 

 

익명 클래스로 변경후