04. Nested Class, Nested Interface
2020. 1. 19. 01:56ㆍCSE/JAVA
* 중첩 클래스(Nested Class)
: 클래스 내부에 선언한 클래스
=> 코드의 복잡성을 줄일 수 있음
=> But, 코드가 장황해질 수 있고, 가독성이 떨어질 수 있음
* 인스턴스 멤버 클래스
: 인스턴스 필드와 메소드만 선언 가능
정적 필드와 메소드는 선언 불가능
바깥 클래스 외부에서 인스턴스 멤버 클래스의 객체를 생성하기 위해서는 먼저 바깥 클래스 객체를 생성하고 인스턴스 멤버 클래스의 객체를 생성해야 함
+ 인스턴스 멤버 클래스의 안에서는 바깥 클래스의 모든 필드와 모든 메소드에 접근 가능
class Out{
class In{ //인스턴스 멤버 클래스
In(){...} //생성자
int field; //인스턴스 필드
void method(){...} //인스턴스 메소드
}
}
public class Main{
public static void main(String[] args){
Out out = new Out(); //외부 클래스 객체 생성
Out.In in = out.new In(); //인스턴스 멤버 클래스 객체 생성
in.field = 3;
in.method();
}
}
* 정적 멤버 클래스
: static 키워드로 선언된 클래스
모든 종류의 필드와 메소드를 선언할 수 있음
정적 멤버 클래스의 객체를 생성하기 위해서는 외부 클래스 객체를 생성할 필요 없음
+ 정적 클래스의 안에서는 바깥 클래스의 정적 필드와 정적 메소드만 접근할 수 있음
class Out{
static class In{ //정적 멤버 클래스
In(){...}; //생성자
int field1; //인스턴스 필드
static int field2; //인스턴스 메소드
void method1(){...} //정적 필드
static void method2(){...} //정적 메소드
}
}
public class Main{
public static void main(String[] args){
Out.In in = new Out.In(); //정적 멤버 클래스 객체 생성
in.field1 = 3;
in.method1();
in.field2 = 3;
in.method2();
}
}
* 로컬 클래스
: 메소드 내에 선언한 중첩 클래스
접근제한자를 붙일 수 없음
인스턴스 필드와 메소드만 선언 가능, 정적 필드와 메소드는 선언 불가
+ 로컬 클래스에서 사용된 매개 변수와 로컬 변수는 모두 final 특성을 갖는다
class Out{
void method(){
class In{ //로컬 클래스
In(){...} //생성자
int field; //인스턴스 필드
void method(){...} //인스턴스 메소드
}
In in = new In(); //로컬 클래스 객체 생성
in.field = 3;
in.method();
}
}
* 중첩 클래스에서 바깥 클래스 참조하기
public class Out{
String field = "Out Class's field");
void method(){
System.out.println("Out Class's method");
}
class In{
Out.this.field; //바깥클래스.this.필드;
Out.this.method(); //바깥클래스.this.메소드();
}
}
* 중첩 인터페이스
class Out{
interface Out{ //중첩 인터페이스
void method();
}
}
'CSE > JAVA' 카테고리의 다른 글
06. Exception (0) | 2020.01.20 |
---|---|
05. Anonymous Inner Class (0) | 2020.01.19 |
03. Annotation (0) | 2020.01.13 |
02. Singleton, Final (0) | 2020.01.12 |
01. Static (0) | 2020.01.08 |