Java/모두의 자바

Chapter 08-46 내부 클래스

계란💕 2022. 2. 11. 11:22

08-46.1 내부클래스

 

  Def) 내부 클래스: 클래스 안에 선언한 클래스를 말한다. (특정 클래스 내에서만 사용한다.)

  - 어느 위치에서 선언하느냐에 따라 네 가지로 나뉜다.

  (1) 인스턴스 클래스 (instance class) (중첩 클래스)

  (2) 스태틱 클래스 (static class)

  (3) 지역 클래스 (local class)

  (4) 익명 클래스 (anonymous class)

 

 

08-46.2 인스턴스 클래스(instance class) (중첩 클래스)

  - 클래스 안에 인스턴스 변수, 즉 필드를 선언하는 위치에 선언하는 경우이다. 

<hide/>
package javaStudy;
public class InnerExam1 {
	class Cal{
		int value = 0;
		public void plus() {
			value++;
		}	
	}
	public static void main(String[] args) {
		InnerExam1 t = new InnerExam1();
		InnerExam1.Cal cal = t.new Cal();
		cal.plus();
		System.out.println(cal.value);		
	}
}

  Note) 실행 결과 : 1

  - InnerExam1 클래스를 만들고 이 클래스를 이용해 Cal 객체를 생성할 수 있다. 

  - 이 때 Cal객체를 이용하려면 인스턴스 변수를 선언해야 한다. 

  - InnerExam1.Cal cal = t.new Cal() : 바깥 쪽 클래스 타입. 내부 타입으로 타입을 선언한다. 

  - 이렇게 접근해야 사용가능하다. 객체를 생성한 다음 사용하는 방법은 다른 클래스와 같다.

 

 

08-46.3 스태틱 클래스 (정적 중첩 클래스)

<hide/>
package javaStudy;
public class InnerExam2 {
	static class Cal{
		int value = 0;
		public void plus() {
			value++;
		}	
	}
	public static void main(String[] args) {
		InnerExam2.Cal cal = new InnerExam2.Cal();
		cal.plus();
		System.out.println(cal.value);
	}		
}

  Note) 출력 결과: 1

  - 첫 번째 형태와 같은 위치에 static으로 정의한 내부 클래스를 만든다.  

  - 인스턴스 클래스의 경우에는 외부에 InnerExam 객체를 반드시 먼저 생성한 다음에  내부 클래스에 접근했다.

  - 이번 경우에는 static한 필드이므로 InnerExam2 객체를 생성할 필요 없이 바로 접근해서 사용할 수 있다.

  - 첫 번째와 마찬가지로 내부 클래스인 Cal이 가진 메서드 필드에 접근해서 value 값을 출력한다. 

 

 

08-46.4 지역 중첩 클래스/ 지역 클래스 (local calss)

<hide/>
package javaStudy;
public class InnerExam3 {
	public void exec() {
		class Cal{
			int value = 0;
			public void plus() {
				value++;
			}
		}
	Cal cal = new Cal();
	cal.plus();
	System.out.println(cal.value);
	}
	public static void main(String[] args) {
		InnerExam3 t = new InnerExam3();
		t.exec();
	}
}

  Note) 실행 결과: 1

  - 내부 클래스를 인스턴스 변수로 선언하는 것이 아니라 메서드 안에서 선언한다. 

  - InnerExam3 안에 exec메서드를 만들고 Cal클래스를 생성한다.

  - 이 경우 Cal 객체는 메서드 안에서만 생성하고 사용할 수 있다.

  - Cal cal = new Cal() : 메서드 안에 Cal객체 만든다.

  - cal.plus() : Cal객체가 가진 메서드를 호출한다.

  - System.out.println(cal.value) : Cal이 가진 value를 호출해 사용가능하다.

  - 클래스를 메서드 안에서 지역 변수처럼 사용할 수 있다.