본문 바로가기
Java/Effective Java

[이펙티브 자바 item24] 멤버 클래스는 되도록 static으로 만들어라

by bloodFinger 2021. 2. 18.

각각의 중첩클래스에는 무엇이 있고 언제 그리고 왜 사용해야 하는지 이야기를 해보자.

 

아래 그림과 같이 중첩클래스는 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()");
	}
}

 

 

 

...컨티뉴~