Java - Inner class

iseon_u·2022년 5월 14일
0

Java

목록 보기
37/77
post-thumbnail

Inner class 내부 클래스


  • 클래스 안의 클래스
class A {
	...
}
class B {
	... // A의 객체를 생성해야 접근 가능
}
class A { // B의 외부 클래스
	...
	class B { // A의 내부 클래스
		...
	} // 객체 생성 없이도 A의 멤버 접근 가능
	...
}

내부 클래스의 장점

  • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
  • 코드의 복잡성을 줄일 수 있다. (캡슐화) - 클래스 안에서만 사용할 때

내부 클래스의 특징

  • 내부 클래스의 종류와 유효 범위 (scope) 는 변수와 동일
  • 기존 변수 선언 하듯이 클래스 선언 가능
  • 변수 특징과 내부 클래스 특징이 동일 (iv, cv, lv)
class Outer {
		int iv = 0; // 1) iv
		static int cv = 0; // 2) cv
		void myMethod() { 
				int lv = 0; // 3) lv
		}
}
class Outer {
		class InstanceInner {} // 1)
		static class StaticInner {} // 2)
		void myMethod() {				
				class LocalInner {} // 3)
		}
}
내부 클래스특징
인스턴스 내부 클래스 (instance inner class)외부 클래스의 멤버 변수 선언 위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.
스태틱 내부 클래스 (static inner class)외부 클래스의 멤버 변수 선언 위치에 선언하며, 외부 클래스의 static 멤버 처럼 다루어진다. 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언된다.
지역 내부 클래스 (local inner class)외부 클래스의 메서드나 초기화 블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다.
익명 클래스 (anonymous class)클래스의 선언과 객체의 생성을 동시에 하는 이름 없는 클래스 (일회용, 이벤트 처리)

내부 클래스의 제어자

  • 변수에 사용 가능한 제어자와 동일 (public, (default), protected, private)
 class Outer {
		private int iv = 0; // 1) iv
		protected static int cv = 0; // 2) cv
		void myMethod() { 
				int lv = 0; // 3) lv
		}
}
class Outer {
		private class InstanceInner {} // 1)
		protected static class StaticInner {} // 2)
		void myMethod() {				
				class LocalInner {} // 3)
		}
}
  • 외부 클래스의 private 멤버도 접근 가능
  • 외부 클래스의 지역 변수는 final 이 붙은 상수만 접근 가능
  • 내부 클래스가 더 오래 지속될 수 있기 때문에 사라진 지역 변수를 사용할 때 발생하는 에러를 방지
  • JDK 1.8 부터 값이 변경 되지 않는 변수는 상수로 간주
  • 내부 클래스의 static 멤버는 inner_class_name.variable 로 접근 가능 (지역 내부 클래스 제외)

인스턴스 내부 클래스 접근성

  • 인스턴스 멤버는 인스턴스 멤버 static 멤버 둘 다 접근 가능✅
  • 다른 클래스에서 사용할 때는 외부 클래스의 인스턴스를 먼저 생성해야 생성 가능
Outer o = new Outer();
Outer.InstanceInner ii = o.new InstanceInner();

static 내부 클래스 접근성

  • 내부 클래스에 static 멤버가 필요할 때 static 내부 클래스 사용
  • static 멤버는 static 내부 클래스만 정의할 수 있다. (final static 상수는 예외)
  • static 내부 클래스에서는 외부 클래스의 인스턴스 멤버에 접근 불가❌
  • 다른 클래스에서 사용할 때는 외부 클래스의 인스턴스를 먼저 생성하지 않아도 된다. (외부 클래스 이름은 붙여야 한다.)
Outer.StaticInner si = new Outer.StaticInner();

지역 내부 클래스 접근성

  • 지역 내부 클래스의 멤버는 메서드 내에서만 사용 가능✅ (static 상수 포함)

내부 클래스 컴파일시 이름

Outer$InstanceInner.class

Outer$StaticInner.class

Outer$1LocalInner.class

  • 외부 클래스 $ 내부 클래스 형식의 이름
  • 지역 클래스 앞엔 숫자가 추가로 붙는다.

Anonymous class 익명 클래스

  • 이름이 없는 일회용 클래스. 정의와 생성을 동시에
  • 조상 클래스의 이름이나 구현 인터페이스 이름을 대신 사용
// 익명은 자신의 이름이 없음
class ~~MyClass~~ extends Object // 클래스 정의
{}
~~MyClass mc =~~ new ~~MyClass~~(); // 클래스 생성
//-----> 정의와 생성을 한번에
new Object() {} // 조상 클래스 이름
new Inter() {} // 구현 인터페이스 이름

Object obj = new Object() {}

익명 클래스의 컴파일시 이름

Outer$1.class

Outer$2.class

  • 이름이 없고 번호가 붙는다.
profile
🧑🏻‍💻 Hello World!

0개의 댓글