지식보부상님의 공부 일지

Java [09] 중첩 선언과 익명 객체 본문

KB IT's Your Life/Java

Java [09] 중첩 선언과 익명 객체

지식보부상님 2025. 4. 24. 09:41

[1] 중첩 클래스 

◈ 중첩 클래스 (Nested Class)

- 클래스 내부에 선언한 클래스

- 클래스 멤버 쉽게 설명 가능, 외부엔 중첩 관계임을 감춰서 코드 복잡성 ↓

- 멤버 클래스: 클래스 멤버로서 선언되는 중첩 클래스

- 로컬 클래스: 메소드 내부에서 선언되는 중첩 클래스


[2] 인스턴스 멤버 클래스 

◈ 인스턴스 멤버 클래스

[public] class A {
    [public | private] class B { ... }
}

- 주로 클래스 A 내에서 사용되므로 private 접근자를 가짐

- 클래스 A가 생성 되어야, 클래스 B 접근 가능

- 클래스 B는 클래스 A 내의 static 클래스/메서드에서는 생성 불가


[3] 정적 멤버 클래스

◈ 정적 멤버 클래스

[public] class A {
    [public | private] static class B { ... } // 주로 public
}

- A객체 생성 없이 A 클래스로 접근해서 B 객체 생성 가능

A.B b = new A.B();

[4] 로컬 클래스 

◈ 로컬 클래스 (Local Class)

- 생성자 또는 메소드 내부에서 선언된 클래스

- 로컬 변수(생성자 또는 메소드의 매개변수 또는 내부에서 선언된 변수)를 로컬 클래스에서 사용할 경우 값을 읽을 수만 있고 수정 불가 (final 특성 가짐)


[5] 바깥 멤버 접근 

◈ 바깥 클래스의 멤버 접근 제한

- 인스턴스 멤버 클래스: 바깥 클래스의 모든 필드, 메소드 사용 가능

- 정적 멤버 클래스: 바깥 클래스의 정적 필드, 정적 메소드 사용 가능

 

◈ 바깥 클래스의 객체 접근

- 중첩 클래스 내부에서 바깥 클래스 객체 얻으려면 바깥클래스이름.this 로 접근

- 바깥클래스이름.this.메소드명, 바깥클래스이름.this.필드명


[6] 중첩 인터페이스 

◈ 중첩 인터페이스

- 클래스의 멤버로 선언된 인터페이스 (해당 클래스와 긴밀한 관계 맺기 위함)

class A {
    [public | private] [static] interface B { ... }
}

- 주로 안드로이드 같은 UI 프로그램에서 이벤트 처리할 목적으로 사용

 

더보기

Button.java

package ch09.sec06.exam03;

public class Button {
    // 정적 멤버 인터페이스
    public static interface ClickListener {
        // 추상 메소드
        void onClick();
    }

    // 필드
    private ClickListener clickListener;

    // 메소드
    public void setClickListener(ClickListener clickListener) {
        this.clickListener = clickListener;
    }

    // 버튼 클릭됐을 때 실행 메소드
    public void click() {
        this.clickListener.onClick();
    }
}

 

ButtonMain.java

public class ButtonMain {
    public static void main(String[] args) {
        // Ok 버튼 객체 생성
        Button btnOk = new Button();

        //Ok 버튼 클릭 이벤트 처리할 ClickListener 구현 클래스
        class OkListener implements Button.ClickListener {
            @Override
            public void onClick() {
                System.out.println("Ok 버튼 클릭");
            }
        }

        //Ok 버튼 객체에 ClickListener 구현 객체 주입
        btnOk.setClickListener(new OkListener());

        //Ok 버튼 클릭하기
        btnOk.click();

        //Cancel 버튼 객체 생성
        Button btnCancel = new Button();

        //Cancel 버튼 처리할 메소드
        class CancelListener implements Button.ClickListener {
            @Override
            public void onClick() {
                System.out.println("Cancel 버튼 클릭");
            }
        }

        //Cancel 버튼에 ClickListener 구현 객체 주입
        btnCancel.setClickListener(new CancelListener());

        // Cancel 버튼 클릭
        btnCancel.click();
    }
}

[7] 익명 객체 

◈ 익명 객체 (anonymous)

- 이름 없는 객체, 명시적으로 클래스 선언 x => 쉬운 객체 생성 가능

- 주로 필드값, 로컬 변수값, 매개변수값으로 사용

- 클래스 상속하거나 인터페이스 구현해야만 생성 가능

- 익명 자식 객체: 클래스 상속해서 만든 익명 객체

- 익명 구현 객체: 인터페이스 구현해서 만든 익명 객체

 

◈ 익명 자식 객체

- 부모 클래스 상속받아 생성되는 객체

new 부모생성자(매개값, ...) { ... }

 

더보기

Tire.java

public class Tire {
    public void roll() {
        System.out.println("타이어가 굴러갑니다.");
    }
}

 

Car.java

public class Car {
    private Tire tire1 = new Tire();

    // 필드에 익명 자식 객체
    private Tire tire2 = new Tire() {
        @Override
        public void roll() {
            System.out.println("필드의 익명 자식 객체에서 구릅니다.");
        }
    };

    public void run1() {
        tire1.roll();
        tire2.roll();
    }

    // 익명 자식이 로컬 변수로
    public void run2() {
        // 메소드 내 익명 자식 객체
        Tire tire = new Tire() {
            @Override
            public void roll() {
                System.out.println("메소드의 익명 자식 객체에서 구릅니다.");
            }
        };
        tire.roll();
    }

    public void run3(Tire tire) {
        tire.roll();
    }
}

 

CarMain.java

public class CarMain {
    public static void main(String[] args) {
        Car car = new Car();

        // 익명 자식 객체가 대입된 필드 사용
        car.run1();

        // 익명 자식 객체가 대입된 로컬변수 사용
        car.run2();

        car.run3(new Tire(){
           @Override
           public void roll() {
               System.out.println("매개변수로 이용된 익명 자식이 구릅니다.");
           }
        });
    }
}

 

실행 결과

 

'KB IT's Your Life > Java' 카테고리의 다른 글

Java 정리본 링크 정리  (2) 2025.04.24
Java [10] 라이브러리와 모듈  (0) 2025.04.24
Java [08] 인터페이스  (0) 2025.04.23
Java [07] 상속  (1) 2025.04.22
Java [06] 클래스  (1) 2025.04.22