중첩 선언과 익명 객체
: 중첩 클래스 - 인스턴스 클래스 - 정적 멤버 클래스 - 로컬 클래스
- 바깥 멤버 접근 - 중첩 인터페이스 - 익명객체. => 람다식.
중첩 클래스
- 클래스 내부에 선언한 클래스. 클래스의 멤버를 쉽게 사용할 수 있고
외부에는 중첩 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있음
- 멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스
- 로컬 킅래스 : 메소드 내부에서 선언 되는 중첩 클래스
인스턴스 멤버 클래스 객체 생성 조건 A 객체를 생성해야만 B 객체를 생성할 수 있음
class A {
class B {
정적 멤버 클래스 객체 생성 보건 A 객체를 하지 않아도 B 객체를 생성할 수 있음
class A {
static class B {
인스턴스 멤버 클래스
- A 클래스의 멤버로 선언된 B 클래스
[public] class A {
[public : private] class B { // 인스턴스 멤버 클래스
}
}
package com.example;
/*
* 클래스 - 필드 / 로컬
* 인스턴스 멤버 클래스 / 정적 멤버 클래스
*/
public class NestedClassExample {
int outNum;
static int outNum2;
// 인스턴스 클래스
class A {
int num;
static int num2;
static {
}
void xxx() {
outNum = 10;
outNum2 = 20;
}
static void yyy() {
}
}
static void outerMethod() { // 정적 메소드
// outNum = 10; // (X) static 에서 인스턴스 필드 접근이 불가.
outNum2 = 10;
}
// 정적 클래스
static class B { // 정적 메소드와 같은 특성을 가지고 있다.
int num;
static int num2;
static {
}
void xxx() {
// outNum = 10; // (X) outer의 요소가 static 이 아니기 때문에 접근 불가 .
outNum2 = 20; // outer static 접근 가능.
}
static void yyy() {
}
}
public static void main(String[] args) {
// 로컬 클래스
class C {
int num;
static int num2;
static {
}
void xxx() {
// outNum = 10; // (X)인스턴스는 new 생성으로 정의를 따로 해주어야 접근이 가능.
outNum2 = 20;
}
static void yyy() {
}
}
}
}
구분 접근범위
public class B {} 다른 패키지에서 B 클래스를 사용할 수 있다.
class B {} 같은 패키지에서만 B 클래스를 사용할 수 있다.
private class B {} A 클래스 내부에서만 B 클래스를 사용할 수 있다.
- 인스턴스 멤버 클래스 B는 주로 A클래스 내부에서 사용되므로
private 접근 제한을 갖는 것이 일반적
정적 멤버 클래스
- static 키워드와 함께 A 클래스의 멤버로 선언된 B 클래스
[public] class A {
[public : private] static class B { // 정적 멤버 클래스
}
}
구분 접근범위
public static class B {} 다른 패키지에서 B 클래스를 사용할 수 있다.
static class B {} 같은 패키지에서만 B 클래스를 사용할 수 있다.
private static class B {} A 클래스 내부에서만 B 클래스를 사용할 수 있다.
- 정적 멤버 클래스는 주로 default 또는 public 접근 제한을 가짐.
로컬 클래스
- 생성자와 메소드가 실행될 동안에만 객체를 생성할 수 있음
바깥 멤버 접근
바깥 클래스의 멤버 접근 제한
- 정적 멤버 클래스 내부에서는 바깥 클래스의 필드와 메소드를 사용할 때 제한이 따름
구분 바깥클래스의 사용 가능한 멤버
인스턴스 멤버 클래스 바깥 클래스의 모든 필드와 메소드
정적 멤버 클래스 바깥 클래스의 정적 필드와 정적 메소드
- 정적 멤버 클래스는 바깥 객체가 없어도 사용 가능해야 하므로
바깥 클래스의 인스턴스 필드와 인스턴스 메소드는 사용하지 못함.
바깥 클래스의 객체 접근
- 중첩 클래스 내부에서 바깥 클래스의 객체를 얻으려면 바깥 클래스 이름에 this를 붙임
바깥클래스이름.this => 바깥객체
public class InnerClassExample {
int num;
class A {
int num;
void xxx(int num) {
num = 10;
this.num = 20;
InnerClassExample.this.num = 30;
}
}
public static void main(String[] args) {
}
}
중첩 인터페이스
- 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위해 클래스의 멤버로 선언된 인터페이스
- 안드로이드와 같은 UI 프로그램에서 이벤트를 처리할 목적으로 많이 활용
익명 객체
- 이름이 없는 객체. 명시적으로 클래스를 선언하지 않기 때문에 쉽게 객체를 생성할 수 있음
- 필드값, 로컬 변수값, 매개변수값으로 주로 사용
package com.example;
public class AnonymousExample {
int num;
static class A {
void show() {
System.out.println("A...");
}
}
static class B extends A {
}
public static void main(String[] args) {
// num = 100; // (X) 접근불가
A a = new A(); // static class에서 new 생성, 접근 가능.
B b = new B();
// 익명 객체
A a1 = new A() {
@Override
void show() {
System.out.println("Anonymous....");
}
};
a1.show();
}
}
익명 자식 객체
- 부모 클래스를 상송받아 생성되는 객체
- 부모 타입의 필드, 로컬 변수 , 매개변수의 값으로 대입할 수있음
익명 구현 객체
- 인터페이스를 구현해서 생성되는 객체
- 인터페이스 타입의 필드, 로컬변수, 매개변수의 값으로 대입할 수 있음
- 안드로이드와 같은 UI 프로그램에서 이벤트를 처리하는 객체로 많이 사용
package com.example;
public class AnonymousExample3 {
// 익명 자식객체
static class A implements Runnable {
@Override
public void run() {
for (int i=0; i<100; i++) {
System.out.print("A");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
A a = new A();
Thread t1 = new Thread(a);
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<100; i++) {
System.out.print("1");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}); // 매개변수 안에 클래스 선언문이 들어감.
t2.start();
}
}
클래스 class에 올 수 있는 요소-
1. 필드 field : (1) instance field (2) static field
2. 생성자 construactor - instance only // ( static block )
3. 메소드 method : (1) instance method (2) static method
4. 클래스 class :
/ interface member class
/ static member class
/ enum
인스턴스 클래스는 new 생성으로 정의를 해주어야
접근이 가능하다.
static 정적 클래스는 new 생성없이 static에서는 정의가
자동으로 이루어지기 때문에 접근이 가능함.
instance / static (전역변수 - 접근가능)
인스턴스 클래스는 메모리 공간에 저장을 따로 해주어야
다른 클래스에서도 접근이 가능하다.
익명객체 - 이름이 없는 객체
단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야만
생성할 수 있다. 익명 객체는 필드의 초기값이나 로컬 변수의 초기값,
매개 변수의 매개값으로 주로 대입됨
'Hello World > JAVA' 카테고리의 다른 글
JAVA - Generic 제너릭 [개발스터디 기몬] (0) | 2023.04.18 |
---|---|
JAVA - Lambda Expression 람다식 [개발스터디 기몬] (0) | 2023.04.18 |
JAVA - Interface [ 개발스터디 기몬] (0) | 2023.04.13 |
JAVA - 예외처리 EXCEPTION 2 - Exception / Runtime Exception [개발스터디 기몬] (0) | 2023.04.12 |
JAVA - 예외처리 EXCEPTION - Exception / Runtime Exception [개발스터디 기몬] (0) | 2023.04.10 |
댓글