내부 클래스 (inner class)

박영준·2023년 6월 17일
0

Java

목록 보기
82/112

1. 정의

class A {
	...
    
    class B {
    	...
    }
    
    ...
}
  • 클래스 내에 선언된 클래스

    • 단, class B는 class A를 제외하고는 다른 클래스에선 잘 사용되지 않아야 함
  • 내부 클래스도 일반적인 클래스와 비슷하다

2. 장점

  1. 두 클래스의 멤버들 간에 서로 쉽게 접근 가능

  2. 캡슐화 : 외부에는 불필요한 클래스를 감춰, 코드의 복잡성 ↓

3. 종류

참고: 변수, 상수, 리터럴 - 3. 종류

// 변수의 종류에서
class Outer {
	int iv = 0;				// 인스턴스 변수
    static int cv = 0;		// static 변수
    
    void Method() {
    	int lv = 0;			// 지역 변수
    }
}

// 클래스의 종류에서
class Outer {
	class InstanceInner {}			// 인스턴스 클래스
    static class StaticInner {}		// static 클래스
    
    void Method() {
    	class LocalInner {}			// 지역 클래스
    }
}
  • 변수의 종류 (static 변수, 인스턴스 변수, 지역 변수) 에서처럼, 그 성질은 동일하다

  • 변수의 선언 위치 = 내부 클래스의 선언 위치

  • 내부 클래스 = '클래스 + 멤버변수의 성질'을 모두 갖는다

    • 클래스 : 제어자 사용 (abstract, final ...)
    • 멤버변수 : 접근 제한자 사용 (private, protected ...)

1) 인스턴스 클래스

class Outer {           // 외부 클래스
    class Inner {       // 내부 클래스 (인스턴스 클래스)
        int iv = 100;   // 멤버변수
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();              // 외부 클래스의 인스턴스 생성
        Outer.Inner inner = outer.new Inner();  // 내부 클래스의 인스턴스 생성
        System.out.println(inner.iv);
    }
}
  • 내부 클래스(인스턴스 클래스)의 인스턴스를 생성하기 위해서는 먼저 외부클래스의 인스턴스를 생성해야한다.
    • '인스턴스 클래스'는 외부 클래스의 '인스턴스 변수'처럼 외부 클래스의 인스턴스가 생성되어야 쓸 수 있기 때문

2) static 클래스

예시 1

public class Ex {
	class InstanceInner {
		int iv = 100;
		static int cv = 100;			// 에러
	}
	
	static class StaticInner {		// static 클래스
		int iv = 200;
		static int cv = 200;		// 여기에서만 static 멤버를 정의할 수 있음
	}
	
	void method() {
		class LocalInner {
			int iv = 300;
			static int cv = 300;			// 에러
			final static int CONST = 300;	// static이 아닌, final static은 '상수'이므로 허용됨
		}
	}
}

예시 2

class Outer {						// 외부 클래스
	private int outerIv = 0;
    static int outerCv = 0;			// static 멤버
    
    class InstanceInner {
    	int iiv = outerIv;			// 외부 클래스의 private 멤버에 접근 가능
        int iiv2 = outerCv;
    }
    
    static class StaticInner {		// static 클래스 : 외부 클래스의 static 멤버
    	int siv = outerIv;			// 에러 : static 클래스는 외부 클래스의 인스턴스 멤버에 접근 X 
        static int scv = outerCv;
    }
}

예시 3

class Outer {           	   // 외부 클래스
    static class Inner {       // 내부 클래스 (static 클래스)
        int iv = 200;   	   // 멤버변수
    }
}

public class Main {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner();
        System.out.println(inner.iv);
    }
}
  • static 클래스는 외부 클래스의 인스턴스를 생성하지 않고도 사용 가능

3) 지역 클래스

class Outer {						// 외부 클래스
	private int outerIv = 0;
    static int outerCv = 0;			// static 멤버
    
    class InstanceInner {
    	int iiv = outerIv;			// 외부 클래스의 private 멤버에 접근 가능
        int iiv2 = outerCv;
    }
    
    static class StaticInner {		// static 클래스 : 외부 클래스의 static 멤버
    	int siv = outerIv;			// 에러 : static 클래스는 외부 클래스의 인스턴스 멤버에 접근 X 
        static int scv = outerCv;
    }
    
    void Method() {
    	int lv = 0;
        final int LV = 0;
        
        class LocalInner {			// 지역 클래스
        	int liv = outerIv;		// 외부 클래스인 인스턴스 멤버와 static 멤버 모두 사용 가능
            int liv2 = outerCv;		// 외부 클래스인 인스턴스 멤버와 static 멤버 모두 사용 가능
            int liv3 = lv;
            int liv4 = LV;
        }
    }
}

4) 익명 클래스

// 방법 1 : 단 하나의 클래스를 상속받기
new 부모클래스이름() }
	// 멤버 선언
}

// 방법 2 : 단 하나의 인터페이스만 구현하기
new 구현인터페이스이름() {
	// 멤버 선언
}
  • 클래스의 선언 + 객체의 생성을 동시에 함

    • 단 한 번만 사용 가능
  • 이름없는 클래스

    • 생성자를 가질 수 없음
  • 일회용

    • 단 하나의 객체만을 생성 가능
profile
개발자로 거듭나기!

0개의 댓글