자바 중첩 클래스와 중첩 인터페이스

Dear·2025년 5월 21일

TIL

목록 보기
26/74

💙 중첩 클래스와 중첩 인터페이스

클래스 내부에 선언한 클래스와 인터페이스

class MyClass {
	class NestedMyClass{ int field1; void method1() { } } // 중첩 클래스
	interface NestedMyInterface{ } // 중첩 인터페이스
}

// MyClass 외부에서 NestedMyClass(인스턴스 멤버 클래스)의 객체를 생성하려면
// 먼저 MyClass 객체를 생성하고 NestedMyClass 객체를 생성해야한다.

MyClass myclass = new MyClass();
MyClass.NestedMyClass nestedmyclass = myclass.new NestedMyClass();
nestedmyclass.field1 = 3;
nestedmyclass.method1();

// static 키워드로 정적 멤버 클래스도 생성 가능하다. 
// static 특징처럼 따로 MyClass 객체를 생성할 필요가 없다. 
MyClass.NestedMyClass nestedmyclass = new MyClass.NestedMyClass(); // static으로 NestedMyClass 선언할 경우

// 클래스 내부의 메소드 내부에서도 선언 가능하다. 
// 메소드 내에서만 사용하기 때문에 static 과 접근 제한자를 붙일 수 없다.
class A{
	void method(){
		class B{ } // 중첩 클래스
	}
}

💙 익명 객체

이름이 없는 객체 의미한다.
프로그램에서 일시적으로 한번만 사용되고 버려지는 객체이다.
(재사용이 되지 않는다)

단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야만 생성 가능하다.

하나의 실행문이므로 끝에는 세미콜론(;)을 반드시 붙여야 한다.

부모클래스 [필드|변수] = new 부모클래스(매개값, ... ) {
	// 필드
	//메소드
};

// 부모 클래스
// 일시적으로 정의된 익명객체를 담아둘 변수로 사용되기도 하고
// 익명객체가 무엇을 재정의해야할지 어느정도 컨셉을 잡아주는 역할(상속개념)
public class Insect{
	void attack(){
		System.out.println("곤충을 공격을 한다");
	}
}

public class Anoymous{
  // 방법 1 : 필드에 익명자식 객체를 생성
  Insect spider1 = new Insect(){
    String name = "무당거미";
    
    // 거미줄을 치다
    void cobweb(){
        System.out.println("사각형으로 거미줄을 친다.");
    }
    
    @Override
    void attack(){
        System.out.println(name + "독을 발사한다.");
				cobweb();
    }
  };
  
  // 방법 2 : 로결변수의 초기값으로 대입
  void method1(){
      Insect spider2 = new Insect(){
          String name = "늑대거미";
          // 거미줄을 치다
          void cobweb(){
              System.out.println("육각형으로 거미줄을 친다.");
          }
          @Override
          void attack(){
              System.out.println(name + "앞니로 문다.");
          }
      };
      
       // 로컬변수이기 때문에 메서드에서 바로 사용 가능
      spider2.attack();
      
  }
  
  // 방법 3 : 익명객체 매개변수로 대입
  void method2(Insect spider){
      spider.attack();
  }
}

// 사용
public static void main(String[] args) {
	
	Anoymous a = new Anoymous();
	
	// 방법 1 : 익명객체 필드 사용
	a.spider1.attack();
	
	// 방법 2 : 익명개체 로컬 변수 사용
	a.method1();
	
	// 방법 3 : 매개변수로 익명객체 사용
	a.method2(new Insect(){
	  String name = "타란툴라";
	
	  // 거미줄을 치다
	  void cobweb(){
	      System.out.println("그냥 마구잡이로 거미줄을 친다.");
	  }
	  @Override
	  void attack(){
	      System.out.println(name + " 공격 안하고 후퇴힌다.. ");
	  };
	});   
}

일반 클래스와의 차이점은 생성자를 선언할 수 없다는 것이다.

🤍 회고

읽을 때는 이해가 되지만, 점점 갈수록 "그래서 이게 무슨 의미지?"라는 생각이 든다. 실제로 예제를 직접 적용해보면서 익혀야 제대로 이해가 되는 것 같다.

profile
친애하는 개발자

0개의 댓글