본문 바로가기
솔루션모음/자바 기초부터 하나씩

[자바 기초부터 하나씩/11장 연습문제 솔루션 답지 해답] 다형성

by 이얏호이야호 2020. 4. 1.

1. 참 또는 거짓

만약 거짓이면, 이유를 설명하여라.

a. 자바가 다형성을 제공하지 않았더라도, 후기 바인딩의 효과는 if-else문을 사용하여 수행될 수 있다.

:

b. 자바 컴파일러가 다음 문장

x.doSomething();

을 검사할 때, 컴파일러는 실행 시에 어떤 코드가 실행될지 결코 알지 못한다.

: 거짓. private,static,final 키워드에 대한 동적 바인딩이 없으므로 컴파일러는 실행할 코드를 결정 할 수 있습니다.

c. 자바 컴파일러가 다음 문장

x.doSomething();

을 검사할 때, 컴파일러는 실행 시에 어떤 코드가 실행될지 항상 알고 있다.

: 거짓. 동적 바인딩은 모든 메소드에 사용됩니다. 하지만 private, static, fianal키워드로 표시된 메소드는 사용되지 않습니다.

d. 자바 컴파일러가 다음 문장

x.doSomething();

을 검사할 때, 컴파일러는 실행 시에 어떤 코드가 실행될지 때로는 알고 있다.

:

e. 메소드 오버로딩은 다형성의 한 형태이다.

:

f. 객체의 선언 유형은 실행 시에 어떤 메소드가 선택되었는지를 결정한다.

: 거짓. 선언 유형은 그 유형으로 업캐스트 될 수 있는 클래스를 참조할 수 있습니다.

g. 후기 바인딩은 static 메소드에 적용될 수 없다.

:

h. 다형성은 코드 갱신을 더 유연하고 쉽게 할 수 있도록 해준다.

:

 

3. 컴파일러 실행

a. 각각의 CD, DVD, MP3클래스는 두 개의 인터페이스는 PlayableSource를 구현한다고 가정하여라.

public interface Playable

{

public void play();}

public interface source

{

public void source();}

단답형 문제 2번의 printList(...) 메소드에 대한 코드로 문제가 있는가? 왜 그런지 또는 왜 아닌지 설명하여라.

: 문제가 있습니다. source()코드가 작동하기 위해서는 printList()가 사용하는 인터페이스 Playable에 정의되어야 합니다.

 

b. 예제 11.222행에 있는 shape.draw(1,1) 메소드 호출을 다음 코드로 대체하여 오류가 발생한다면, 어떤 오류이겠는가? 답을 설명하여라.

if(shape instanceof Square)

((Square)shape).draw(1,1);

else if(shape instanceof RightTriangle)

((RightTriangle)shape).draw(1,1);

else if(shape instanceof Triangle)

((Triangle)shape).draw)1,1);

: 오류가 발생하지 않습니다.

 

다음의 코드로 대체하면 어떻겠는가? 답을 설명하여라.

if(shape instanceof Square)

shape.draw(1,1);

else if(shape instanceof RightTriangle)

shape.draw(1,1);

else if(shape instanceof Triangle)

shape.draw(1,1);

: draw()를 호출하기 전에 타입 변환이 없기 때문에 오류가 있습니다.

 

 

4. 출력 계산

a. 다음 코드의 출력을 구하여라.

public class Point

{

int x, y;

public Point ()

{

x = y = 0;

}

 

public Point(int a, int b)

{

x = a;

y = b;

}

 

public boolean equals(Point p)

{

return ( p.x == x && p.y == y);

}

}

public class Example

{

public static void main(String[] args)

{

Object a;

Object b;

a = new Point(3, 4);

b = new Point (3, 4);

System.out.println(a.equals(b));

}

}

출력

false

 

b.다음 코드의 출력을 구하여라.

public class Point

{

int x, y;

public Point ()

{

x = y = 0;

}

 

public Point(int a, int b)

{

x = a;

y = b;

}

 

public boolean equals(Point p)

{

return ( p.x == x && p.y == y);

}

}

public class Example

{

public static void main(String[] args)

{

Object a;

Object b;

a = new Point(3, 4);

b=a;

System.out.println(a.equals(b));

}

}

출력

true

 

 

7. 추상 클래스 대 인터페이스

다음 클래스는 예제 11.4에 있는 클래스를 변경한 것이다. 여기서 Playable은 인터페이스가 아닌 추상클래스이다.

public abstract class Playable

{

public abstract void play();

}

그리고 CD, DVD, MP3 각각은 Playable을 구현하지 않고 확장한다.

public class CD extends Playabe

{

//CD에 대한 메소드

}

public class DVD extends Playable

{ //DVD에 대한 메소드

}

public class mp3 extends Playable

{

//mp3에 대한 메소드}

a. Playable을 추상 클래스가 아닌 인터페이스로 설계하는 것의 이점을 설명하여라.

: 인터페이스 Playable은 클래스가 Playable의 다른 클래스들을 사용할 수 있게 해줍니다.

b. 인터페이스가 추상 클래스보다 명백히 더 좋은 다른 예를 기술하여라.

: 인터페이스가 더 나은 경우는 2개의 클래스가 메소드의 signature이외에 유사성을 공유하지 않는 경우 추상클래스보다 더 좋습니다.

 

 

8. 다형성과 OOP 요구

다른 프로그래밍(예를 들어, 절차적 프로그래밍)의 경험이 있다면, 제이콥스(B. Jacobs)가 쓴 'OOP 과잉 판매-객체지향 패러다임의 비판(OOP Oversold-A Critique of the OO Paradigm)'에서 발췌한 다음 내용은 동의 여부와 관계없이 흥미롭게 느껴질 것이다.

 

객체지향 프로그래밍의 인기로 인해 관리 등에서 이를 사용하는 이유 중 하나는 OOP가 주장하는 능력을 보여주는 재치 있는 작은 예제들이다. 대부분의 전문가들은 이러한 예제가 좋은현실상의 객체지향 프로그래밍을 대변하지 않는다는 것을 알고 있다. 실제적인 구현에서는 다른 프로그래밍 언어들보다 더 번잡하고 혼란스럽게 만드는 꽤나 복잡한 배치들이 실제 객체지향에 종종 포함된다. 객체지향 옹호자들은 이런 간단한 예문들을 단순한 교육용이라고 항변하지만, 막상 예문 앞에 단순 교육용이라고 써놓은 것을 본 적이 없다. OOP를 처음 접하는 경우라면, 단순한 예제에 속지 않기를 바란다. 이러한 유인 예제들은 종종 기하학적 도형, 동물의 종류, 차량 분류, 자동차 부품, 직원 유형, Y2K 날짜, 스택 장치 드라이버, 의류, 은행 계정 예제의 형식을 갖는다.”

 

이런 예제들은 종종 세상이 완전하고 불변하는 (또는 계층적으로 변하는) 카테고리 또는 덩어리들로 나눠질 수 있다고 가정하는데, 그 카테고리 내의 특징들은 항상 카테고리에 속해 있거나 또는 일반적으로 나눠지지 않는 덩어리의 형태로 항상 같은 모양으로 변화한다. 진실은 더 지저분하고, 객체 지향은 경쟁 관계에 있는 패러다임에 비해 동적인 특징 관계와 변화를 다룸에 있어 최적화되어 있지 않기에 많은 경우에 결국은 더 번잡스럽게 보이게 된다.

 

a. 저자가 생각하는 단순한 교육용의 예를 이 장에서 찾아 저자의 주장을 뒷받침하고, 이유를 설명하여라.

: DVD,MP3,CD로 구현된 Playable은 단순한 교육용 예라는 생각이 듭니다. 누구나 알기 쉽고 이해하기 쉬운 예제입니다. 다형성으로 새로운 장치의 추가를 쉽게 알 수 있습니다.

 

b. 다형성에 대한 정당한 실질적인 이득을 증명하는 예를 찾아 설명하여 저자의 주장에 대해 논의해 보아라.

: 다형성을 통해 만들어진 Playable은 쉽게 DVD,MP3,CD를 생성할 수 있게끔 해줍니다. 누구나 알기 쉽게끔 하는 단순한 교육용프로그램은 누구나 알수 있는 쉬운 예제를 사용한다면 쉬운 접근이 가능하다고 생각합니다

 

 

댓글