티스토리 뷰

▶내부 클래스(Inner Class) & 익명 클래스(Anonymous Class)

🔎 내부 클래스(Inner Class) ?


내부 클래스(inner class)란 하나의 클래스 내부에 선언된 또 다른 클래스를 의미합니다.

이러한 내부 클래스는 외부 클래스(outer class)에 대해 두 개의 클래스가 서로 긴밀한 관계를 맺고 있을 때 선언할 수 있는데요!

 

📌 내부 클래스 문법

class Outer { // 외부 클래스
    ...
    class Inner { // 내부 클래스
        ...
    }
    ...
}

 

📌 내부 클래스의 장점

내부 클래스를 사용하면 다음과 같은 장점을 가질 수 있습니다.

 

1. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있게 됩니다.

2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킵니다.

3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있습니다.

 

❓ 캡슐화, 은닉화

외부 클래스가 메모리에 할당되어야 내부 클래스를 객체화할 수 있기 때문에 클래스를 숨기기 위해

내부 클래스를 사용하기도 합니다.

이를 캡슐화 또는 은닉화라고 합니다.

 

🔎 익명 클래스(Anonymous Inner Class)


익명 클래스는 내부 클래스의 한 종류입니다.

익명 클래스(Anonymous Inner Class)는 다른 내부 클래스와는 달리 이름을 가지지 않는 클래스를 의미합니다.

익명 클래스는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성하는 일회용 클래스입니다.

 

→ 이름이 없는 클래스, 구현되지 않은 필드를 구현하기 위해서 일회성을 생성되는 클래스

 

주로 interface로 만들어놓은 틀을 바로 채울 때 익명 클래스를 사용하는데요.

 

→ 인터페이스를 바로 구현하기 위해 사용

 

아래 코드를 살펴봅시다.

public interface Game {
    public abstract void play();
    public abstract void exit();
}

public class Computer {
    public static void main(String[] args) {
      Game rpg = new Game() {
          @Override
          public void play() {
              System.out.println("게임 스타트");
          }
          
          @Override
          public void exit() {
              System.out.println("게임 오버");
          }
      };
      
      rpg.play();
    }
}

코드에서 아래와 같은 블록을 하나의 클래스로 볼 줄 알아야 합니다.

아래 해당 부분이 바로 익명 클래스 부분인데요.

바로 인터페이스에서 선언한 구현되지 않은 메소드들에 대해 바로 오버라이딩하고 있습니다.

그런데 인터페이스를 공부할 때 선언이 되지 않았기 때문에 바로 메모리에 할당하지 못한다고 했었습니다.

 

❓ Game()은 익명 클래스를 메모리에 할당

Game()이라는 생성자가 익명 클래스를 메모리에 올리면서 주소값을 가져오는 것인데요.

자세하게는 Game이라는 인터페이스를 메모리에 올리는 것이 아니라

익명 클래스를 통해 구현한 구현체를 메모리에 올려서 주소값을 가져오는 것입니다.

 

❓ 익명 클래스 업캐스팅

인터페이스에 대해서 알아보았을 때 인터페이스를 상속 받음으로써 그 틀을 무조건 오버라이딩하여 사용한다고 했었습니다.

이때 "상속"이라는 단어에 집중해야 하는데요.

다시말해서 위 코드에서 선언한 익명 클래스는 Game 인터페이스를 상속 받은 것입니다.

즉, 익명 클래스는 자식 클래스가 되면 Game 인터페이스는 부모가 되는 것입니다.

이 말은, 익명 클래스는 자식 클래스의 타입 + 부모 타입을 가지고 있습니다.

Game rpg = new Game() { ... };

따라서 위 코드 부분을 다시 살펴보면 자식(익명 클래스)이 부모 타입으로 선언이 되었습니다.

그러므로 이 부분은 업캐스팅 되었다고 볼 수 있습니다.

 

❓ 익명 클래스에서 무언가를 더 선언할 필요가 없다

방금 익명 클래스를 통해 인터페이스를 바로 구현하는 과정은 업캐스팅 과정이라고 했습니다.

따라서 자식이 부모 타입이 되는 것입니다.

캐스팅 때 알아보았을 때 자식이 더 큰 개념이기 때문에 업캐스팅 될 때 이 넘치는 부분을 숨기면서 업캐스팅 된다고 했습니다.

결론은, 익명 클래스 안에 더 선언을 해 봤자 숨겨지기 때문에 사용할 수 없습니다.

또한 익명 클래스이기 떄문에 일회성이므로 다운 캐스팅까지 생각할 수가 없는 것이죠.

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함