코드 그라데이션

Has 관계 예제 본문

Java/Mega

Has 관계 예제

완벽한 장면 2023. 4. 5. 10:24

 

 

package Day16;

class Car{
	String color;
	String menu;
	int maxSpeed;
	
	Car(String color, String menu, int max){ // 고생방지
		this.color = color;
		this.menu = menu;
		maxSpeed = max; // 매개변수의 이름을 바꿔서 넣으면, this를 안 써도 된다.
	}
	
	void dirve(String driver) { // 여기가 비어있으면 비어있는대로 출력이 될 것이니까.
		System.out.println(driver+"자동차 색깔 "+color+"이고 제조사가 "+menu+"인 차를 최고속도로 "+
				maxSpeed+"로 운전을 합니다.");
	}
}

class Bicycle{
	String menu;
	String func;
	
	Bicycle(String menu, String func){
		this.menu = menu;
		this.func = func;
	}
	
	void ride(String dirver) {
		System.out.println(dirver+"자전거 제조사가 "+menu+"인 기능이 "+
				func+"로 자전거를 탑니다.");
	}
}

class Bike{
	String color;
	String menu;
	int maxSpeed;
	
	Bike(String color, String menu, int maxSpeed){
		this.color = color;
		this.menu = menu;
		this.maxSpeed =maxSpeed;
	}
	void dirve(String dirver) {
		System.out.println(dirver+"오토바이 색깔 "+color+"이고 제조사가 "+menu+"인 오토바이를 최고속도로 "+
				maxSpeed+"로 운전을 합니다.");
	}
}

class Human1{
	String name = "첫번째 사람";
	Car c1;
	Car c2;
	
	void car1Dirve() {
		c1.dirve(name);
	}
	void car2Driver() {
		c2.dirve(name);
	}
}

class Human2{
	String name = "두번째 사람";
	Bicycle b;
	Bike m;
	
	void bicycleRide() {
		b.ride(name);
	}
	void bikeDrive() {
		m.dirve(name);
	}
}

public class Q1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Car c1 = new Car("은색", "Ford", 220);
		Car c2 = new Car("검정색", "BMW", 240);
		Car c3 = new Car("하얀색", "삼성", 200);
		Car c4 = new Car("형광색", "현대", 180);
		
		Bicycle b1 = new Bicycle("삼천리", "산악용");
		Bicycle b2 = new Bicycle("자이언트", "접이식용");
		
		Bike m = new Bike("빨간색", "대림", 180);
		
		Human1 h1 = new Human1();
		h1.c1 = c2;
		c2 = null;
		h1.c2 = c4;
		c4 = null;
		
		Human2 h2 = new Human2();
		h2.b = b1;
		b1 = null;
		h2.m = m;
		m = null;
		
		h1.car1Dirve();
		h1.car2Driver();
		
		h2.bicycleRide();
		h2.bikeDrive();
		
	}

}

 

Q1. 이 부분에서 c1과 c2가 의미하는 것이 뭐야?

c1c2Human1 클래스의 멤버 변수인 Car 객체를 참조하는 변수입니다. Car 클래스의 객체를 생성하여 c1c2에 할당하는 코드는 main 메소드에서 이루어졌습니다.

 

car1Dirve()car2Driver() 메소드에서는 Human1 객체의 name 멤버 변수와 c1 또는 c2가 참조하는 Car 객체의 정보를 출력하는 메소드인 drive()를 호출합니다. 이를 통해 Human1 객체가 가지고 있는 두 대의 자동차를 운전하는 동작을 시뮬레이션하는 것입니다.

 

 

Q2.

"car1Dirve()car2Driver() 메소드에서는 Human1 객체의 name 멤버 변수와 c1 또는 c2가 참조하는 Car 객체의 정보를 출력하는 메소드인 drive()를 호출합니다." 이 말은 class Car에 있는 drive() 메소드를 호출한다는 뜻이야?

 

, 맞습니다. car1Dirve()car2Driver() 메소드에서 Human1 객체가 가지고 있는 Car 객체(c1 또는 c2)의 정보를 출력하기 위해 Car 클래스에 정의된 drive() 메소드를 호출합니다.

따라서 Car 클래스의 drive() 메소드가 호출되며, 인자로 Human1 객체의 name 멤버 변수를 전달하여 출력 결과를 생성합니다.

 

Q3. 그럼 여기서 전달되는 매개변수인 drive와 필드의 name은 동일한 의미를 지니는 거야?

 

아니요, drivename은 서로 다른 변수입니다.

driveCar 클래스의 drive() 메소드의 매개변수로 사용되는 변수입니다. 이 변수는 메소드 내에서 전달된 문자열 값을 출력하는 데 사용됩니다.

반면에 nameHuman1 클래스의 필드로, Human1 객체의 이름을 저장하는 변수입니다. nameHuman1 객체에서 사용되며, Car 클래스와는 전혀 상관없는 변수입니다.

 

따라서 car1Dirve()car2Driver() 메소드에서 전달하는 인자는 Human1 객체의 name 필드이며, drive() 메소드의 매개변수로 사용됩니다.

 

Q4. 그럼 c1은 어떻게 바로 Human1에서 사용할 수 있는 거야?

 

Human1 클래스에서 Car 객체의 레퍼런스를 저장하는 필드 c1c2를 선언하고 있습니다. 이 필드는 Car 클래스의 인스턴스를 참조할 수 있는 레퍼런스를 저장합니다.

 

main 메소드에서 Car 객체를 생성한 후, Human1 객체의 c1 필드에 c2 객체를 참조시킨 뒤 c2 변수에 null 값을 할당한 것을 볼 수 있습니다. 이를 통해 c2 객체의 레퍼런스는 제거되고, Human1 객체의 c1 필드는 여전히 c2 객체를 참조하고 있는 상태가 됩니다.

 

따라서 car1Dirve() 메소드에서 c1 필드를 사용하여 Human1 객체가 참조하고 있는 Car 객체를 가져와 drive() 메소드를 호출할 수 있게 됩니다.

 

 

 

Q5. 그럼 b.ride(name);m.dirve(name); 에서 매개변수로 사용되는 nameride()에서 어떻게 사용되는 거야?

 

nameHuman2 클래스의 인스턴스 변수이고, "두번째 사람"이라는 문자열이 미리 할당되어 있습니다. b.ride(name)에서 name 매개변수는 "두번째 사람" 문자열이 전달됩니다. 따라서 "두번째 사람" 자전거 제조사가 삼천리인 기능이 산악용으로 자전거를 탑니다." 라는 출력 결과가 나오게 됩니다. 마찬가지로 m.drive(name)에서 name 매개변수도 "두번째 사람" 문자열이 전달됩니다. 따라서 "두번째 사람" 오토바이 색깔 빨간색이고 제조사가 대림인 오토바이를 최고속도로 180로 운전을 합니다."라는 출력 결과가 나오게 됩니다.

 

 

선생님 설명 중에서, 채워넣고 부르면 된다!

 

void car1Dirve() {
c1.dirve(name);
}
void car2Driver() {
c2.dirve(name);
}

 

이 말이 무슨 뜻이지...

=> 지금 그냥 이 메서드 들에서는 객체 생성 행위 자체가 없으므로 그대로 부르면 당연히 에러가 나게 되어 있음.

    왜냐면 지금 객체 생성 행우 자체가 c1메서드에서 아예 없었지.

 

 

그런데 얘들이 머리 쓴거지.

    담보를 해줄게 함수 불러다 쓰게 해줘.

 

h1.c1 = c2; 그래서 메인 메서드에서 c2 값을 "c1에 저장해서 사용해줄게" 라고 말해놓고 쓰는 형태.
 
실객체는 new+생성자
변수는 조정하는 값.
728x90

'Java > Mega' 카테고리의 다른 글

Day19. HasTest2(Has관계) 두 번째 예제 설명  (0) 2023.04.08
Day19. 문방구 퀴즈 <제품 구매> 공통 코드  (0) 2023.04.08
Day16 (2). 생성자(2), HAS 관계  (0) 2023.04.05
Day16 (1). 생성자  (0) 2023.04.05
Day15. 클래스 도입  (0) 2023.04.05
Comments