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();
}
}
}
반응형