자바 내부 클래스(Inner Class) | 자바 입문강좌 51

자바 내부 클래스

자바의 내부 클래스에 대하여 알아보겠습니다. 클래스 안에 클래스를 만드는 것을 내부 클래스라고 합니다. 처음의 클래스 그러니까 바깥의 클래스를 외부 클래스라고 하고 그 안에 들어있는 클래스를 내부 클래스라고 하는데 클래스 안에서 생성자를 사용해서 인스턴스를 생성할 수 있습니다. 내부 클래스의 메소드도 역시 외부 클래스에서 호출할 수 있습니다.

문법적으로는 헷갈리기 쉽게 되있습니다. 클래스가 하나 더 필요한데 별도로 만들기에 부담스러운 경우 등 목적으로 사용할 수 있습니다.

static 키워드를 사용하면 인스턴스 없이 사용할 수 있는 것은 일반 클래스의 문법과 같습니다.

package com.kay;

public class Main {
    public static void main(String[] args) {
        System.out.println("[------------ inner class -------------]");
        BaseA cs1 = new BaseA();
        cs1.showSubA();

        System.out.println("[--------- inner class static ---------]");

        BaseB.SubB.showStatic();
        
    }
}
class BaseA{
    private int id = 0;
    private SubA sb1;

    public BaseA(){
        sb1 = new SubA();
    }
    class SubA{
        int inClassId = 567;
        void show(){
            System.out.println("is just test");
            System.out.println("inClassId = " + inClassId);
        }
    }
    void showSubA(){
        sb1.show();
    }
}

class BaseB{

    static class SubB{
        static int var1 = 123;
        public static void showStatic(){
            System.out.println("inner static method");
            System.out.println("var1 = " + var1);
        }
    }
}
[------------ inner class -------------]
is just test
inClassId = 567
[--------- inner class static ---------]
inner static method
var1 = 123

클래스 안에 클래스를 넣는다는 것이 코드를 복잡하게 하므로 필요한 경우에 사용하는게 좋습니다.

Runnable 내부 클래스

Runnable 내부 클래스는 클래스 안에서 메소드의 내부에 클래스를 정의해서 사용하는 것을 말합니다. 지역 내부 클래스라고도 합니다.

Runnable 인터페이스를 구현한 인스턴스를 반환받아서 사용할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        BaseC bc = new BaseC();
        Runnable myRun = bc.getRun("(Test String)");
        myRun.run();

    }
}
class BaseC{
    Runnable getRun(String str1){
        class MyRunnable implements Runnable{

            @Override
            public void run() {
                System.out.println("-- Runnable Run : " + str1);
            }
        }
        return new MyRunnable();
    }
}
-- Runnable Run : (Test String)

Runnable 익명 클래스

익명 클래스란 이름이 없는 클래스 입니다. 클래스를 한번 사용하기 위해서 새로운 클래스를 만들다 보면 효율성이 떨어집니다. 그럴 때 익명 클래스를 사용할 수 있습니다. Runnable 인터페이스를 바로 사용할 수 있습니다. 인터페이스는 추상클래스라고 했습니다.

아래의 코드처럼 굳이 클래스에 인터페이스를 구현하지 않아도 생성과 동시에 오버라이드를 하면 인터페이스만으로도 사용할 수 있습니다. 인터페이스냐 아니냐가 클래스로 사용하는 기준이 아니라 추상메소드를 구현했는지 여부가 기준입니다.

public class Main {
    static int count = 10;

    public static void main(String[] args) {
        Runnable myRun = new Runnable() {
            @Override
            public void run() {
                System.out.println("Runnable 익명 클래스 사용: " + count);
            }
        };
        myRun.run();
    }
}
public class Main {
    static int count = 10;

    public static void main(String[] args) {
        Main m1 = new Main();
        Runnable myRun = m1.getMyRunnable();
        myRun.run();
    }
    
    Runnable getMyRunnable(){
        return new Runnable() {
            @Override
            public void run() {
                System.out.println("Runnable 익명 클래스 사용: " + count);
            }
        };
    }
}
Runnable 익명 클래스 사용: 10

이런 형식의 익명클래스는 다른 객체지향언어에서도 자주 사용되는 형식입니다.

요약

자바 내부 클래스의 예제코드를 살펴봤습니다. 문법적으로 보면 좀 복잡해 보입니다.

단 익명 클래스 방식의 프로그래밍은 JDK의 인터페이스를 사용하면서 클래스를 만들지 않아도 되니 자주 사용하게 될 것 입니다. 불필요한 코드수를 줄이는 것도 코드를 알아보기 쉽게 만듭니다. 파이썬같이 현대적 흐름을 타는 프로그래밍 언어들은 점점 문법이 짧아지고 있습니다.

고수준 프로그래밍에서는 핵심을 나타내는 키워드만 조합해서 프로그래밍을 만들수 있기를 기대합니다. 1001 AND 0001 이렇게 low level (저수준)이 아니라 점점 high level (고수준)을 추구하고 있습니다. 그러다 보니 라이브러리나 프레임워크가 발달하는 것은 당연한 과정입니다.

고수준 프로그래밍의 특징은 세부적인 내용은 잘 알지못하는 특징이 있습니다. 알지 못하거나 혹은 알 필요가 없거나 둘 다입니다.

훌륭한 프로그래머들은 저수준과 고수준을 둘다 이해할 수 있습니다. 프로그래밍의 세계는 방대해서 컴퓨터의 모든 것을 이해하는 것은 어렵지만, 그럼에도 불구하고 깊은 이해가 필요한 경우가 있습니다.

그래서 자바(Java)를 배워서 어떤 프로그래머가 되야하는가? 어떤 프로그래머가 될 수 있는가? 에 대한 대답은 스스로 찾는 수밖에 없습니다.

직업적인 목적이라면 내가 일하려는 기업이나 현재 IT업계 흐름에 그 답이 있겠고, 전문성을 커리어로 가져간다는 관점에서 보면 나는 어떤 프로그램을 설계하려는가? 라는 질문을 스스로에게 던져야 합니다.

뭐 딱히 답이 정해진 문제가 아니라 열린 답이기 때문에 막연하기도 하지만 지루할 일은 없죠.

그런데 이 질문에 지금 당장은 아니더라도 언젠가 스스로에게 답해야 한다고 생각합니다. 단순한 프로그래밍 – 이 아니라 시대가 필요하는 IT기술을 끝까지 가져가기 위해서는 납득할 만한 답을 기대합니다.

참고문서

Nested Classes (oracle.com)

자바 내부 클래스 (oracle.com)

Java – Inner classes – Tutorialspoint

Java Inner Class (Nested Class) (w3schools.com)

Leave a Comment