##Chapter10 내부 클래스
###1. 내부 클래스(inner class)란?
==내부 클래스의 장점==
* 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
* 코드의 복잡성을 줄일 수 있다(캡슐화).
class A { //외부 클래스
//...
class B { //내부 클래스
// ...
}
//...
}
###2. 내부 클래스의 종류와 특징
|내부 클래스| 특징 |
|---------|-----|
|인스턴스 클래스<br>(instance class)|외부 클래스의 멤버변수 선언위치에 선언, 외부 클래스의 인스턴스 멤버처럼 다루어짐.
|스태틱 클래스<br>(static class)|외부 클래스의 멤버변수 선언위치에 선언, 외부 클래스의 static 멤버처럼 다루어짐.|
|지역 클래스<br>(local class)|외부 클래스의 메서드나 초기화블럭 안에 선언, 선언된 영역 내부에서만 사용.|
|익명 클래스<br>(anonymous class)|클래스의 선언과 객체의 생성을 동시에 하는 클래스(일회용)|
###3. 내부 클래스의 선언
class Outer {
class InstanceInner {}
static class StaticInner {}
void myMethod() {
class LocalInner {}
}
}
####4. 내부 클래스의 제어자와 접근성
==Ex1==
class InnerEx1 {
class InstanceInner {
int iv = 100;
static int cv = 100; //에러! static변수 선언X
final static int CONST = 100; //final static은 상수이므로 허용.
}
static class StaticInner {
int iv = 200;
static int cv = 200; //static클래스만 static멤버 정의.
}
void myMethod() {
class LocalInner {
int iv = 300;
static int cv = 300; //에러! static 변수 선언X
final static int CONST = 300; //final static은 상수이므로 허용.
}
}
}
==Ex2==
class InnerEx2 {
class InstanceInner {}
static class StaticInner {}
//인스턴스멤버 간에는 서로 직접 접근 가능.
InstancdInner iv = new InstanceInner();
//static멤버 간에는 서로 직접 접근 가능.
static StaticInner cv = new StaticInner();
static void staticMethod() {
//static멤버는 인스턴스 멤버에 직접 접근X
// InstanceInner obj1 = new InstanceInner();
staticInner obj2 = new StaticInner();
//굳이 접근하고자 한다면, 아래와 같이 객체 생성.
//인스턴스 클래스는 외부 클래스를 먼저 생성해야만 생성할 수 있다.
InnerEx2 outer = new InnerEx2();
InstanceInner obj1 = outer.new InstanceInner();
}
void instanceMethod() {
//인스턴스메서드에서는 인스턴스멤버와 static멤버 모두 접근 가능.
InstanceInner obj1 = new InstanceInner();
StaticInner obj2 = new StaticInner();
//메서드 내에 지역적으로 선언된 내부 클래스는 외부에서 접근할 수 없음.
// LocalInner lv = new LocalInner();
}
void myMethod() {
class LocalInner {}
LocalInner lv = new LocalInner();
}
}
==Ex3==
* class InstanceInner {}
* 외부 클래스의 private멤버도 접근 가능.
* static class StaticInner {}
* static 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없음.
* class LocalInner {}
* 외부 클래스의 지역변수는 final이 부은 변수(상수)만 접근 가능.
==Ex4==
public static void main(String args[]) {}
* 인스턴스클래스의 인스턴스를 생성하려면 외부 클래스의 인스턴스를 먼저 생성해야 함.
* 스태틱 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 됨.
==Ex5==
내부 클래스 내의 메소드에서
value, this.value, Outer.this.value.
'CDG 3기 > JAVA의정석' 카테고리의 다른 글
ch9 lang패키지 (0) | 2015.09.21 |
---|---|
ch8 예외처리 (0) | 2015.09.21 |
스터디 실습 문제 2 (0) | 2015.09.21 |
스터디 실습 문제 1 (0) | 2015.09.21 |
스터디 이론 문제 (0) | 2015.09.21 |