[Java] Inner Class (내부 클래스)

Minji Kim·2021년 7월 29일
0

Java

목록 보기
4/9
post-thumbnail

Inner Class (내부 클래스)

  • Member inner class (멤버 내부 클래스) : 다른 클래스 내부에서 선언된 클래스
  • Static inner class (static 내부 클래스, Nested Class) : 다른 클래스의 내부에서 static으로 선언된 클래스
  • Local class (지역 클래스)
    - Local inner class (지역 내부 클래스) : 메소드 내부에서 선언된 클래스
    - Anonymous class (익명 클래스) : 이름이 없는 Local class

Member inner class

보통 상속 관계로 묶을 수 없고 A라는 객체가 생성된 이후에 존재할 수 있는 B객체가 있다고 가정하는 경우, 이때 B를 A의 멤버 내부 클래스로 선언한다.

멤버 내부 클래스를 사용하기 위해선 내부 클래스를 감싸고 있는 외부 클래스의 인스턴스를 먼저 생성해야 한다.
멤버 내부 클래스는 외부 클래스의 모든 멤버들(private 포함)을 사용할 수 있다.
멤버 내부 클래스의 인스턴스 생성 예시는 다음과 같다.

[외부 클래스 이름].[내부 클래스 이름] 참조 변수 = [외부 클래스 인스턴스].new 내부 클래스 생성자()

Java 예제

Member inner class 예제


Nested Class (Static inner class)

Nested Class(중첩 클래스)는 다른 클래스의 내부에서 멤버로 정의된 클래스이다.
static 키워드가 사용된 내부 클래스와 동일한 의미이다.

static은 클래스의 인스턴스가 생성되지 않아도 사용될 수 있는 멤버(변수, 메소드)에 사용하는 것이다.
따라서 Nested class는 Member inner class와 달리, 외부 클래스의 인스턴스를 생성하지 않고도 내부 클래스의 인스턴스를 생성할 수 있다.

Nested(static) class는 (외부 클래스에서) static으로 선언된 변수와 메소드만 사용 가능하다.

중첩 클래스의 인스턴스 생성 예시는 다음과 같다.

타입 참조 변수 = new 생성자()
중첩 클래스의 이름(타입) : [외부 클래스 이름].[내부 클래스 이름]
중첩 클래스의 생성자 : new [외부 클래스 이름].생성자()

Java 예제

Nested Class 예제


Local Inner Class

Local Inner Class는 블록 내부에서 정의된 클래스이다.
정의가 된 블록(메소드) 내부에서만 사용할 수 있고, 접근 수식어(public, protected, private)는 쓸 수 없다.
외부 클래스의 멤버 변수는 모두 사용 가능하다.
effectively final[1]인 지역 변수나 매개 변수만 사용할 수 있다.

지역 클래스는 해당 클래스가 선언되어 있는 메소드 실행이 끝나게 되면 정의 자체가 사라지는 클래스이다.
따라서 메소드 내부에 정의된 지역 클래스 타입을 반환하는 메소드는 만들 수 없다.
경우에 따라서 지역 클래스에 정의된 메소드를 외부에서 직접 사용하고자 하는 경우가 발생할 수도 있다.
이때 인터페이스(interface)다형성(polymoriphism)을 사용하여 가능케 한다.

🤔 인터페이스와 다형성을 이용해 어떻게 지역 클래스에 정의된 메소드를 외부에서 사용할 수 있을까?

우선, 외부에서 사용하고 싶은 메소드를 선언한 인터페이스를 작성한다.
메소드의 반환 타입은 앞서 정의한 인터페이스 타입으로 정의한다.
로컬 클래스는 인터페이스를 구현(implements)하도록 정의한다.
로컬 클래스의 인스턴스를 생성하고 반환한다.

Java 예제

Local inner class 예제


Anonymous class

기존 생성했던 클래스와는 달리 이름이 없는 local inner class 이다.
이름이 없으므로 생성자로 만들 수 없고, 클래스의 정의와 동시에 인스턴스를 생성한다.

생성 예시는 다음과 같다

new 인터페이스() { 익명 클래스 내부 작성 };
new 부모클래스() { 익명 클래스 내부 작성 };

익명 내부 클래스는 인터페이스 뿐만 아니라 일반 클래스 또는 추상 클래스도 가능하다.
상속 받은 (이름 없는)클래스의 인스턴스를 생성한다.

Java 예제

Anonymous class 예제


주석

1. final로 선언된 변수 또는 한 번 초기화가 된 이후로 값이 변경되지 않는 변수 (Java 8에서 도입)

profile
블로그 이전 mimah.tistory.com

0개의 댓글