JAVA/연습문제

쉽게 배우는 자바 프로그래밍 2판 6장 도전문제

세언이 2022. 10. 18. 10:42
반응형

# 개발 공부하는 초보자가 작성한 답안이니 정답이 아닐 수 있습니다!!!

 

 

1. 다음와 같은 멤버를 가진 상속 관계의 클래스 3개를 명시적인 생성자 없이 작성해 보자.

📢주어진 값📢
Girl 클래스 
String name;


GoodGril 클래스
void show();


BestGril 클래스
void show();

1-1. 상속 관계를 가진 3개의 클래스를 작성한다. GoodGirl 클래스와 BestGirl 클래스의 show() 메서드는 각각 '그녀는 자바를 잘 안다.', '그녀는 자바를 무지하게 잘 안다.'를 출력하는 실행문만 포함한다.

🧤정답🧤
public class GoodGirl extends Girl {
	public void show() {
		System.out.println("그녀는 자바를 잘 안다.");
	}
}

public class BestGirl extends GoodGirl {
	public void show() {
		System.out.println("그녀는 자바를 무지하게 잘 안다.");
	}
}

1-2. 다음과 같이 GirlTest 클래스를 작성한다.

📢주어진 값📢
public class GirlTest {
	public static void main(String[] args) {
		Girl g1 = new Girl();
		Girl g2 = new GoodGirl();
		GoodGirl gg = new BestGirl();

//		g2.show();
		gg.show();
	}
}

1-3. 메인 메서드의 7행 주석을 제거한 후 실행하면 오류가 발생하는데 원인을 살펴본다.

🧤정답🧤
public class Girl {
	String name;
}

public class GoodGirl extends Girl {
	public void show() {
		System.out.println("그녀는 자바를 잘 안다.");
	}
}

public class BestGirl extends GoodGirl {
	public void show() {
		System.out.println("그녀는 자바를 무지하게 잘 안다.");
	}
}

public class GirlTest {

	public static void main(String[] args) {
		Girl g1 = new Girl();
		Girl g2 = new GoodGirl();
		GoodGirl gg = new BestGirl();

//		g2.show(); 
		gg.show();
	}
}


Girl이라는 클래스에는 show라는 메서드가 없기 때문에 오류가 발생한다.
즉 new라는 생성자를 통해 Goodgirl 클래스의 인스턴스를 생성 후 타입이 Gril 클래스 g2에 대입했기 때문에

1-4. 다시 주석 처리한 후 실행하고 다음 결과와 비교한다.

📢결과 값📢
그녀는 자바를 무지하게 잘 안다.
🧤정답🧤
그녀는 자바를 무지하게 잘 안다.

 

 

2. Girl 클래스와 자식 클래스에 다음 그림을 참고해서 Girl 클래스에만 생성자, private 필드, show() 메서드를 추가한 후 실행해 보자.

📢주어진 값📢
Girl 클래스 
private String name;
void show();
Girl(String name);


GoodGril 클래스
void show();


BestGril 클래스
void show();

2-1. 그림과 같이 Girl 클래스와 자식 클래스를 수정 또는 추가한다. Girl 클래스의 show() 메서드는 단순히 '그녀는 자바 초보자이다.'를 출력하는 실행문만 포함한다.

🧤정답🧤
public class Girl {
	private String name;

	void show() {
		System.out.println("그녀는 자바 초보자이다.");
	}
}

2-2. 그런데 Girl 클래스에 오류가 발생한다. Gril 클래스에 디폴트 생성자를 추가하면 오류가 사라지는지 살펴본다.

🧤정답🧤
오류가 사라진다.

처음 오류가 발생한 이유는 생성자를 호출할때 매개변수로 String 갑을 가져야 하지만,
default 생성자에는 매개변수가 없기 때문에 가능하다.

2-3. GirlTest 클래스의 7행 주석을 제거한 후 실행하고 다음 결과와 비교한다.

📢주어진 출력값📢
그녀는 자바를 잘 안다.
그녀는 자바를 무지하게 잘 안다.
🧤정답🧤
public class GirlTest {

	public static void main(String[] args) {
		Girl g1 = new Girl();
		Girl g2 = new GoodGirl();
		GoodGirl gg = new BestGirl();

		g2.show();
		gg.show();
	}
}

 

 

3. 다음을 참고해 Girl 클래스의 필드에 대한 접근 범위를 변경하고 자식 클래스에도 생성자를 추가해보자.

📢주어진 값📢
Girl 클래스 
protected String name;
void show();
Girl();  -------------------> 제거
Girl(String name);


GoodGril 클래스
void show();
GoodGirl(String name);


BestGril 클래스
void show();
BestGirl(String name)

3-1. 그림과 같이 Girl 클래스와 자식 클래스를 수정한다. 그리고 GoodGirl 클래스와 BestGirl 클래스의 생성자는 다음 실행문을 포함하는 본체로 추가하며, 모든 show() 메서드의 실행 결과에서 '그녀는' 대신에 name이 출력되도록 수정한다.

📢주어진 값📢
super(name);
🧤정답🧤
public class BestGirl extends GoodGirl {
	public BestGirl(String name) {
		super(name);
	}

	public void show() {
		System.out.println(name + "는 자바를 무지하게 잘 안다.");
	}
}

public class GoodGirl extends Girl {
	public GoodGirl(String name) {
		super(name);
	}

	public void show() {
		System.out.println(name + "는 자바를 무지하게 잘 안다.");
	}
}

3-2. GirlTest.java 코드의 메인 메서드 본체를 다음과 같이 수정하고 실행한다.

📢주어진 값📢
Girl[] girls = { new Girl("갑순이"), new GoodGirl("콩쥐"), new BestGirl("황진이") };

for (Girl g : girls) {
	g.show();
}
🧤정답🧤
public class BestGirl extends GoodGirl {
	public BestGirl(String name) {
		super(name);
	}

	public void show() {
		System.out.println("그녀는 자바를 무지하게 잘 안다.");
	}
}

public class GoodGirl extends Girl {
	public GoodGirl(String name) {
		super(name);
	}

	public void show() {
		System.out.println("그녀는 자바를 잘 안다.");
	}
}

public class Girl {
	protected String name;

	void show() {
		System.out.println("그녀는 자바 초보자이다.");
	}

	public Girl(String name) {
	}
}

public class GirlTest {
	public static void main(String[] args) {
		Girl[] girls = { new Girl("갑순이"), new GoodGirl("콩쥐"), new BestGirl("황진이") };
		for (Girl g : girls) {
			g.show();
		}
	}
}

 

반응형