티스토리 뷰

728x90
반응형

1) 의미 : 클래스 안의 클래스

2) 장점

  • 내부 클래스에서 외부 클래스 멤버들에 쉽게 접근할 수 있음
  • 코드 복잡성을 줄일 수 있음(캡슐화)

3) 내부클래스 종류

  • 인스턴스 클래스
  • static 클래스
  • 지역 클래스
  • 익명 클래스

4) 내부클래스의 제어자

*  인스턴스멤버가 static 멤버 사용하는 것 항상 가능! (반대로, static 멤버는 static 멤버만 사용 가능)

- public, default, protected, private 모두 사용 가능

(원래 일반 class 앞엔 제어자 default와 public만 사용 가능), (iv, cv, lv도 4개 접근자 모두 사용 가능)

- static 클래스만 static 멤버(객체생성 없이 사용 가능) 정의 가능 (예외! 상수인 경우에는 final static 정의 허용)

- static 내부 클래스에서는 외부 클래스의 인스턴스 멤버에 접근 불가능

- static 클래스는 외부 클래스의 인스턴스멤버에 접근 불가능

- 지역 내부 클래스는 메서드 내에서만 사용 가능

- 내부클래스에서는 외부 클래스 private멤버에도 접근 가능

- 외부클래스의 지역변수는 final이 붙은 변수(상수)만 접근 가능 (JDK1.8부터 final 생략 가능)

- 상수(constant)는 constant pool에 관리가 되기 때문에 메서드가 종료되어도 소멸되지 않고 계속 저장되어 관리가 되고 있기 때문에 계속 사용 가능하다.

5) 내부클래스 호출 법

  1. 외부클래스의 인스턴스 먼저 생성
  2. 내부클래스의 객체 생성

* static 내부클래스는 객체 생성 필요 x (즉, 바로 호출 가능) ->static 내부클래스의 인스턴스는 외부클래스를 먼저 생성하지 않아도 됨.

 

ex.예시 1

package pkg1;

class Outer2 { // 외부 클래스
	class InstanceInner { // 내부클래스 1
		int iv = 100;
	}
	static class StaticInner { // 내부클래스 2
		int iv = 200;
		static int cv = 300;
	}
	void myMethod() { // 내부클래스 3
		class LocalInner {
			int iv = 400;
		}
	}
}
public class Ex7_15 {
	public static void main(String[] args) {

		Outer2 oc = new Outer2(); // 외부클래스의 인스턴스 먼저 생성
		Outer2.InstanceInner ii = oc.new InstanceInner(); // 내부클래스 객체 생성

		System.out.println("ii.iv : " + ii.iv);
		System.out.println("Outer2.StaticInner.cv : " + Outer2.StaticInner.cv);

		// static 내부클래스는 객체 생성 필요 x
		Outer2.StaticInner si = new Outer2.StaticInner();
		System.out.println("si.iv :" + si.iv);
	}
}
더보기

실행결과:

ii.iv : 100

Outer2.StaticInner.cv : 300

si.iv :200

ex.예시2

package pkg1;

class Outer3 {
	int value = 10;

	class Inner {
		int value = 20;

		void method1() {
			int value = 30;
			System.out.println("value :" + value);
			System.out.println("this.value :" + this.value);
			System.out.println("Outer3.this.value :" + Outer3.this.value); //Outer3.this.value도 가능 !
		}
	} //Inner 클래스 끝 
} // Outer 클래스 끝 

class Ex7_16 {
	public static void main(String[] args) {
		Outer3 outer3 = new Outer3();
		Outer3.Inner inner = outer3.new Inner();
		inner.method1();
	}
}
더보기

실행결과:

value :30

this.value :20

Outer3.this.value :10

728x90
반응형

'Java > JAVA의 정석_객체지향' 카테고리의 다른 글

익명클래스 (anonymous class)  (0) 2022.11.11
default 메서드  (0) 2022.11.11
인터페이스를 이용한 다형성  (0) 2022.11.02
인터페이스(interface)  (0) 2022.11.02
추상 클래스(abstract class)  (0) 2022.11.02
댓글
250x250
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday