내부 클래스란?

내부 클래스는 말 그대로 안에 선언된 클래스이다.

클래스 내에 선언된 클래스를 내부 클래스라고 한다.

내부 클래스를 사용하는 이유는 다음과 같다.

  • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
  • 코드의 복잡성을 줄일 수 있다. (캡슐화)

이 때 사용하는 내부 클래스는 다른 클래스에서는 사용하지 않는 내용이여야 한다.

내부 클래스의 종류

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

이러한 내부 클래스의 선언위치는 다음과 같다.

class InnnerClassTest{
    class 인스턴스클래스 {}
    static class 스태틱 클래스 {}

    void method(){
        class 내부클래스{}
    }

}

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

내부클래스는 앞에 선언위치와 같이 그냥 Class 내부에 선언되는 것이다.

이러한 내부 클래스도 클래스이기 때문에 abstractfinal같은 제어자를 안에서 사용할 수 있다. 또한, 접근 제어자도 마음대로 사용할 수 있다.

내부 클래스에서 static을 사용하기 위해서는 static클래스로 정의를 해야한다.

그렇지 않으면 static을 사용해야하는데 클래스가 안읽혀서 static을 사용하지 못하는 모순이 생긴다.

하지만 final static은 상수로서 사용이 가능하다.

또한, static멤버는 인스턴스 멤버를 직접호출을 할 수 없다.

하지만 인스턴스 멤버는 인스턴스 멤버와 static멤버를 모두 직접호출이 가능하다.

static클래스는 외부의 클래스의 인스턴스 멤버를 객체 생성없이 사용할 수 없지만

인스턴스 멤버는 클래스의 인스턴스멤버를 객체 생성 없이 사용할 수 있다.

지역 클래스는 외부 클래스의 인스턴스 멤버와 static 멤버를 모두 사용할 수 있다.

또한, 지역클래스가 포함된 메서드에 정의된 지역변수도 사용할 수 있다.

final이 붙은 지역변수만 접근이 가능하다. 하지만 JDK1.8이후로는 final을 컴파일러가 자동적으로 붙여준다.

컴파일을 하면 외부 클래스명$내부 클래스명.class형식으로 된다. 하지만 안에 중복된 이름의 클래스가 있을 수도 있기 때문에 외부 클래스명$숫자 내부 클래스명.class로 이루어진다.

마지막으로 내부 클래스와 외부 클래스에 선언된 변수의 이름이 같을 떄가 있다.

이럴 때는 외부 클래스명.this를 붙여서 서로 구별 할 수 있다.

익명 클래스(anonoymous class)

익명 클래스는 내부 클래스와 다르게 일므이 없다.

클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직하나의 객체만 생성할 수 있는 일회용 클래스이다.

이는 다음과 같이 생성된다.

new 부모 클래스이름(){

}

new 구현 인터페이스이름(){

}

Object ob = new Object(){ void method() };

이는 이름이 없어서 생성자를 가질 수 없다.

또한, 구현하고자 하는 부모 클래스이름구현 인터페이스 이름을 사용하기 때문에

둘이상의 인터페이스를 구현할 수 없다.

하나의 클래스를 상속 받거나 단 하나의 인터페이스만을 구현할 수 있다.

익명 클래스를 사용하면 다음과 같은 형태로 클래스파일이 생성이된다.

외부 클래스명&숫자.class

Reference

  • 자바의 정석

'Java > Java' 카테고리의 다른 글

[Java/Study] java.time 패키지  (0) 2021.09.18
[Java/Study] 예외처리  (0) 2021.09.14
[Java/Study] 인터페이스  (0) 2021.09.11
[Java/Study] 추상클래스  (0) 2021.09.11
[Java/Study] 다형성  (0) 2021.09.10

+ Recent posts