본문 바로가기
Study/JAVA

[Java] 7-8. 내부 클래스(inner class)

by jeongwle 2022. 9. 6.
728x90
반응형

 

내부 클래스(inner class)

1. 내부 클래스란?

내부 클래스는 클래스 내에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 간단하다. 두 클래스가 서로 긴밀한 관계에 있기 때문이다. 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 캘르스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점을 얻을 수 있다.

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

 

2. 내부 클래스의 종류와 특징

내부 클래스의 종류는 변수처럼 선언 위치에 따라 구분된다.

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

 

 

3. 내부 클래스의 선언

변수가 선언된 위치에 따라 인스턴스변수, 클래스변수(static변수), 지역변수로 나뉘듯이 내부 클래스도 선언된 위치에 따라 나뉜다. 그리고 각 내부 클래스의 선언위치에 따라 같은 선언위치의 변수와 동일한 유효범위(scope)와 접근성을 갖는다.

class Outer {
  class InstanceInner {}
  static class StaticInner {}
  
  void myMethod() {
    class LocalInner {}
  }
}​

 

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

내부 클래스가 외부 클래스의 멤버와 같이 간주되고, 인스턴스멤버와 static멤버 간의 규칙이 내부 클래스에도 똑같이 적용된다. 그리고 내부 클래스도 클래스이기 때문에 abstract나 final과 같은 제어자를 사용할 수 있을 뿐 아니라, 멤버변수들처럼 private, protected와 접근제어자도 사용이 가능하다.

내부 클래스 중에서 스태틱 클래스만 static멤버를 가질 수 있다. 드문 겨우지만 내부 클래스에 static변수를 선언해야한다면 스태틱 클래스로 선언해야 한다. 다만 final과 static이 동시에 붙은 변수는 상수이므로 모든 내부 클래스에서 정의가 가능하다.

인스턴스 클래스는 외부 클래스의 인스턴스멤버를 객체생성 없이 바로 사용할 수 있지만, 스태틱 클래스는 외부 클래스의 인스턴스멤버를 객체생성 없이 바로 사용할 수 없다.

내부 클래스와 외부 클래스에 선언된 변수의 이름이 같을 경우 this 와 외부 클래스명.this로 구분이 가능하다.

이 부분은 나중에 다시 한 번 정독해야 겠다. 

 

5. 익명 클래스(anomymous class)

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

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

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

이름이 없기 때문에 생성자도 가질 수 없다. 상위 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현한다거나 둘 이상의 인터페이스를 구현할 수 없다. 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.
728x90
반응형

댓글