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

2022. 11. 21. 19:46· 교육 | 외부활동/이론_JAVA
목차
  1. 익명 객체
  2. 익명 자식 객체 생성
  3.  
반응형

중첩 클래스 

클래스의 멤버로서 선언되는 중첩 클래스를 멤버 클래스라고 하고, 메소드 내부에서 선언되는 중첩 클래스를 로컬 클래스라고 한다.,

인스턴스 멤버 클래스

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

class A {
 //인스턴스 멤버 클래스
 Class B {
 B() {} //생성자
     int field1; //인스턴스 필드
     //static int field2; //정적 필드(X)
     void method1() {} //인스턴스 메소드
     //static void method2() {} //정적 메소드 (X)
 }
}
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();

 

정적 멤버 클래스

정적 멤버 클래스는 모든 종류의 필드와 메소드를 선언할 수 있다.

class A {
 //정적 멤버 클래스
 static Class C {
 C() {} //생성자
     int field1; //인스턴스 필드
     static int field2; //정적 필드 (O)
     void method1() {} //인스턴스 메소드
     static void method2() {} //정적 메소드 (O)
 }
}
A.C c = news A.C();
c.field1 = 3;
c.method1();
A.C.field2 = 3;
A.C.method2();

 

로컬 클래스

로컬 클래스는 접근 제한자 및 static을 붙일 수 없다. 로컬 클래스는 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문이다.

 

로컬 클래스에서 사용 제한

로컬 클래스에서 사용된 매개 변수와 로컬 변수는 모두 final 특성을 갖는다. 자바7까지는 반드시 final 키워드를 붙여야 하지만 8버전 부터는 붙이지 않아도 final 특성을 가지고 있음을 주목해야 한다.

 

 

중첩 인터페이스

중첩 인터페이스는 클래스의 멤버로 선언된 인터페이스를 말한다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다. 특히 UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용된다.

package sec04.exam01_nestedinterface;
public class Button {
	OnClickListener listener; // 인터페이스 타입 필드
	void setOnClickListener(OnClickListener listener) { // 매개 변수의 다형성
		this.listener = listener;
	}
	void touch() {
		listener.onClick(); // 구현 객체의 onClick() 메소드 호출
	}
	interface OnClickListener { // 중첩 인터페이스
		void onClick();
	}
}

 

익명 객체

익명 객체는 이름이 없는 객체를 말한다.

-익명 객체는 단독 생성 불가

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

사용 위치

 - 필드의 초기값, 로컬 변수의 초기값, 매개변수의 매개값으로 주로 대입

 - UI이벤트 처리 객체나, 스레드 객체를 간편하게 생성할 목적으로 주로 활용한다.

 

익명 자식 객체 생성

1) 부모 타입으로 필드나 변수를 선언하고 자식 객체를 초기값으로 대입할 경우

 - 자식 클래스가 재사용되지 않고, 오로지 해당 필드와 변수의 초기값으로만 사용할 경우라면 익명 자식 객체를 생성해서 초기값으로 대입하는 것이 좋은 방법이다.

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

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

// 기본형
부모클래스 [필드|변수] = new 부모클래스(매개값,...) {
 // 필드
 // 메소드
};
// 기본적인 방법
class Child extends Parent {} // 자식 클래스 선언
class A {
	Parent field = new Child(); // 필드에 자식 객체를 대입, 다형성(객체의 부품화)을 위함.
	void method() {
		Parent localVar = new Child(); // 로컬 변수에 자식 객체를 대입
	}
}
// 익명 자식 객체 생성해서 초기값으로 대입하는 방법
class A {
	Parent field = new Parent() { // A 클래스의 필드 초기값으로 익명 자식 객체를 생성해서 대입한다.
		int childField;
		void childMethod() {}
		@Override
		void parentMethod() {}
	};
}

 

2) 익명 객체에 새롭게 정의된 필드와 메소드

 - 익명 객체 내부에서만 사용

 - 외부에서는 익명 객체의 필드와 메소드에 접근할 수 없음 --> 이유 : 익명 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만사용 가능

 

익명 구현 객체 생성

 - 구현 클래스가 재사용되지 않고, 오로지 해당 필드와 변수의 초기값으로만 사용하는 경우라면 익명 구현 객체를 초기값으로 대입하는 것이 좋다.

 

// 기본형
인터페이스 [필드|변수] = new 인터페이스() {
 // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
 // 필드
 // 메소드
};
// 일반적인 구현 객체를 초기값으로 대입하는 경우
class TV implements RemoteControl { }
class A {
 RemoteControl field = new TV(); // 필드에 구현 객체를 대입
 void method() {
 RemoteControl localVar = new TV(); // 로컬 변수에 구현 객체를 대입
 }
}
// 익명 구현 객체를 초기값으로 대입하는 경우
class A {
 RemoteControl field = new RemoteControl() { // 필드 선언
 @Override
 void turnOn() {}
 };
 void method() {
 RemoteControl localVar = new RemoteControl() { // 로컬 변수 선언
 @Override
 void turnOn() {}
 };
 }
 void method1(RemoteControl rc) {}
 void method2() {
 method1(
 new RemoteControl() { // method1()의 매개값으로 익명 구현 객체를 대입
 @Override
 void turnOn() {}
 }
 );
 }
}

 

반응형

'교육 | 외부활동 > 이론_JAVA' 카테고리의 다른 글

KH_JAVA_13_예외처리  (0) 2022.11.21
KH_JAVA_11_인터페이스  (0) 2022.11.18
KH자바수업_10_추상 클래스  (2) 2022.11.17
KH자바수업_9_다형성  (0) 2022.11.14
KH자바수업_8_상속  (0) 2022.11.14
  1. 익명 객체
  2. 익명 자식 객체 생성
  3.  
'교육 | 외부활동/이론_JAVA' 카테고리의 다른 글
  • KH_JAVA_13_예외처리
  • KH_JAVA_11_인터페이스
  • KH자바수업_10_추상 클래스
  • KH자바수업_9_다형성
wn1331
wn1331
반응형
wn1331
JONGHUN
wn1331
전체
오늘
어제
  • 분류 전체보기 (268)
    • Spring (16)
      • Spring Data JPA (0)
      • Spring Security (11)
      • Spring Batch (5)
    • DEV (40)
      • FrontEnd (2)
      • JAVA (5)
      • Git (1)
      • 기타 (6)
      • Network (1)
      • MSA (12)
      • 개발일기 || 트러블슈팅 (5)
      • 행사 || 후기 (3)
      • GraphQL (3)
      • Kotlin (0)
      • Database (2)
    • 코딩테스트 (164)
      • Programmers_LV0 (100)
      • Programmers_LV1 (54)
      • 백준 (8)
      • Algorithm (1)
    • 교육 | 외부활동 (44)
      • 이론_JAVA (13)
      • ORACLE (12)
      • PUBLISHING (6)
      • JAVASCRIPT (5)
      • JQuery (0)
      • 항해99 플러스 백엔드 (8)
    • 기본지식 (0)
    • 끄적끄적 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 학부생(용인대학교 컴퓨터과학과 1~4학년) 네이버 블로그는⋯

인기 글

태그

  • 항해플러스
  • 스프링 부트
  • 스프링
  • MySQL
  • spring security
  • 항플
  • Spring
  • 압축
  • 세션
  • Spring Batch
  • java
  • Spring Boot
  • transaction
  • Step
  • 항플 백엔드
  • 스프링 시큐리티
  • MSA
  • SESSION
  • JPA
  • 항해99

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
wn1331
KH_JAVA_12_중첩 클래스와 중첩 인터페이스
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.