⭐내부 클래스
Inner Class

클래스 속 클래스

 

🤔Why?

⭐ 논리적인 그룹화
외부클래스 Outer Class 와 내부 클래스 Inner Class 를 논리적으로 묶어
논리적으로 그룹화한다.

👍이는 코드의 가독성과 구조화를 향상해
관련 클래스들을 유지하는데 도움을 준다.

주로 두 클래스가 연관이 크고 다른 곳에서 쓸일이 없을때 쓴다.

 

 

멤버 내부 클래스
Member Inner Class
주로 외부클래스 필드에 선언

✨정적 내부 클래스
Static Inner Class
외부 클래스의 필드에 선언되지만 static 키워드를 사용하여 선언되는 점이 다르다.
public static class xxx {
}

지역 내부 클래스
Local Inner Class
메서드 내부에 선언된다.

익명 내부 클래스
Anonymous Inner Class
이름이 없다. 주로 인터페이스나 추상클래스에 들어간다.

 

😎How

예제1) 멤버 내부 클래스 만들어보기

멤버 내부 클래스의 인스턴스는 외부 클래스의 인스턴스가 있어야 생성할 수 있다.

내부클래스를 메모리에 띄우지 못하는 모습

package _Inner;
/**
 * 4.25 inner 클래스 1강
 *
 * 멤버 내부 클래스
 */
public class OuterClass {

    private int num1 =10;
    /*
    inner 클래스란
    클래스 속 클래스다.

    멤버 내부 클래스를 만들어보자
     */
    class InnerClass {

        public void display() {
            System.out.println("inner class display() 호출" + num1);
            //외부 클래스에 있는 변수 호출
        }

    }//end of inner class

    //main thread
    public static void main(String[] args) {
//        InnerClass = innerClass = new InnerClass();
        //이너클래스를 그냥 메모리에 올릴 수는 없다.

        OuterClass OuterClass = new OuterClass();
        OuterClass.InnerClass innerClass = OuterClass.new InnerClass();
        
        innerClass.display();

    }//end of main
}//end of outter class

내부 클래스 실행 결과

 

예제2) 지역 내부 클래스 만들기

메서드 내부에 선언되며 선언된 메서드 내에서만 사용된다.

package _Inner;
/**
 * 4.25 inner 클래스 2강
 *
 * 지역 내부 클래스
 * Local Inner Class
 *
 * 메서드 안에서 생성됐다가
 * 메서드 호출이 끝나면 사라진다.
 */
public class OuterClass2 {

    public void display() {

        //지역 내부 클래스
        class LocalInnerClass {

            void printMessage() {
                System.out.println("지역 내부 클래스의 메서드 호출");
            }

        }//end of class

        /*
        LocalInnerClass 생성
        display() 메서드가 호출됐을 때 생성됐다고
        메서드 호출이 끝나면 사라진다.

         */
        LocalInnerClass inner = new LocalInnerClass();
        inner.printMessage();

    }//end of method display()

    //main
    public static void main(String[] args) {

        OuterClass2 outerClass2 = new OuterClass2();
        outerClass2.display(); //지역 내부클래스의 메서드 호출

    }//end of main

}//end of class OuterClass2

 

예제3)

인터페이스나 추상 클래스를 간편하게 구현할 때 사용한다.

package _Inner;
/**
 * 4.25 inner 클래스 2강
 * <p>
 * 익명 내부 클래스
 * 익명, 이름이 없다..
 */
public class OuterClass3 {

//    Runnable runnable; //인터페이스
    /*
    인터페이스는 기본적으로 인스턴스화 할 수 없다.
    하지만, 익명 내부 클래스로 구현할 수 있다.
     */

    public OuterClass3() {
        /*
        1.구현부를 만들어준다
        2.추상메서드를 구현메서드로 변경해준다
         */
        new Runnable() {
            @Override
            public void run() {
            }
        };
    }

    //main
    public static void main(String[] args) {
        /*
        익명 클래스란?
        익명, 이름이 없는 클래스다.
         */
        new OuterClass3(); //이것은 익명 클래스다.

    }//end of main

}//end of class

인터페이스를 그냥 인스턴스화 할 수는 없다.
인터페이스를 구현클래스로 생성해버렸다.

 

 

예제4) 정적 내부 클래스 만들기

static 키워드를 사용하여 선언된다.
이러면 외부 클래스의 인스턴스와 독립적으로 존재할 수 있다.

package _Inner;
/**
 * 4.25 inner 클래스 1강
 *
 * 정적 내부 클래스를 만들어보자
 * Static Inner Class
 */
public class Spaceship {

    private Engine innerEngine;
    // 우주선에서만 사용할 Engine 클래스를 만들고 싶어졌다.

    //method - 우주선 엔진 추가
    public void addengine(Engine engine) {
        innerEngine = engine;
    }

    //method - 우주선 출발
    public void startSpaceShip() {
        if (innerEngine == null) {
            System.out.println("엔진이 없습니다");
        } else {
            System.out.println("우주선이 출발합니다.");
        }
    }

    //정적 내부 클래스
    public static class Engine {

        public static int ENGINE_COUNT = 0;
        private int serialNumber;

        public Engine() {
            ENGINE_COUNT ++;
            this.serialNumber = ENGINE_COUNT;
        }

        public void start() {
            System.out.println("엔진 " + serialNumber + "번 가동");
        }

    }//end of inner class

}//end of outer class
package _Inner;
/**
 * 4.25 inner 클래스 1강
 *
 * 정적 내부 클래스를 만들어보자
 * Static Inner Class
 */
public class SpaceshipMainTest {

    //main thread
    public static void main(String[] args) {
        /*
        멤버 내부 클래스의 문제점
        외부 클래스가 먼제 생성돼야 접근 가능하다.
        불편하다

        정적 내부 클래스를 사용한다면?
         */
        Spaceship s1 = new Spaceship();
        s1.startSpaceShip();

        Spaceship.Engine engine1 = new Spaceship.Engine();
        Spaceship.Engine engine2 = new Spaceship.Engine();
        Spaceship.Engine engine3 = new Spaceship.Engine();

        s1.addengine(engine1); //우주선 si 에 엔진 engine1 추가

        s1.startSpaceShip(); //우주선 si 가동

        /*
        Why? 정적 내부 클래스를 사용하는 이유?

        ⭐논리적인 그룹화

        정적 내부 클래스는
        외부 클래스와 논리적으로 관련있는 클래스를
        그룹화하는데 유용하다

        👍이는 코드의 가독성과 구조화를 향상해
        관련 클래스들을 유지하는데 도움을 준다.
         */

    }//end of main
}//end of class

 

+ Recent posts