JAVA(중첩 선언 / 익명 개체)

김민성·2023년 7월 7일

JAVA

목록 보기
8/11

중첩 클래스

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

  • 클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스만 관계를 맺을 경우에는 중첩 클래스로 선언하는 것이 유지보수에 좋음
  • 클래스 멤버를 쉽게 사용할 수 있고 외부에는 중첩 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있음

인스턴스 멤버 클래스

  • 주로 클래스 내부에서 사용되므로 private 접근 제한을 갖는 경우가 많음
  • B 객체는 A 클래스 내부 어디에서나 생성은 X. 인스턴스 필드값, 생성자, 인스턴스 메소드에서 생성 가능
    -> A 객체가 있어야 B 객체도 생성할 수 있기 때문
[public] class A {
	[public | | private] class B {
    }
}
  • public class B : 다른 패키지에서 B 클래스 사용 가능
  • class B : 같은 패키지에서만 B 클래스 사용 가능
  • private class B : A 클래스 내부에서만 B 클래스 사용 가능

static 멤버 클래스

  • static 멤버 클래스는 A 클래스 내부에서 사용되기도 하지만 A 클래스 외부에서 A와 함께 사용되는 경우가 많기 때문에 default / public 접근 제한을 가짐.
[public] class A {
	[public | | private] static class B {
    }
}
  • public static class B : 다른 패키지에서 B 클래스 사용 가능
  • static class B : 같은 패키지에서만 B 클래스 사용 가능
  • private static class B : A 클래스 내부에서만 B 클래스 사용 가능

로컬 클래스

[public] class A {
	public A() {
    class B() { }
    }
    public void method() {
    class B () { }
    }
}
  • 로컬 클래스는 생성자와 메소드가 실행될 동안에만 객체를 생성할 수 있음
  • 로컬 변수를 로컬 클래스에서 사용할 경우 로컬 변수는 final 특성을 갖게 됨
    -> 로컬 클래스 내부에서 값을 변경하지 못하도록 제한하기 때문

바깥 멤버 접근

: 중첩 클래스는 바깥 클래스와 긴밀한 관계를 맺으면서 바깥 클래스의 멤버에 접근 가능

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

: static 멤버 클래스 내부에서는 바깥 클래스 멤버를 사용할 때 제약 있음

  • 인스턴스 멤버 클래스 : 바깥 클래스의 모든 필드와 메소드
  • static 멤버 클래스 : 바깥 클래스의 static필드와 static메소드
    -> static 멤버 클래스는 바깥 객체가 없어도 사용 가능해야 하므로 바깥 클래스의 인스턴스 필드와 인스턴스 메소드는 사용하지 못함

바깥 클래스의 객체 접근

: 중첩 클래스 내부에서 this는 해당 중첩 클래스 객체
-> 중첩 클래스 내부에서 바깥 클래스의 객체를 얻으려면 바깥클래스이름.this

중첩 인터페이스

: 클래스의 멤버로 선언된 인터페이스
-> 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위함

  • 안드로이드와 같은 UI프로그램에서 이벤트를 처리하기 위해 주로 사용
    -> 버튼을 눌렀을 때 이벤트를 처리할 객체는 중첩 인터페이스로 구현

익명 객체

: 이름이 없는 객체

  • 명시적으로 클래스를 선언하지 않기 때문에 쉽게 객체를 생성할 수 있다는 장점
  • 필드값, 로컬 변수값, 매개변수값으로 주로 사용
  • 클래스를 상속하거나 인터페이스를 구현해야만 생성 가능
    -> 클래스를 상속할 경우 익명 자식 객체, 인터페이스를 구현할 경우 익명 구현 객체

익명 자식 객체

new 부모생성자(매개값, ...) {
	//필드
    //메소드
}
  • 중괄호 블록 안의 필드/메소드는 중괄호 블록 안에서만 사용 가능
    -> 익명 자식 객체는 부모 타입에 대입되므로 부모 타입에 선언된 멤버만 접근할 수 있음
  • 중괄호 블록 안에는 주로 부모 메소드를 재정의

익명 구현 객체

new 인터페이스() {
	//필드
    //메소드
}
  • 중괄호 블록 안의 필드/메소드는 중괄호 블록 안에서만 사용 가능
    -> 익명 구현 객체는 인터페이스 타입에 대입되므로 인터페이스 타입에 선언된 멤버만 접근할 수 있기 때문
  • 중괄호 블록 안에는 주로 인터페이스의 추상 메소드를 재정의

0개의 댓글