1.참 또는 거짓
만약 거짓이면, 이유를 설명하여라.
a. private 인스턴스 변수는 protected 인스턴스 변수와 다르지 않다.
답 : 거짓. protected 변수는 서브클래스에 접근 가능하지만 private는 접근이 불가능합니다.
b. 서브 클래스는 생성자를 제외하고 기본 클래스로부터 모든 메소드를 상속받는다.
답 : 거짓. 서브클래스는 private메소드를 상속받지 않습니다.
c. X extends Y는 Y가 X를 상속받는다는 것을 의미한다.
답 : 거짓. X가 Y를 상속받음
d. 모든 클래스는 Object를 확장한다.
답 : 참.
e. 상속의 중요한 이점은 프로그래머가 클래스 정의 부분을 다시 입력하는 수고를 덜어주는 것이다.
답 : 거짓. 오브젝트를 더욱 적극적으로 사용이 가능하다는 장점이 있습니다.
f. X가 Y로부터 상속받는다는 것은 X가 Y의 한 종류라는 것을 의미한다.
답 : 참
g. Y가 X로부터 상속받는다는 것은 X가 Y를 갖는다는 것을 의미한다.
답 : 거짓.
h. X가 Y를 사랑한다는 것은 X가 Y를 원한다는 것을 의미한다.
답 : 참
I. 하나의 클래스가 두 개의 클래스를 확장하는 것은 허용되지 않는다.
답 : 참
j. 하나 이상의 클래스가 같은 클래스를 확장하는 것은 허용된다.
답 : 참
k. 한 클래스가 하나 이상의 인터페이스를 구현하는 것은 허용되지 않는다.
답 : 거짓. 다중상속이 허용됩니다.
l. 추상클래스와 인터페이스 사이에 차이점은 없다.
답 : 거짓. 추상클래스는 일반 메소드 포함 가능하며, 인터페이스는 모든메소드가 추상메소드입니다. 추상클래스는 상수, 변수 필드 포함 가능하지만 인터페이스는 상수 필드만 포함 가능합니다. 추상클래스는 모든 서브 클래스에 공통된 메소드가 있는 경우는 추상 클래스가 적합하고, 인터페이스는 다중 상속을 지원합니다.
m. 인터페이스는 오로지 private 인스턴스 변수만 가질 수 있다.
답 : 거짓. 오직 public 인스턴스 변수만 가질 수 있음.
n. 인터페이스는 절대로 메소드를 구현할 수 없다.
답 : 참.
o. static 상수들이 없다면 인터페이스는 생성이 가능하다.
답 : 거짓. 인터페이스는 인스턴스화 시킬 수 없습니다.
p. 인터페이스는 인스턴스 변수를 가지지 않는다.
답 : 참.
q. 만약 X가 Y를 확장하면 X는 Y를 갖는다.
답 : 거짓. X has-a Y의 관계가 될 수 있지만 보증할 수 없습니다.
r. 만약 X가 Y를 확장하면 X는 Y의 한종류이다.
답 : 참
s. 한 클래스가 같은 이름의 두 가지 속성을 갖는 것은 허용되지 않는다.
답 : 참
t. 서브 클래스가 수퍼 클래스에 있는 속성과 같은 이름의 속성을 갖는 것은 허용되지 않는다.
답 : 거짓. Override 가능합니다.
2.합성, 속성 또는 둘 다 아님
다음 한 쌍의 클래스 각각에 대해, 한 클래스가 다른 클래스로부터 상속받을 수 있는지, 다른 클래스를 포함하는지, 또는 둘 다 아닌지를 설명하여라.
a. RetailStore(소매점)과 Manager(관리자)
답 : 소매점에는 관리자가 포함됩니다. 관리자는 소매점의 종류가 아니기 때문에 소매점으로부터 상속받을 수 없습니다.
b. CashRegister(금전 등록기)와 RetailStore(소매점)
답 : 소매점은 금전 등록기를 포함합니다. 금전등록기는 소매점의 종류가 아니기 때문에 소매점을부터 상속받을 수 없습니다.
c. BookStore(서점)과 RetailStore(소매점)
답 : 서점은 소매점과 비슷한 부류입니다. 서점은 소매점으로부터 상속받을 수 있습니다.
d. Book(책)과 BookStore(서점)
답 : 서점은 많은 책들을 가지고 있습니다. 책은 서점의 종류가 아니기 때문에 서점으로부터 상속받을 수 없습니다.
e. Employee(종업원)과 Manager(관리자)
답 : 매니저는 종업원의 일종이기 때문에 종업원으로부터 매니저는 상속받을 수 있습니다
f. Manager(관리자)와 BookStore(서점)
답 : 서점은 관리자를 가지고 있습니다. 하지만 관리자는 서점의 종류가 아니기 때문에 서점으로부터 상속받을 수 없습니다.
g. Shelf(책꽂이)와 Book(책)
답 : 책꽂이는 책들을 포함합니다. 책은 책꽂이의 종류가 아니기 때문에 책꽂이로부터 상속받을 수 없습니다.
h. Shelf(책꽂이)와 BookStore(서점)
답 : 서점은 많은 책꽂이를 갖습니다. 책꽂이는 서점의 종류가 아니기 때문에 책꽂이는 서점으로부터 상속받을 수 없습니다.
I. Customer(고객) 와 BookStore(서점)
답 : 고객은 서점의 종류가 아닙니다. 때문에 고객은 서점으로부터 상속받을 수 없습니다.
j. Manager(관리자)와 Cashier(출납원)
답 : 두 클래스는 관련이 없습니다. 하지만 employee 클래스가 있다면 각각 다른 타입으로 상속받을 수 있습니다.
k. Cashier(출납원)과 RetailStore(소매점)
답 : 소매점은 출납원을 포함합니다. 출납원은 소매점의 종류가 아니기 때문에 출납원은 소매점으로부터 상속받을 수 없습니다.
l. Salary(봉급)과 Employee(종업원)
답 : 종업원은 봉급을 받습니다. 봉급은 종업원의 종류가 아니기 때문에 상속받을 수 없습니다.
m. Cashier(출납원)과 Salary(봉급)
답 : 출납원은 봉급을 받습니다. 봉급은 출납원의 종류가 아니기 때문에 상속받을 수 없습니다.
n. Abbott(애보트)와 Costello(코스텔로)
답 : 두 가지는 직접적 연관이 없습니다. 하지만 개그맨 클래스가 있다면 각각 상속받을 수 있습니다.
o. Singer(가수)와 MichaelJackson(마이클 잭슨)
답 : 마이클잭슨은 가수에 포함되기 때문에 가수클래스로부터 상속받을 수 있습니다.
p. Square(정사각형)과 Cube(정육면체) (속일수 있음!)
답 : 정육면체는 정사각형의 일종이기 때문에 상속받을 수 있습니다.
q. Game(게임)과 Dice(주사위)
답 : 게임은 주사위를 포함합니다. 주사위는 게임의 종류가 아니기 때문에 상속받을 수 없습니다.
r. Game(게임)과 Monopoly(모노폴리 게임)
답 : 모노폴리는 게임의 종류입니다. 모노폴리게임은 게임으로부터 상속받을 수 있습니다.
s. Opera(오페라)와 Musical(뮤지컬) (속일 수 있음!)
답 : 오페라와 뮤지컬은 직접적 연관이 없습니다. 대신에 극장이라는 클래스가 있다면 각각 상속받을 수 있습니다.
t. Muscial(뮤지컬)과 MuscalComedy(뮤지컬 코미디)
답 : 뮤지컬코미디는 뮤지컬의 종류입니다. 뮤지컬코미디는 뮤지컬로부터 상속받을 수 있습니다.
u. Beer(맥주)와 Drinks(주류)
답 : 맥주는 주류의 종류입니다. 맥주는 주류로부터 상속받을 수 있습니다.
v. Telephone(전화기)와 Buttons(버튼)
답 : 전화기는 버튼을 가지고 있지만, 버튼은 전화기의 종류가 아니기 때문에 전화기로부터 상속받을 수 없습니다.
w. Wardrobe(옷장)과 Pants(팬츠)
답 : 옷장에는 팬츠가 포함됩니다. 하지만 팬츠는 옷장의 종류가 아니기 때문에 옷장으로부터 상속받을 수 없습니다.
x. ProgrammingExercises(프로그래밍 연습문제)와 ProgrammingBook(프로그래밍책)
답 : 프로그래밍책은 연습문제를 포함하고 있습니다. 하지만 연습문제는 프로그래밍책의 종류가 아니기 때문에 상속받을 수 없습니다.
y. Editor(편집자)와 Author(저자)
답 : 두 가지는 직접적인 연관은 없습니다. 하지만 출판사라는 클래스가 있다면 상속받을 수 있습니다.
z. Circle(원)과 Cylinder(원기둥)
답 : 두 가지는 직접적인 연관은 없습니다. 하지만 모양이라는 클래스가 있다면 각각 상속이 가능합니다.
4. 컴파일러 실행- 생성자
다음 클래스들이 컴파일되지 않는 이유를 설명하여라.
public class Mama {
protected int x;
public Mama()
{
x = 0;
}
public Mama(int y)
{
x = y;
}
}
public class Son extends Mama{
public Son(){
}
public static void main(String[] args) {
Son s = new Son(2);
}
}
답 ; Son클래스에 생성자 중에 int값이 들어가는 생성자가 없기 때문에 Son s = new Son(2); 부분에서 오류가 생긴다.
5. 컴파일러 실행 - 업캐스팅과 다운캐스팅
다음 클래스들이 컴파일되지 않는 이유를 설명하여라.
public class Papa {
protected int x;
public Papa(){
x=0;
}
public Papa(int y){
x = y;
}
}
public class Daughter {
public Daughter(){
}
public static void main(String[] args) {
Daughter d = new Papa(2);
}
}
답 : 적절하지 못한 다운캐스팅으로 인해 Daughter d = new Papa(2);부분에 오류가 생겼기 때문입니다.
7.다음 코드의 출력은 무엇인가? 설명하여라.
public class Papa {
protected int x;
public Papa(){
x=0;
}
public Papa(int y){
x = y;
}
}
public class Son extends Papa{
public Son(){}
public Son(int x){}
public static void main(String[] args) {
Son s = new Son();
System.out.println(s.x);
Papa t = new Son(2);
System.out.println(t.x);
}
}
출력
0
0
10.오류 수정
클래스들을 살펴보고, 다음 질문에 답하여라.
a. 컴파일러 오류를 발생시키는 두 개의 System.out.println() 명령문을 찾아라. 오류가 무엇인가?
답 : 두 개의 System.out.println(temp.x);에서 오류가 납니다. x가 private로 선언되어 있어 사용못합니다.
b. 이 두 행을 삭제한다면 코드가 컴파일 된다. 나머지 System.out.println()문장은 화면에 무엇을 표시하는가?
출력
0
0
2
0
0
2
public class X {
private int x;
protected int y;
public X(){
x=0;
y=0;
}
private int helper(int x)
{
return x*x;
}
public int access(){
return (helper(x));
}
}
public class Y extends X{
int x;
public Y(){
super();
x=2;
}
public static void main(String[] args){
X temp = new X();
Y tempo = new Y();
System.out.println(temp.access());
System.out.println(tempo.access());
System.out.println(tempo.x);
System.out.println(temp.x);
temp = tempo;
System.out.println(temp.access());
System.out.println(tempo.access());
System.out.println(tempo.x);
System.out.println(temp.x);
}
}
12. 출력계산
다음 코드를 살펴보고 출력을 결정하여라.
public abstract class Test {
protected int value1;
int value2;
Test(){
value1 = 0;
value2 = 0;
}
Test(int value1){
this.value1 = value1;
value2 =value1;
}
public void implementEd(){
for(int j=0;j<value1;j++)
System.out.println("All done");
}
public abstract void notImplemented(int x);
}
public class TestTest extends Test {
int myvariable;
TestTest(){
super();
myvariable = 3;
}
TestTest(int x){
super(x);
myvariable = x + 3;
}
public void notImplemented(int x)
{
value2 = value2 + x;
value1 = value1 * x;
System.out.println("This was called with the value "+x);
System.out.println("My variable is " + myvariable);
}
public static void main(String[] args) {
TestTest h = new TestTest();
TestTest j = new TestTest(4);
h.implementEd();h.notImplemented(5);h.implementEd();
System.out.println(h.value2);System.out.println(h.value1);
j.implementEd();j.notImplemented(5);;j.implementEd();
System.out.println(j.value1);System.out.println(j.value2);
}
}
출력
This was called with the value 5
My variable is 3
5
0
All done
All done
All done
All done
This was called with the value 5
My variable is 7
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
All done
20
9
15.추상 클래스, 업캐스팅, 다운캐스팅 - Production 계층
다음 어느 행이 오류를 발생시키는지 결정하여라. 이 장의 Production 계층을 사용하여라. 각각의 경우에 대해 오류의 원인을 설명하여라.
a. Production p = new Musical("Sweeny Todd", "Harold Prince", "Hugh Wheeler", "Stephen Sondheim","Stephen Sondheim",557);
답 : 오류가 없습니다.
b. Production p = new Production();
답 : 오류가 없습니다.
c. Muscial m = new Film();
답 : Musical과 Film클래스는 p 그룹에 포함이 됩니다. 하지만 Musical = Film이 아니기 때문에 오류가 납니다.
d. Muscial m = new Muscial();
답 : 오류가 없습니다.
e. Play p = new Musical(); p.getDirector(); ((Muscial)p).getComposer();
답 : 오류가 없습니다.
f. Film play = new Musical();
답 : Musical과 Film클래스는 p 그룹에 포함이 됩니다. 하지만 Musical = Film 이 아니기 때문에 오류가 납니다.
g. Production p = new Musical(); p.getDirector() ((Play)p).getDirector();
((Play)p).getComposer();
답 : getComposer라는 메소드가 없기 때문에 오류가 납니다.
h. Comparable c = new Musical(); Film f = new Musical(); c.compareTo(f);
답 : Muscial과 Film은 같은 그룹이지만 다른 분야이기에 오류가 납니다.
16. 상속 대 인터페이스
다음 문장은 웹에 잇는 로디 그린(Roedy Green)의 자바 용어집(Java Glossary)에서 발췌한 내용이다.
외관상으로 인터페이스와 추상 클래스는 거의 같은 능력을 제공하는 것처럼 보인다. 어느 것을 사용할지 어떻게 결정하겠는가?
인터페이스를 사용해야 할 때
인터페이스는 독자가 작성한 인터페이스를 누군가가 구현하려고 할 때 구현의 출발점부터 코딩 작업이 시작될 수 있도록 해주거나. 본래의 또는 주요한 목적이 독자의 인터페이스와 매우 다른 어떤 코드에서 독자의 인터페이스가 구현되도록 해준다. 인터페이스를 구현하려는 누군가에게 독자의 인터페이스는 단지 독자의 패키지를 사용할 수 있도록 자신의 코드에 추가해야하는 부수적인 부분이 된다.
추상 클래스를 사용해야 할 때
추상 클래스는 대조적으로 더 많은 구조를 제공한다. 이것은 일반적으로 일부 기본 구현을 정의하고 전체 구현을 위해 유용한 몇 가지 도구를 제공해준다. 결점은 이것을 사용하는 코드는 독자가 작성한 클래스를 반드시 기본 클래스로 사용해야 한다는 것이다. 독자의 패키지를 사용하고 싶어 하는 다른 프로그래머들이 이미 그들 자신의 클래스 계층을 독립적으로 개발했다면 이는 불편해질 수 있다.
이 개념들을 자신의 이야기로 설명해보아라. 인터페이스가 더 자연스로운 프로그램과, 추상 클래스의 상속이 더 자연스러운 프로그램의 예를 보여라.
추상화 클래스
public class Abstract
{
public static void main(String[] args)
{
Truck tr = new Truck();
Sedan sd = new Sedan();
tr,sound();
sd.sound();
}
}
abstract class car{
abstract void sound(); //추상메소드 구현하지 않았습니다.
void sound2(){
System.out.println("일반 메서드");
}
}
class Truck extends car
{
void sound()
{
System.out.println("빵빵");
}
}
class Sedan extends car
{
void sound()
{
System.out.println("뿌앙뿌앙");
}
}
interface car{
void sound();
}
public class Interface implements car
{
public void call()
{
System.out.println("빵빵");
}
public static void main(String[] args)
{
Interface it = new Interface();
it.call();
}
}
17. is-a, has-a, 상속의 개념
상속이 적당한 개념인지를 결정할 때 종종 is-a가 도움이 되지 않을 때가 있다. 영어로 is-a는 더 상세(상속)하다는 의미로 특이성을 의미할 수 있고, 또는 덜 상세(특별한 경우)하다는 점에서 특이성을 의미할 수도 있다.
예를 들어, 관리자가 종업원의 한 종류라고 말할 때, 관리자는 종업원이 갖는 모든 것 이상을 가진다는 것을 의미한다. 관리자가 종업원의 특별한 경우라고 할지라도, 관리자는 종업원의 개념을 확장하고 일반화한다. 그러나 모든 정수가 분수라고 말할 때, 정수는 분수의 개념을 확장하거나 일반화한다는 것을 의미하지는 않는다. 정수는 분수의 특별한 경우이고, 오히려 분수는 정수가 갖는 모든 것 이상을 갖는다는 것을 의미한다. 관리자는 당연히 종업원을 확장하지만, 정수는 당연하게 분수를 확장하지 않는다.
a. 일반적으로 만약 A가 B의 한 종류(is-a)이면, 어느 클래스가 더 특별하고 어느 클래스가 더 일반적인가?
답 : A는 특별하고 B는 일반적입니다.
b. 한 클래스가 더 특별할 때, 그 클래스는 더 많은 인스턴스 변수와 메소드를 갖는가 아니면 더 적은 것들을 갖는가? 설명하여라.
답 : 특별한 클래스가 더 많은 메소드를 갖습니다. 일반적인 클래스는 특별한 케이스 Override등을 사용하고 사용되지 않는 부분이 많습니다.
c. 정사각형은 정육면체의 한 종류인가, 아니면 그 반대인가, 또는 둘 모두 아닌가? 정사각형이 직사각형의 한 종류인가, 아니면 그 반대인가, 또는 둘 모두 아닌가? Cube,Square,Rectangle 클래스 중에 어느 것이 어느 것으로부터 상속될 수 있는가? 그 이유는? (a)와 (b)의 관점에서 이유를 설명하여라. 즉 어떤 추가적인 인스턴스 변수 또는 메소드가 사용자가 제안하는 상속 계층에서 더 특별한 클래스에 적용될 것인가?
답 : 큐브에는 사각형의 모든 것이 있기 때문에 확장이 가능에 효율적입니다. 반면 사각형에는 직사각형이 없기 때문에 확장이 비효율적입니다.
d. 점은 원의 한 종류인가, 아니면 그 반대인가? 또는 둘 모두 아닌가? 원은 원기둥의 한 종류인가, 아니면 그 반대인가? 또는 둘 모두 아닌가? Point, Circle, Cylinde 클래스중에서 어느것이 어느 것으로부터 상속 될 수 있는가? 그 이유는? (a)와 (b)의 관점에서 이유를 설명하여라. 즉, 어떤 추가적인 인스턴스 변수 또는 메소드가 사용자가 제안하는 상속 계층에서 더 특별한 클래스에 적용될 것인가?
답 : 원은 평몇, 반경으로 생각할 수 있습니다. 그러므로 Circle은 Point로 확장이 가능합니다. Cylinder는 반지름과 높이로 구성되어 Circle을 확장할 수 있습니다.
e. '상속보다는 합성을 더 선호하라.‘ 라는 말은 객체 지향 설계의 격언이다. (c)와 (d) 문제로 돌아가, 그 클래스들 중 어느것도 상속보다 합성을 통해서 다른 것으로부터 자연스럽게 만들어질 수 있는지를 상세하게 설명하여라.
답 : 큐브는 6면으로 구성되어 간단히 표현할 수 있어 큐브 구현은 자연스럽지 않을 수 있습니다. 하지만 Cylinder는 Circle의 변수, 길이로 큐브보다 자연스럽게 구현이 가능합니다.
'솔루션모음 > 자바 기초부터 하나씩' 카테고리의 다른 글
[자바 기초부터 하나씩/12장 연습문제 솔루션 답지 해답] 래퍼클래스와 예외클래스 (0) | 2020.04.01 |
---|---|
[자바 기초부터 하나씩/11장 연습문제 솔루션 답지 해답] 다형성 (0) | 2020.04.01 |
[자바 기초부터 하나씩/9장 연습문제 솔루션 답지 해답] 객체와 클래스 (0) | 2020.04.01 |
[자바 기초부터 하나씩/7장 연습문제 솔루션 답지 해답] 배열 (0) | 2020.03.31 |
[자바 기초부터 하나씩/3장 연습문제 솔루션] 반복문 (0) | 2020.03.31 |
댓글