
자바의 정석을 읽으며 정리를 위해 포스팅합니다.
혹시 틀린 부분이 있다면 말씀 부탁드립니다^^~
내부 클래스란?: 클래스 내에 선언된 클래스
내부 클래스를 선언하는 이유?: 두 클래스가 긴밀한 관계에 있기 때문.
두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
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 |