Java

250211_Java 중첩 클래스

minquu 2025. 2. 11. 22:28
반응형

중첩 클래스?

 - 클래스 내부에서 또 다른 클래스를 선언하여 사용하는 방법임

 - SOLID 기준으로 단일 책임 원칙 (Single responsibility principle) 에는 조금 위배되는 내용이긴 하나 사용할 수 있는 기법이긴 함

 

단일 책임 원칙 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍에서 단일 책임 원칙(single responsibility principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일

ko.wikipedia.org

- 자바에서 사용하는 중첩 클래스의 사용 방법은 크게 3가지로 생각됌

 

 

 1. static를 사용하여 선언 되는 클래스 내부에서 static 처럼 사용하는 방법

 2. 내부 클래스 (inner class)로 사용하여서 인스턴스 변수 처럼 사용하는 방법

 3. 지역 클래스 (local class)로 사용하여서 메서드 내부에서 지역 변수로 사용하는 방법


 

1번 방법. 예제 코드 

  - OutClass1 안에서 static class NestedClass  작성

  - static 이기 때문에 별도의 인스턴스 없이 OutClass1 인스턴스 시 static 개념으로 메모리 적재 됌

package Chapter20;

//정적 중첩 클래스 완성
public class OutClass1 {
    static class NestedClass{

        //hello 메서드 만들기
        public void Hello(){
            System.out.println("Nested.hello");
        }
    }
}

 구현부

package Chapter20;

public class OuterClassMain {
    public static void main(String[] args) {
        OutClass1.NestedClass nestedClass = new OutClass1.NestedClass();
        nestedClass.Hello();
    }
}

사용부

 

 

 

2번 방법. 예제 코드

- OutClass2 안에 일반적으로 Class 를 선언 해줌

- static 이 아니기 때문에 사용하기 위해서는 별도로 인스턴스를 시켜야지 메모리에 적재 됌

package Chapter20;

public class OuterClass2 {
    //InnerClass 구현 및 hello 메서드 만들기
    class InnerClass {
        public void Hello(){
            System.out.println("Hello java");
        }
    }
}

구현부

package Chapter20;

public class OuterClass2Main {
    public static void main(String[] args) {
        OuterClass2 outerClass2 = new OuterClass2();
        OuterClass2.InnerClass innerClass = outerClass2.new InnerClass();
        innerClass.Hello();
    }
}

사용부

 

 

3번 방법. 예제 코드

- OutClass3 클래스의 MyMethod 함수 안에 LocalClass 선언을 진행함

- 로컬 클래스로 사용하기 때문에 현재 메서도 스코프 안에서만 메모리 라이프가 생존하고, 사용하기 위해서는 new 인스턴스를 해줘야함

package Chapter20;

public class OuterClass3 {
    public void MyMethod() {
        //지역 클래스 LocalClass를 구현하고 hello()호출

        class LocalClass {
            public void Hello() {
                System.out.println("Hello Java");
            }
        }

        LocalClass localClass = new LocalClass();
        localClass.Hello();
    }
}

구현부

package Chapter20;

public class OuterClass3Main {
    public static void main(String[] args) {
        OuterClass3 obj = new OuterClass3();
        obj.MyMethod();
    }
}

사용부

 

익명 함수 활용 방법

- 이 방법은 인터페이스를 사용해서 함수 지향 프로그래밍 방법 처럼, 익명 클래스를 사용하는 방법 임

- new 인스턴스를 진행한 로컬 스코프 내부에서 라이프가 살아 있는 휘발적일 수도 있는 방법

- 단일 기능 및 인터페이스의 확장을 활용하기 위한 방법으로 생각 됌

 

package Chapter20;

public interface Hello {
    void hello();
}

인터페이스 선언

 

package Chapter20;

public class AnonymousMain {
    public static void main(String[] args) {

        Hello hello = new Hello(){
            @Override
            public void hello() {
                System.out.println("Hello java");
            }
        };

        hello.hello();
    }
}

사용부

반응형

'Java' 카테고리의 다른 글

250224_ 자바 GUI 기능들..  (0) 2025.02.24
250213_자바 FileIOStream 클래스들  (0) 2025.02.13
250212_자바 람다식, 스트림, 예외처리  (1) 2025.02.12