CH7-42 내부 클래스

1. 클래스 안의 클래스

2. 내부 클래스의 장점

- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다,

- 코드의 복잡성을 줄일 수 있다.(캡슐화)

 

package ch_7;


class AAA{  // AAA는 BBB의 외부 클래스
	int i = 100;
	BBB b = new BBB();
	
	class BBB{	///BBB는 AAA의 내부 클래스
		void method() {
//			AAA a = new AAA();
//			System.out.println(a.i);
			System.out.println(i);  // 객체 생성 없이 외부 클래스의 멤보 접근 가능
		}
	}
}

class CCC{
	
}
public class InnerTest {

	public static void main(String[] args) {

//		BBB b = new BBB();
//		b.method();
	}

}

CH7-45 내부 클래스의 제어자와 접근성

- 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일

- 외부 클래스는 defalt, public 만 가능, 내부 클래스는 defalt, public, private, protected 가능

 

▶인스턴스 내부 클래스

class Ex7 {
	class InstanceInner{
		int iv = 100;
		static int cv = 100; // 에러! static 변수를 선언할 수 없다.
		final static int CONST = 100; // final static은 상수 이므로 허용
	}

 

▶스테틱 내부 클래스

class Ex7 {
static class StaticInner{
		int iv = 200;
		static int cv = 200; // static 클래스만 static 멤버를 정의할 수 있다.
	}
    }

 

▶지역 내부 클래스

class Ex7 {
void myMethod() {
		class LocalInner{
			int iv = 300;
			static int cv = 300; // 에러! static 변수를 선언할 수 없다.
			final static int CONST = 300; // final static은 상수이므로 허용
		}
	}
    }

CH7-48 내부 클래스의 제어자와 접근성 - 예제

package ch_7;

class Outer {
	private int outerIv = 0;
	static int outerCv = 0;
	
	class InstanceInner{
		int iiv = outerIv; // 1. 외부 클래스의 private 멤버도 접근 가능하다.
	    int iiv2 = outerCv; 
	}
	
	static class StaticInner{
		int siv = outerIv; // 스테틱 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.
		static int  scv = outerCv; 
	}
	
	void myMethod() {
			int lv = 0; // 지역변수 X, 메서드 종료와 함께 소멸
			final int LV = 0; // JDK 1.8부터 final 생략 가능, 변수인데 값이 안 바뀌면 상수로 간주
	
	
	class LocalInner{ // 2. 지역 내부 클래스를 감싸고 있는 메서드의 상수만 사용 가능.
		int liv = outerIv; // 내부 클래스의 객체가 지역변수 보다 더 오래 존재가능
		int liv2 = outerCv;
		// 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근 가능하다.
		int liv3 = lv;  //에러 JDK 1.8부터 에러 아님
		int liv4 = LV; // OK
	}
	}
}

CH7-49내부 클래스의 제어자와 접근성 - 예제2

package ch_7;

class Outer2 {
	
	class InstanceInner{
		int iv = 100; 
	}
	
	static class StaticInner{
		int iv = 200; 
		static int  cv = 300; 
	}
	
	void myMethod() {
     	 class LocalInner{ 
	    	int iv = 400;
	}
	}
}

public class InnerTest {

	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);
		
		// 스테틱 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 된다.
		Outer2.StaticInner si = new Outer2.StaticInner();
		System.out.println("si.iv : " + si.iv);
		
	}

}

CH7-50내부 클래스의 제어자와 접근성 - 예제3

package ch_7;

import ch_7.Outer3.Inner;

class Outer3 {
	int value = 10; // Outer3.this.value
	
	class Inner{
		int value = 20; // this.value
	

	void Method() {  
	    	int value = 30; // value
	    	System.out.println("            value : " + value);
	    	System.out.println("       this.value : " + this.value);
	    	System.out.println("Outer3.this.value : " + Outer3.this.value);
	}
  }
}

public class InnerTest {

	public static void main(String[] args) {
		Outer3 outer = new Outer3(); 
		Outer3.Inner inner = outer.new Inner();
		inner.Method(); 
	}
}

'JAVA > Chapter7' 카테고리의 다른 글

Ch7-7_오버라이딩(overriding)  (0) 2022.02.15
Ch7-5_단일 상속(Single Inheritance)  (0) 2022.02.14
Ch7-3_포함관계  (0) 2022.02.14
Ch7-1_상속(Inheritance)  (0) 2022.02.14
Ch7-51_익명 클래스(anonymous class)  (0) 2021.12.16
복사했습니다!