Nested 클래스
중첩 클래스란 클래스 안에 클래스가 선언된 형태이다. 중첩 클래스에서 외부 클래스는 Outer 클래스라고 하며 Outter 클래스 내부에 존재하는 클래스를 중첩클래스 혹은 내부 클래스라고 한다.
1. Nested 클래스 특징
- Nested 클래스는 Outer 클래스의 멤버처럼 사용 가능하다. Inner 클래스의 접근지정자 private로 선언해도 접근이 가능하다.
- Nested 클래스 안에 static 변수를 선언할 수 없다. static Inner 클래스 선언을 가능하다.
- Nested 클래스 접근시 Outer 클래스를 통해서 접근이 가능하다. static 클래스는 바로 접근이 가능하다.
2. 위치에 따른 4가지 형태
- 클래스 안에 필드 선언 위치에 선언 되는 경우. 보통 중첩 클래스 or Instance member Class라고 한다.
- 메서드 안에 클래스가 선언된 경우. 지역 중첩 클래스 or local Class라고 한다.
- Inner 클래스가 static으로 선언된 경우. 정적 중첩 클래스 or Static member Class한다.
- 익명 클래스를 이용해 클래스 선언된 경우 익명 중첩 클래스 or Anonymous Class라고 한다.
1) Instance Member Class (보통 중첩 클래스)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class OuterClass { class InnerClass { //Inner class int a; public void disp() { System.out.println("중첩 클래스!"); } } public static void main(String[] args) { OuterClass o = new OuterClass(); OuterClass.InnerClass i = o.new InnerClass(); i.disp(); } } | cs |
OuterClass o = new OuterClass(); 로 Outer class를 먼저 생성.
OuterClass.InnerClass i = o.new InnerClass(); Outer 클래스를 통해 Inner 클래스를 생성한다.
Inner 클래스 내에서는 static 변수와 static 메서드의 사용이 불가하다.
2) Local Class (지역 중첩 클래스)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class OuterClass { public void outerMethod() { class InnerClass { //Inner class String str = "중첩 클래스!"; public void disp() { System.out.println(str); } } InnerClass i = new InnerClass(); i.disp(); } public static void main(String[] args) { OuterClass o = new OuterClass(); o.outerMethod(); } } | cs |
local inner class는 outer method 안에 inner class가 선언된 경우이다.
Inner class 접근 가능한 변수는 Outer class의 멤버 변수와 상수만이 접근이 가능하다. Outer method의 지역변수는 접근이 불가능하다. Inner class의 객체 생성은 Outer class 내에서 한다.
멤버 클래스와 마찬가지로 Inner 클래스 내에서는 static 변수와 static 메서드의 사용이 불가하다.
3) Static Member Class (정적 중첩 클래스)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class OuterClass { static class InnerClass { // Inner class String str = "중첩 클래스!"; public void disp() { System.out.println(str); } } public static void main(String[] args) { //Outer class 생성 없이도 생성 가능 OuterClass.InnerClass i1 = new OuterClass.InnerClass(); OuterClass.InnerClass i2 = new InnerClass(); InnerClass i3 = new OuterClass.InnerClass(); InnerClass i4 = new InnerClass(); i1.disp(); i2.disp(); i3.disp(); i4.disp(); } } | cs |
static inner class는 inner class 에 static이 붙은 경우이다.
static inner class는 outer class의 생성 없이도 생성이 가능하다.
Inner 클래스 내에서는 static 변수와 static 메서드의 사용이 가능하다.
4) Anonymous Class (익명 중첩 클래스)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | abstract class InnerClass{ public abstract void disp(); } public class OuterClass { public static void main(String[] args) { //anonymous class InnerClass i = new InnerClass() { String str = "중첩 클래스!"; //method 구현 @Override public void disp() { System.out.println(str); } }; i.disp(); } } | cs |
익명 클래스는 객체 생성과 메서드 선언만 있는 형태이다. 객체를 생성하고 바로 클래스나 인터페이스를 정의한다. 보통 인터페이스나 추상 클래스를 구현하는데 자주 사용된다. 단순한 클래스를 정의할 때나 한번만 정의하여 사용하는 경우(일회용) 사용한다.
outer class에서 InnerClass i = new InnerClass() 로 객체를 생성하고 바로 {};를 입력한다.
이 중괄호 사이에 메서드를 구현한다.
'Programming Language > Java' 카테고리의 다른 글
[Java] Eclipse 설치 (0) | 2018.08.22 |
---|---|
[Java] 윈도우10 Java 설치 및 환경변수 설정 (0) | 2018.08.18 |