본문 바로가기
IT/프로그래밍

명품 JAVA Programming 4장 연습문제 정답

by nutrient 2020. 12. 11.
728x90
728x170

명품 JAVA Programming 4장 연습문제 정답

 

명품 JAVA Programming 4장 연습문제 정답

1. ④. 필드는 클래스의 중요한 속성을 나타내는 것으로 보호하기 위해 private으로 선언하는 것이 바람직하다.

2. ④. 생성자에서 어떤 위치에서든 return 문을 사용할 수 있다. 다만 return이 값을 리턴해서는 안 된다.

3. ③

4. ②. Book [] book = new Book [10]; 실행 결과 Book 객체에 대한 레퍼런스가 10개 만들어진다.

5. ①. void f(int a) { x = a; }와 int f(int b) { return x+b; }는 메소드 이름과 매 개변수 개수 및 타입이 모두 같으므로 메소드 오버로딩이 실패한 사례이다. 리턴 타입이 다른 것은 오버로딩과 관계없다.

6. (1) class TV를 this()를 이용하여 수정하면 다음과 같다.

class TV { int size; String manufacturer; public TV() { this(32, "LG"); } public TV(String manufacturer) { this(32, manufacturer); } public TV(int size, String manufacturer) { this.size = size; this.manufacturer = manufacturer; System.out.println(size + "인치 " + manufacturer); } }

(2) new TV(); 와 new TV("삼성");를 실행하면 다음과 같이 각각 실행된다.

32인치 LG 32인치 삼성

(3) TV b = new TV(65, "삼성"); (4) 생성자 코드가 중복 없이 간결해지고, 초기화 코드를 하나의 생성자로 몰아 놓 을 수 있다.

7. 컴파일 오류가 발생하는 부분은 다음 코드이며,

aPerson.age = 17;

오류 메시지는 다음과 같다.

The field Person.age is not visible

오류가 발생하는 이유는 age가 private으로 선언되어 있기 때문에, Person 클래스 바깥의 main() 메소드에서는 접근할 수 없기 때문이다. 오류를 수정하기 위해 age를 public으로 선언해서는 안 되며, Person 클래스에 이 필드를 접근할 수 있는 public 메소드를 만들어 둔다. 그러면 main()에서 이 메소 드를 이용하여 age에 접근할 수 있다. 코드는 다음과 같다.

class Person { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class Example { public static void main (String args[]) { Person aPerson = new Person(); aPerson.setAge(17); } }

이 글을 열심히 읽는 독자를 위해서 한 가지 덤으로 중요한 설명을 해보자. 앞의 정답처럼 Person 클래스를 만들어도, main()에서 setAge()를 통해서 age를 마음 대로 바꿀 수 있는데 뭐 하러 age를 private으로 두고 굳이 복잡하게 setAge(), getAge()를 만드는가? 하는 의문을 가질 수 있다. 하지만, setAge()를 다음과 같이 만들어 보자.

public void setAge(int age) { if(age < 0) return; this.age = age; }

setAge()를 이렇게 만들면 Person 클래스의 age 필드를 음수가 되지 않도록 유지 할 수 있지만, setAge() 없이 age를 public으로 공개해버리면, main() 메소드에서 다음과 같이 age를 음수로 설정하는 잘못을 저질러도 막을 수 없게 된다.

public static void main (String args[]) { Person aPerson = new Person(); aPerson.age = -20; }

정리하면, 클래스의 주요 필드는 private으로 해두고, public 속성의 set/get 메 소드를 별도로 만들어 이 메소드를 통해서만 필드를 접근하게 하여 필드의 무결성 을 유지하는 것이 좋은 객체지향프로그래밍이다.

8. (1) 생성자를 이용하여 수정하면 다음과 같다.

class Power { private int kick; private int punch; public Power(int kick, int punch) { this.kick = kick; this.punch = punch; } } public class Example { public static void main (String args[]) { Power robot = new Power(10, 20); } }

(2) 생성자 대신 set() 메소드를 추가하여 수정하면 다음과 같다.

class Power { private int kick; private int punch; public void set(int kick, int punch) { this.kick = kick; this.punch = punch; } } public class Example { public static void main (String args[]) { Power robot = new Power(); robot.set(10, 20); } }

9.

자바에서는 객체를 임의로 소멸시킬 수 없으며, 이것은 개발자에게 매우 다행한 일이다. 참조하는 레퍼런스가 하나도 없는 객체를 가비지라고 판단하고, 이를 가용 메모리로 자동 수집하는 가비지 컬렉션을 진행시킨다. 응용프로그램에서 자바 플랫폼에 이 과정을 지시 하고자 하면 System.gc() 코드를 호출하면 된다.

10. (1) s = new String("Hello"+n); 라인을 실행할 때 가비지가 발생한다. for 문에서 n이 0일 때는 가비지가 발생하지 않지만, n이 1일 때 s는 새로운 String 객체를 가리키게 되어 이전에 생성된 String 객체는 가비지가 된다. 가비지 발생은 n 이 1부터 9까지 반복된다. (2) 가비지가 발생하지 않는다. 처음 세 라인이 실행되면 a, b, c 모두 new String("aa")에 의해 생성된 String 객체를 가리키므로 a와 b가 null이 되어 도 레퍼런스 c가 String 객체를 여전히 가리키고 있기 때문이다.

11. ④ static int g() { return getB(); } static 메소드에서 non-static 멤버를 접근할 수 없다.

12. ① StaticSample.x = 5; non-static 멤버 x는 클래스 이름으로 접근할 수 없다.

13. 코드에는 틀린 부분이 있다. main() 메소드 내에서 int sum = f(2, 4);의 호출은 잘못되었다. main()은 static 타입이므로 f()를 호출하려면 f()도 static 타입이 어야 한다. f() 메소드를 다음과 같이 고쳐야 한다.

static public int f(int a, int b) { return a + b; }

14. 잘못된 것 1) x가 final이므로 x의 값을 수정하는 x++가 허용되지 않는다. 잘못된 것 2) Rect가 final이므로, SpeicialRect에서 상속받을 수 없다. 그러므로 class SpecialRect extends Rect는 틀렸다. 잘못된 것 3) Rect의 f()가 final이므로 오버라이딩이 안 된다. 그러므로 SpecialRect에서 f()를 오버라이딩하면 안 되며 SpecialRect 클래 스에 public void f() {...} 메소드는 작성할 수 없다.

15. new 연산자를 이용하여 시스템으로부터 할당받아 사용하다 더 이상 사용하지 않 는 객체나 배열 메모리를 가비지라 한다. 가비지가 많아지면 상대적으로 자바 가 상 기계에서 응용프로그램에게 할당해줄 수 있는 가용 메모리의 양이 줄어들어 자 바 응용프로그램의 실행에 영향을 줄 수 있으므로 자바 가상 기계는 가용 공간이 일정 크기 이하로 줄어들게 되면 자동으로 가비지를 회수하여 가용 메모리 공간을 늘린다. 이러한 가비지 컬렉션 때문에 개발자는 할당받은 메모리를 반환하는 코딩 부담을 덜게 된다.

16.

디폴트 public protected private

같은 패키지 클래스 ○ ○ ○ ×

다른 패키지 클래스 × ○ × ×

728x90
그리드형

댓글