본문 바로가기
Back-end/Java

[JAVA] 내부 클래스 간단 정리와 사용 이유

by whatamigonnabe 2022. 7. 8.

1. 정의

말 그대로 클래스 내부에 정의된 클래스이다.

 

2. 종류

익명 클래스를 제외하고는, 일반적인 멤버 변수와 메서드와 성질이 같다. 

  1. 인스턴스 클래스(멤버 변수): 외부 클래스의 선언위치에서 선언, 스코프는 외부 클래스
  2. 정적 클래스(정적 맴버 변수): 외부 클래스의 선언 위치에서 선언, 스코프는 전역
  3. 지역 클래스(메서드): 외부 클래스의 메서드 안에서 선언 ,스코프는 메서드
  4. 익명 클래스: 클래스의 선언과 객체 생성을 동시에 하는 클래스(일회용)

3. 특징

중요하다고 생각되는 몇 가지 특징을 정리해보았다.

    1. 외부 클래스 밖에서 일반적인 방법으로 인스턴스화 될 수 없다.

    2. 외부 클래스의 멤버에 바로 접근할 수 있다. 심지어 프라이빗 변수에도 접근할 수 있다.

//일반적인 클래스 사용방식
class A {
    B b = new B(); // 객체를 생성한 후,
    b.someMeber; //멤버에 접근
}

//내부 클래스의 사용 방식
Class A {
    private int someMeber = 123;
    Class B { // 내부 클래스로 정의되어 있다면,	
    	someMember; // 바로 사용가능
    } 
}

4.  사용 이유

  1. 캡슐화
    두 클래스가 아주 긴밀한 관계이고 다른 클래스에서는 호출되지 않는다면, 내부 클래스로 정의함으로써 외부에서 인스턴스화 될 일이 없고 코드의 복잡성이 낮아진다.
  2. 접근성
    객채를 따로 생성해 사용하지 않아도 되고, 프라이빗 멤버에도 접근할 수 있다.
  3. 다중상속
    자바는 기본적으로 다중 상속이 불가능한데, 각기 다른 클래스를 상속받은 내부 클래스를 여럿 정의하면서 다중상속의 효과를 볼 수 있다.

 

5. 기타

  • 모든 제어자 사용가능(public private protected default) ↔ 일반 클래스는 퍼블릭이랑 프라이빗만 가능
  • 스태틱 멤버를 사용하고 싶으면 클래스도 스태틱이어야한다. 근데 상수 스태틱은 가능하다(final static). 지역 클래스의 상수의 스코프는 메소드 내부이다.
  • 내부클래스에서 외부클래스의 private 멤버에 접근할 수 잇다.
  • 지역 클래스의 경우 메서드의 지역 변수에 접근 할 수 없다. 왜냐하면 지역변수는 스택메모리로 가서 메서드가 종료되면 사라져서 지역 객체가 더 오래 존재할 수도 있기 때문에. 지역 클래스는 상수(final)에만 접근할 수 있다. (근데 요즘 java에서 값이 바뀌지 않는 상수는 final로 간주함)