Java Nested - 중첩 및 내부 클래스 개요

중첩 클래스 비유로 표현하면 for문안에 for문 즉 이중 for문처럼 클래스 또한 클래스 안에 클래스가 들어가는 것을 말한다.

for (...) {
    // Nested for
    for (...) {
    }
}

중첩(내부) 클래스는 다음과 같이 표현할 수 있다.

class Outer {
    // Nested Class
    class Nested {
        ...
    }
}

중첩 클래스는 정의된 위치에 따라 다르다


중첩 클래스 분류

메모리 기준으로 클래스는 종류는 두가지 있으며
중첩 클래스는 4개 분류 할 수 있다.

중첩 클래스

  • non-static 중첩 클래스
    • inner class
    • local class
    • anonymous class
  • static 중첩 클래스
    • static nested class

변수의 선언 위치

  • 정적 변수 ( 클래스 변수)
  • 인스턴스 변수
  • 지역 변수

중첩 클래스를 정의하는 것은 변수의 선언과 같다.

중첩 클래스의 선언 위치

  • 정적 중첩 클래스
    • 정적 변수 선언의 위치와 같다.
  • 내부 클래스
    • 인스턴스 변수 선언 위치와 같다
  • 지역 클래스
    • 지역 변수 선언 위치와 같다.

코드로 보는 클래스 선언

중첩 클래스 4가지 정적 중첩 클래스, 내부 클래스, 지역 클래스, 익명 클래스 각각 코드로 알아보자.

정적 중첩 클래스

class Outer {
    // 정적 중첩 클래스
    static class StaticNested {
        ...
    }
}
  • static 키워드가 붙은게 포인트이다.

내부 클래스

class Outer {
    class Inner {
        ...
    }
}
  • static 키워드가 없다.

지역 클래스

class Outer {
    public void process() {
        ...
        // 지역 변수
        int value = 0;
        
        //지역 클래스
        class Local {
            ...
        }

        Local local = new Local();
    }
}
  • 지역 클래스는 지역 변수와 같이 코드 블록 안에서 클래스를 정의한다.
  • 익명 클래스는 지역 클래스와 위치가 같으나 이름 없는 특별한 버전이다.

코드를 보고 중첩 클래스 종류가 무엇인지 배웠다.

  • 정적 중첩 클래스
  • 내부 클래스 종류
    • 내부 클래스
    • 지역 클래스
    • 익명 클래스
💡
* 중첩(Nested) 뜻은? 다른 어떤 것이 내부에 위치하거나 포함하는 구조
💡
* 내부(Inner) 뜻은? 나의 내부로 구성되는 요소

중첩 클래스는 나의 클래스에 있지만 본인 것이 아닌 것을 말한다. (static)
이너 클래스는 내부에서 구성 요소로써 존재한다. (non-static)


바깥 클래스 입장에서의 중첩 클래스

중첩 클래스의 핵심은 바깥 클래스가 안에 있는 클래스를 나의 인스턴스로 소속이 될 수 있는가 유무이다.

  • 정적 중첩 클래스는 바깥 클래스와 전혀 무관한 클래스다.
    • 바깥 클래스의 인스턴스 소속으로 불가능하다.
  • 내부 클래스는 바깥 클래스를 구성하는 요소가 된다.
    • 바칼 클래스의 인스턴스 소속이 될 수 있다.

중첩, 내부 클래스 요약

정적 중첩 클래스

  • static 키워드가 붙은 클래스
  • 바깥 클래스의 인스턴스로 할당할 수 없음

내부 클래스

  • static 키워드가 붙지 않는 클래스
  • 바깥 클래스의 인스턴스로 할당할 수 있음

내부 클래스의 종류

  • Inner 클래스
    • 바깥 클래스의 인스턴스의 멤버로 접근 가능
  • Local 클래스
    • 내부 클래스의 특징과 지역 변수로 접근 가능
  • Anonymous 클래스
    • 지역 클래스의 특징과 클래스 이름이 없는 클래스

용어 정리

  • 중첩 클래스: 정적 중첩 클래스와 내부 클래스 종류를 포함한 클래스
  • 정적 중첩 클래스: static 키워드가 붙은 클래스
  • 내부 클래스: 내부, 지역, 익명 클래스를 포함한 것
💡
실무에서는 명확한 구분 없이 부르고 있음. 상황과 문맥으로 어떤 것이 중첩, 내부 클래스인지 구분함

중첩 클래스 용도

사용처

  • 여러 중첩, 내부 클래스가 하나의 클래스에게 긴밀하게 연결되어 있는 경우에 사용
  • 단, 여러 외부 클래스가 하나의 중첩, 내부 클래스로 만들지 말 것

사용 이유

  • 논리적 그룹화
    • 특정 클래스가 하나의 클래스로만 사용하는 경우, 해당 클래스의 포함하는 것으로 그룹화한다.
    • 패키지를 열면 다른 곳에서 사용될 이유가 없으므로 외부에 노출되지 않음
  • 캡슐화
    • 중첩 클래스는 바깥 클래스의 private 멤버로 접근 가능.
    • 불필요한 public 메소드 제거로 외부 노출되지 않음

결론

생성한 클래스가 재사용되지 않고 하나의 클래스로만 연결되어 사용되는 경우,
생성한 클래스는 중첩 클래스로 만들어 연결시킬 필요가 있다. (캡슐화 작업)