자바의 정석을 읽으며 정리를 위해 포스팅합니다.
혹시 틀린 부분이 있다면 말씀 부탁드립니다^^~
내부 클래스란?: 클래스 내에 선언된 클래스
내부 클래스를 선언하는 이유?: 두 클래스가 긴밀한 관계에 있기 때문.
두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
class A{
...
}
class B {
...
}
이러한 독립적인 두개의 클래스를
class A{
....
class B{
....
}
....
}
이렇게 바꾸면 B는 A의 내부 클래스가 된다.
내부 클래스의 선언
변수가 선언된 위치에 따라 인스턴스 변수, 클래스 변수(static 변수), 지역변수로 나뉘듯 내부클래스도 선언된 위치에 따라 나뉜다. 그리고 각 클래스의 선언 위치에 따라 변수와 동일한 유효범위와 접근성을 갖는다.
class Outer{
class InstanceInner{}
static class StaticInner{}
void myMethod(){
class LocalInner{}
}
}
변수에 관해 정리했던 포스팅은 위 링크로...
그리고 내부클래스도 클래스이기 때문에 abstract나 final같은 제어자가 사용 가능하며, private, protected도 사용 가능하다.
내부 클래스의 제어자와 접근성
class Sample{
class InstanceInner{
int iv = 100;
//static int cv = 100; ->static변수를 선언할 수 없다.
final static int CONST = 100; //final static 은 상수이므로 선언 가능하다.
}
static class StaticInner{
int iv = 200;
static int cv = 200; //static 클래스만 static 멤버를 정의할 수 있다.
}
void myMethod() {
class LovalInner{
int iv = 300;
//static int cv = 300; ->static 변수 선언 불가
final static int CONST = 300; //final static 은 상수라서 가능.
}
}
public static void main(String[] args) {
System.out.println(InstanceInner.CONST);
System.out.println(StaticInner.cv);
}
}
결과는
100
200
이다.
내부클래스의 변수 호출
1)내부클래스가 인스턴스 클래스인 경우
class Outer{
class Inner{
int iv = 100;
}
}
class Sample{
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();
System.out.println(in.iv);
}
}
내부 클래스에 있는 iv변수를 호출하려고 한다.
그러려면 먼저 Outer의 인스턴스부터 생성해야 한다. 외부 인스턴스 클래스의 인스턴스가 생성되어야 내부 인스턴스 클래스를 사용할 수 있기 때문이다. 그 뒤 Inner의 인스턴스도 생성한 후 호출한다.
2)내부클래스가 static 클래스인 경우
class Outer{
static class Inner{
int iv = 100;
}
}
class Sample{
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
System.out.println(in.iv);
}
}
static 클래스는 외부 클래스의 인스턴스를 생성하지 않고도 사용이 가능하다.
'Study > Java' 카테고리의 다른 글
[JAVA] Optional 이란? (0) | 2022.12.06 |
---|---|
[JAVA] 스택(stack) (0) | 2022.11.22 |
[JAVA] for문 축약(for each문), if-else 축약(삼항 연산자) (0) | 2022.10.18 |
[JAVA] 클래스 변수, 인스턴스 변수, 지역 변수 (0) | 2022.10.12 |
[JAVA] 생성자 (0) | 2022.10.10 |