Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[3주차] 56. 이너클래스(=중첩클래스), 클래스 내부에 선언한 클래스 본문

K-DigitalTraining 강의/1. Java

[3주차] 56. 이너클래스(=중첩클래스), 클래스 내부에 선언한 클래스

이대곤 2022. 6. 2. 01:30

* 이너클래스(=중첩클래스, Nested class) 란?

  클래스 내부에 선언한 클래스를 말함.
  클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나,
  특정 클래스 하고만 관계를 맺을 경우에는 관계클래스 내부에 선언하는 것이 좋다.

 

  이너클래스 관련해서 주의할 점으로 이너클래스 타입의 객체는 바로 new 를 이용해 객체를 생성하는 것이 불가능 하다.
  그 이유는 이너클래스의 생성자에 바로 접근이 불가하기 때문인데 그래도 방법은 있다! 바깥 클래스의 객체를 생성하여
  이너클래스의 생성자에 접근하면 아래와 같이 객체를 생성하는 것이 가능하다

Car2 pride = new Car2("프라이드", 2005, "파랑");
Car2.Car2name pride2 = pride.new Car2name("프랑이", 2009);
pride2.Outcolor(); // model:프랑이 연식:2009 색상:파랑입니다.

  이너클래스에 대한 개념은 알아두더라도 잘 사용하지는 않는 기능이라고 함.

중첩클래스 적용하지 않은 예시

class CarName {
	String model;
	int year;
	CarName(String model, int year) {
		this.model = model;
		this.year = year;
	}
}

class Car {
	CarName name;
	String color;

	Car(String model, int year,String color) {
		this.name = new CarName(model,year);
		this.color = color;
	}

	void OutInfo() {
		System.out.printf("모델 = %s, 년식 = %d, 색상 = %s\n",
				name.model, name.year, color);
	}
}

public class Ex07_06_이너사용안함 {
	public static void main(String[] args) {
		
		CarName sonata = new CarName("소나타", 2009);
		System.out.printf("모델 = %s, 년식 = %d\n", sonata.model, sonata.year);
		
		Car pride = new Car("프라이드", 2015, "파랑");
		pride.OutInfo();
		
	}
}
모델 = 소나타, 년식 = 2009
모델 = 프라이드, 년식 = 2015, 색상 = 파랑

중첩클래스를 적용한 예시

class Car2 {
	Car2name name;
	String color;

	Car2(String model, int year, String color) {
		name = new Car2name(model, year);
		this.color = color;
	}

	// 클래스 내부에 선언한 중첩클래스
	class Car2name {
		String model;
		int year;

		Car2name(String model, int year) {
			this.model = model;
			this.year = year;
		}

		Car2name(String model, int year, String col) {
			this.model = model;
			this.year = year;	// 내부 클래스에서의 this는 내부 클래스의 멤버변수에 접근하게 됨
			color = col;		// this를 사용하지 않으면 바깥 클래스의 변수를 사용하게 됨
		}

		void innerInfo() {
			System.out.println("model:" + model + " | 연식:" + year + " | 색상:" + color + "입니다.");
		}
	}

	void outInfo() {
		System.out.printf("모델=%s | 년식=%d | 색상=%s\n", name.model, name.year, color);
	}
}

public class Ex07_07_InstanceInner {
	public static void main(String[] args) {
		
		Car2 pride = new Car2("프라이드", 2005, "파랑");
		
		pride.outInfo(); 		// 모델=프라이드 | 년식=2005 | 색상=파랑
		pride.name.innerInfo(); // model:프라이드 | 연식:2005 | 색상:파랑입니다.
		System.out.println();

		
		// 이너클래스의 생성자를 이용해서 객체 생성해보기
		// Outer클래스.Inner클래스 변수명 = Outer클래스객체.new Inner클래스(생성자 인수)
		Car2.Car2name pride2 = pride.new Car2name("프랑이", 2009);
		pride2.innerInfo(); 	// model:프랑이 | 연식:2009 | 색상:파랑입니다.
		System.out.println();

		Car2.Car2name pride3 = pride.new Car2name("노란프랑이", 2015, "노랑");
		pride3.innerInfo(); 	// model:노란프랑이 | 연식:2015 | 색상:노랑입니다.
		System.out.println();

		pride.outInfo();		// 모델=프라이드 | 년식=2005 | 색상=노랑
		pride.name.innerInfo();	// model:프라이드 | 연식:2005 | 색상:노랑입니다.
	}
}
모델=프라이드 | 년식=2005 | 색상=파랑
model:프라이드 | 연식:2005 | 색상:파랑입니다.

model:프랑이 | 연식:2009 | 색상:파랑입니다.

model:노란프랑이 | 연식:2015 | 색상:노랑입니다.

모델=프라이드 | 년식=2005 | 색상=노랑
model:프라이드 | 연식:2005 | 색상:노랑입니다.
 
 
 
Comments