각각의 중첩클래스에는 무엇이 있고 언제 그리고 왜 사용해야 하는지 이야기를 해보자.
아래 그림과 같이 중첩클래스는 4가지로 구분 할 수 있다.
중첩클래스 종류
코드를 통해 각각의 중첩클래스의 특징을 알아보자
1. 내부 클래스(Inner class)
- 외부클래스는 내부클래스를 멤버변수처럼 사용할 수 있다.
- 내부클래스는 외부클래스의 자원을 직접 사용할 수 있다.
package effectiveJava.item24;
//내부 클래스 inner class
public class Outer{
int aFiled;
void aMethod(){
System.out.println( aFiled + " - aMethod()");
}
public class Inner{
void innerMethod(){
aFiled = 3;
aMethod();
}
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.innerMethod();
}
}
2. 정적내부 클래스(static Nested class)
- 내부클래스에서 외부클래스의 변수와 메소드 중에 static이 붙은 것들은 사용할 수 있다.
package effectiveJava.item24;
//정적 중첩 클래스 Static Nested Class
public class Outer2 {
int aFiled;
void aMethod(){
System.out.println("aMethod()");
}
public static class Inner{
void innerMethod(){
//aMethod();
System.out.println("test");
}
}
public static void main(String[] args) {
Outer2.Inner inner = new Outer2.Inner();
inner.innerMethod();
}
}
3. 지역 클래스 (Method Local Inner Class)
- 마치 메소드 내의 지역변수처럼 쓰인다.
- 메소드 내부에서 new 한 후 사용 한다. 메소드 밖에서 사용할 수 없다(지역변수의 특성을 가짐)
package effectiveJava.item24;
//Method Local Inner Class(지역 클래스)
public class Outer3 {
int aFiled;
void aMethod(){
System.out.println("aMethod()");
}
void aMethod2(){
int b;
class Inner{
void innerMethod(){
System.out.println("Method Local Inner Class(지역 클래스)");
}
}
//메소드 내부에 클래스를 정의해서 지역변수 처럼 사용한다.
Inner inner = new Inner();
inner.innerMethod();
}
public static void main(String[] args) {
Outer3 o = new Outer3();
o.aMethod2();
}
}
4.익명 클래스(Anonymous Inner Class)
- 익명클래스는 이름이 없다.
- 매개 변수로 사용할 수 있다.
- 익명클래스는 내부 생성자가 없다.
- 익명클래스는 외부에 final 키워드가 붙은것만 사용가능하다.
package effectiveJava.item24;
public class Outer4 {
int aFiled;
void aMethod(){
System.out.println("aMethod()");
}
void aMethod2(){
int b;
Inner inner = new Inner() {
String innerField = "innerField 입니다.";
@Override
void bMethod() {
System.out.println(innerField);
}
};
inner.bMethod();
}
public static void main(String[] args) {
Outer4 outer4 = new Outer4();
outer4.aMethod2();
}
}
class Inner {
int bField;
void bMethod(){
System.out.println("bMethod()");
}
}
...컨티뉴~
'Java > Effective Java' 카테고리의 다른 글
[이펙티브 자바 item23] 태그 달린 클래스보다는 클래스 계층구조를 사용해라 (0) | 2021.02.17 |
---|---|
[이펙티브 자바] - 객체의 생성과 파괴 (0) | 2020.12.31 |
[이펙티브 자바] - 일반적인 프로그래밍 원칙 (0) | 2020.12.21 |