This is a blog.

자바 기록 11일차 본문

JAVA/Book Summary

자바 기록 11일차

Calcot 2021. 6. 14. 20:11

혼자 공부하는 자바 / 저자: 신용권.

chapter09. 중첩 클래스와 중첩 인터페이스 정리.

 

 

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

 

 

중첩 클래스

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

두 클래스의 멤버들을 서로 쉽게 접근할 수 있다.

외부에는 불필요한 관계 클래스를 감춤으로 코드의 복잡성을 줄일 수 있다.

class ClassName {

class NestedClassName {

 

}

}

 

중첩 인터페이스

클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해 인터페이스를 내부에서 선언한다.

class ClassName {

interface NestedInterfaceName{

 

}

}

 

 

중첩 클래스 : 멤버 클래스, 로컬 클래스

멤버 클래스

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

- 클래스나 객체가 사용 중이라면 언제든지 재사용이 가능.

로컬 클래스

- 생성자 또는 메소드 내부에서 선언되는 중첩 클래스.

- 메소드를 실행할 때만 사용되고 메소드가 종료되면 없어진다.

 

 

인터페이스 멤버 클래스

static 키워드 없이 중첩 선언된 클래스.

인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.

선언 방법

- A 클래스 외부에서 B 객체를 생성하려면 먼저 A 객체를 생성하고 B객체를

생성해야 한다.

ex) A클래스 외부

A a = new A();

A.B b = a.new B():

b.field1 = 3;

b.method();

 

A클래스 내부

class A {

class B{ ... }

 

void methodA(){

B b = new B();

b.field = 3;

b.method1();

}

 

=> 대부분 A 클래스 내부에서 B 객체를 생성해서 사용.

 

 

정적 멤버 클래스

static 키워드로 선언된 클래스.

모든 종류의 필드와 메소드를 선언할 수 있다.

인스턴스 멤버 클래스와 달리 A객체를 생성할 필요가 없다.

ex) A.C = new A.C();

c.field1 = 3;

c.method1();

 

 

로컬 클래스

접근 제한자(public, private) static을 붙일 수 없다.

=> 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문.

=>정적 필드와 메소드는 선언할 수 없다.

메소드 내에서 객체를 생성하고 사용해야 한다.

 

 

 

중첩 클래스의 접근 제한

바깥 클래스와 메소드에서 사용 제한

- 인스턴스 멤버 클래스는 바깥 클래스의 인스턴스 필드의 초기값이나

인스턴스 메소드에서 객체를 생성할 수 있다.

- 정적 필드의 초기값이나 정적 메소드에서는 객체를 생성할 수 없다.

- 정적 멤버 클래스는 모든 필드의 초기값이나 모든 메소드에서 객체를 생성할 수 있다.

멤버 클래스에서 사용 제한

- 인스턴스 멤버 클래스 안에서는 바깥 클래스의 모든 필드와 메소드에 접근 가능.

- 정적 멤버 클래스 안에서는 바깥 클래스의 정적 필드와 메소드에만 접근이 가능하고

인스턴스 필드와 메소드에는 접근할 수 없다.

로컬 클래스에서 사용 제한

- 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 제한이 있다.

=> 매개 변수와 로컬 변수에 final 특성을 갖고 있다.

중첩 클래스에서 바깥 클래스 참조 얻기

- 바깥클래스.this.필드

바깥클래스.this.메소드();

 

 

중첩 인터페이스

클래스의 멤버로 선언되 인터페이스.

인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능.

인스턴스 멤버 인터페이스 = 바깥 클래스의 객체가 있어야 사용 가능.

정적 멤버 인터페이스 = 바깥 클래스의 객체 없이 바깥 클래스만으로 바로 접근할 수 있음.

-> 주로 UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용.

 

 

익명 객체

이름이 없는 객체.

조건 = 클래스를 상속하거나 인터페이스를 구현해야 한다.

상속의 경우, 부모클래스 변수 = new 부모 클래스(){...}

구현의 경우, 인터페이스 변수 = new 인터페이스(){...}

 

익명 자식 객체 생성

자식 클래스가 재사용되지 않고, 오로지 특정 위치에서 사용할 경우라면 익명 자식 객체를 생성해서 사용하는 것이 좋은 방법.

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

//필드

//메소드

}

생성자는 선언할 수 없다.

익명 자식 객체에서 새롭게 정의된 필드와 메소드는 익명 자식 객체 내부에서만 사용.

외부에서는 접근할 수 없다.

=> 부모 타입 변수에 대입되었기 때문에 부모 타입에 선언된 것만 사용할 수 있기 때문.

필드의 초기값, 로컬 변수의 초기값, 매개 변수에 대입이 가능하다.

 

익명 구현 객체 생성

- 구현 클래스가 재사용되지 않고, 오로지 특정 위치에서 사용할 경우, 익명 구현 객체를 생성한다.

- 필드의 초기값, 로컬 변수의 초기값, 매개값으로 대입이 가능하다.

 

- 인터페이스 [필드|변수] = new 인터페이스(){

//인터페이스에 선언된 추상 메소드의 실체 메소드 선언

//필드

//메소드

}

 

 

익명 객체의 로컬 변수 사용

메소드의 매개 변수나 로컬 변수를 익명 객체 내부에서 사용할 때 제한이 있다.

매개 변수나 로컬 변수가 수정되어 값이 변경되면 익명 객체에 복사해 둔 값과 달라지므로 매개 변수와 로컬 변수를 final로 선언해야 한다.

 

'JAVA > Book Summary' 카테고리의 다른 글

자바 기록 13일차  (0) 2021.06.17
자바 기록 12일차  (0) 2021.06.15
자바 기록 10일차  (0) 2021.06.10
자바 기록 9일차  (0) 2021.06.09
자바 기록 8일차  (0) 2021.06.08
Comments