티스토리 뷰
1) 의미 : 클래스 안의 클래스
2) 장점
- 내부 클래스에서 외부 클래스 멤버들에 쉽게 접근할 수 있음
- 코드 복잡성을 줄일 수 있음(캡슐화)
3) 내부클래스 종류
- 인스턴스 클래스
- static 클래스
- 지역 클래스
- 익명 클래스
4) 내부클래스의 제어자
* 인스턴스멤버가 static 멤버 사용하는 것 항상 가능! (반대로, static 멤버는 static 멤버만 사용 가능)
- public, default, protected, private 모두 사용 가능
(원래 일반 class 앞엔 제어자 default와 public만 사용 가능), (iv, cv, lv도 4개 접근자 모두 사용 가능)
- static 클래스만 static 멤버(객체생성 없이 사용 가능) 정의 가능 (예외! 상수인 경우에는 final static 정의 허용)
- static 내부 클래스에서는 외부 클래스의 인스턴스 멤버에 접근 불가능
- static 클래스는 외부 클래스의 인스턴스멤버에 접근 불가능
- 지역 내부 클래스는 메서드 내에서만 사용 가능
- 내부클래스에서는 외부 클래스 private멤버에도 접근 가능
- 외부클래스의 지역변수는 final이 붙은 변수(상수)만 접근 가능 (JDK1.8부터 final 생략 가능)
- 상수(constant)는 constant pool에 관리가 되기 때문에 메서드가 종료되어도 소멸되지 않고 계속 저장되어 관리가 되고 있기 때문에 계속 사용 가능하다.
5) 내부클래스 호출 법
- 외부클래스의 인스턴스 먼저 생성
- 내부클래스의 객체 생성
* static 내부클래스는 객체 생성 필요 x (즉, 바로 호출 가능) ->static 내부클래스의 인스턴스는 외부클래스를 먼저 생성하지 않아도 됨.
ex.예시 1
package pkg1;
class Outer2 { // 외부 클래스
class InstanceInner { // 내부클래스 1
int iv = 100;
}
static class StaticInner { // 내부클래스 2
int iv = 200;
static int cv = 300;
}
void myMethod() { // 내부클래스 3
class LocalInner {
int iv = 400;
}
}
}
public class Ex7_15 {
public static void main(String[] args) {
Outer2 oc = new Outer2(); // 외부클래스의 인스턴스 먼저 생성
Outer2.InstanceInner ii = oc.new InstanceInner(); // 내부클래스 객체 생성
System.out.println("ii.iv : " + ii.iv);
System.out.println("Outer2.StaticInner.cv : " + Outer2.StaticInner.cv);
// static 내부클래스는 객체 생성 필요 x
Outer2.StaticInner si = new Outer2.StaticInner();
System.out.println("si.iv :" + si.iv);
}
}
실행결과:
ii.iv : 100
Outer2.StaticInner.cv : 300
si.iv :200
ex.예시2
package pkg1;
class Outer3 {
int value = 10;
class Inner {
int value = 20;
void method1() {
int value = 30;
System.out.println("value :" + value);
System.out.println("this.value :" + this.value);
System.out.println("Outer3.this.value :" + Outer3.this.value); //Outer3.this.value도 가능 !
}
} //Inner 클래스 끝
} // Outer 클래스 끝
class Ex7_16 {
public static void main(String[] args) {
Outer3 outer3 = new Outer3();
Outer3.Inner inner = outer3.new Inner();
inner.method1();
}
}
실행결과:
value :30
this.value :20
Outer3.this.value :10
'Java > JAVA의 정석_객체지향' 카테고리의 다른 글
익명클래스 (anonymous class) (0) | 2022.11.11 |
---|---|
default 메서드 (0) | 2022.11.11 |
인터페이스를 이용한 다형성 (0) | 2022.11.02 |
인터페이스(interface) (0) | 2022.11.02 |
추상 클래스(abstract class) (0) | 2022.11.02 |
- Total
- Today
- Yesterday