loading
본문 바로가기
Language/Java

[ Java ] 11. 내부 클래스 ( inner class )

by NeuLyeo 2023. 11. 9.

[ Java ] 11. 내부 클래스 ( inner class )


 

 

📚 Table of Contents

     

     

     

     

     

    01. 내부 클래스란

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

     

    내부에 정의된다는 점을 제외하고는 일반적인 클래스와 다르지 않다.

     

    우리가 어느 클래스에 변수나 상수가 필요하다면 클래스 멤버로서 클래스 내에서 선언하여 사용해 왔듯이,

    선언 주체를 변수에서 클래스로 바꾼다면 그것이 내부 클래스인 것이다.

     

    이처럼 내부 클래스는

    보통 두 클래스가 서로 긴밀한 관계가 있거나,

    하나의 클래스 또는 메서드에서만 사용되는 클래스일 때 이용되는 기법이다.

     

     

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



     

    내부클래스 장점

     

    1. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근
    2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킴
    3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 감소

     

     

     

    내부클래스 특징

     

    1. 내부 클래스에서 외부 클래스 멤버에 접근가능
    2. 외부에서는 내부 클래스에 접근 불가

     

     

     

     

    02. 내부 클래스 종류

     

    내부 클래스 특징
    인스턴스 클래스 (instance class) 외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다뤄진다.
    주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.
    스태틱 클래스 (static class) 외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 static 멤버처럼 다뤄진다.
    다만 주의할점은 static이라고 해서 new 생성자 초기화를 못하는 건 아니다.
    즉, 일반적인 static 필드 변수나 static 메서드와 달리, staic 내부 클래스는 같은 static이지만 메모리 구조나 기능이 전혀 다르다.
    지역 클래스 (local class) 외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 메서드 블록 영역 내부에서만 사용될 수 있다.
    익명 클래스 (anonymous class) 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스이다.
    주로 클래스를 일회용으로 사용할때 자주 이용된다.

     

     

     

    인스턴스 클래스

     

    • 클래스의 멤버 변수 선언부에 위치하고 static 키워드가 없는 내부 클래스
    • 외부 클래스의 멤버로 취급되기 때문에 외부 클래스의 객체 먼저 생성한 후 내부 클래스의 객체를 생성이 가능하다
    • 인스턴스 클래스 내부에는 instance 멤버만 선언할 수 있다. (static 멤버는 선언 불가)
    • 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.

     

     

     

    스태틱 클래스

     

    • static 키워드가 붙은 내부 클래스
    • 단, 일반적인 static 필드 변수나 static 메서드와 똑같이 생각하면 안 된다.
    • static 클래스 내부에는 instance 멤버와 static 멤버 모두 선언할 수 있다.
    • 그러나 일반적인 static 메서드와 동일하게 외부 클래스의 인스턴스 멤버에는 접근이 불가하고, 정적(static) 멤버에만 접근할 수 있다.

     

    static 클래스는 static이라고 해서 메모리에 한 번만 로드되는 객체 개념이 아니다.

     

    즉, 내부 인스턴스 클래스처럼 외부 인스턴스를 먼저 선언하고 초기화해야 하는 선수 작업 필요 없이, 내부 클래스의 인스턴스를 바로 생성할 수 있다는 차이점만 존재한다.

     

    내부 클래스를 이용하는데, 내부 클래스에서 바깥 외부의 인스턴스를 사용할 일이 없다면 static 클래스로 선언해주어야 한다.


    지역 클래스

     

    • 메서드 내부에 위치하는 클래스 (지역 변수와 같은 성질을 지님)
    • 지역 변수처럼 해당 메서드 내부에서만 한정적으로 사용된다. (해당 메소드 실행 외에는 클래스 접근 및 사용 불가)
    • 접근제한자와 static을 붙일 수 없다.
      메소드 내부에서만 사용되므로 접근을 제한할 필요가 없고, 원래 메소드 내에는 static 멤버를 선언할 수 없기 때문이다.

     

     

     

    익명 클래스

     

    • 익명 클래스는 클래스 이름이 존재하지 않는 이너 클래스다.
    • 단 하나의 객체만을 생성하는 일회용 클래스
    • 클래스의 선언과 동시에 객체를 생성
    • 익명 클래스는 생성자가 존재하지 않는다.
    • 익명 클래스는 기존에 존재하는 클래스를 메서드 내에서 일회용으로 클래스 내부 구성을 선언하여 필요한 메서드를 재정의 하여 사용하는 기법이다

     

     

    public class Main {
        public static void main(String[] args) {
            // Object 클래스를 일회성으로 익명 클래스로 선언하여 변수 o 에 저장
            Object o = new Object() {
                @Override
                public String toString() {
                    return "toString 바꿔 ~";
                }
            };
    
            // 익명 클래스의 객체의 오버라이딩한 메서드를 사용
            String txt = o.toString();
            System.out.println(txt); //toString 바꿔 ~
        }
    }