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

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

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

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

 

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

 

1. ③. int와 같은 기본 타입의 값은 Wrapper 클래스를 이용하여 객체로 만들어 저장 하면 된다.

2.

클래스, 인터페이스, 메소드를 특정 타입에 종속되지 않게 일반화시켜 작성하는 기술을 제네릭이라 한다. Vector<E>에서 E는 제네릭 타입 혹은 타입 매개변수라고 부른다. E에 Integer 등과 같이 객체 타입을 지정하여 특정 타입의 데이터만 다루도록 만드는 작업을 구체화라고 한다. 제네릭 기능은 C++에서 먼저 만들어졌으며 C++에서는 템플릿이라고 부른다.

3. ②. 벡터 v의 초기 크기가 30이다. 30개 이상 저장할 수 있고 벡터는 스스로 저장 공간을 늘린다.

4. (1) Vector<String> sv = new Vector<String>();

(2) HashMap<String, Double> h = new HashMap<String, Double>();

(3) ArrayList<Person> pa = new ArrayList<Person>(10);

(4) HashMap<String, Integer> pop = new HashMap<String, Integer>();

5. ① Stack<String> ss;

다른 문항이 틀린 이유는 다음과 같다.

②에서는 E에 구체적인 타입을 지정하여야 사용할 수 있다.

③에서는 HashMap에서는 두 개의 타입 매개변수가 필요한데 String 타입 하나만 사용하였기 때문이다.

④에서 Set은 인터페이스이므로 new Set<Integer>()와 같이 객체를 생성할 수없다.

6.

v.add(3.14); // 3.14가 new Double(3.14)로 바뀌는 자동 박싱 발생 
double d = v.get(0); // v.get(0)이 v.get(0).doubleValue()로 바뀌는 자동 언박싱 발생

7. 최종적으로 출력되는 벡터의 용량은 12이다. 벡터의 초기 용량은 3이며 루프가 4 번째 돌 때 벡터의 공간이 부족하다. 이때 벡터는 용량을 2배 증가시켜 용량이 6이 된다. 다시 7번째 루프를 돌 때 용량이 12가 되며, 10번 루프를 돌았을 때의 용량은 여전이 12이다. 코드를 아래와 같이 고쳐서 실행해보면 더욱 분명해진다.

Vector<Integer> v = new Vector<Integer>(3); 
for(int i=0; i<10; i++) { 
v.add(i); 
System.out.println(v.capacity()); // 현재 용량 출력 }

8.

ArrayList<String> a = new ArrayList<String>(10); // 초기 용량이 10인 ArrayList 생성 
a.add("Java"); // a의 맨 끝에 "Java" 삽입 
a.add(0, "C++a"); // a의 맨 앞에 "C++" 삽입 
System.out.println(a.size()); // a에 현재 삽입된 개수 출력 
a.remove(a.size()-1); // a의 마지막에 있는 문자열 삭제

9.

Vector<Integer> v = new Vector<Integer>(); 
for(int i=0; i<10; i++) v.add(i); // 10개의 정수 저장

Iterator<Integer> it = v.iterator(); // Iterator 레퍼런스 얻기 
while(it.hasNext()) { // it가 가리키는 객체가 있는 동안 루프 
int n = it.next(); // 하나씩 알아내기 
System.out.print(n + " "); // 출력 
}

10. 이 문제는 HashMap 객체를 메소드의 매개변수로 어떻게 전달받는지를 묻는 문제이 다. func()와 이를 응용하는 코드를 보면 다음과 같다.

import java.util.HashMap; public class Example { 
public static void main(String[] args) { 
HashMap<String, Integer> h = new HashMap<String, Integer>(); 
h.put("a", 10); 
h.put("b", 20);

System.out.println(func(h)); // 해시맵 map에 들어 있는 원소 개수 출력 
} 
public static int func(HashMap<String, Integer> map) { 
return map.size(); } }

11. (1) JGeneric의 타입 매개변수는 1개이며 W이다. (2), (3), (4), (5), (6)은 아래 코드와 같다.

class JGeneric<W> { private W x, y; public JGeneric(W x, W y) { this.x = x; this.y = y; } public W first() { return x; } // (3) 여러 줄로 작성 가능 public W second() { return y; } // (4) 여러 줄로 작성 가능 public boolean equal() { return x.equals(y); } // (5) 여러 줄로 작성 가능 }

public class Example { public static void main(String[] args) { JGeneric<String> js = new JGeneric<String>("hello", "hellu"); // (2) // (6) 활용 예 System.out.println(js.first()); System.out.println(js.second()); System.out.println(js.equal()); } }

hello hellu false

12. (1) JClass의 take() 메소드는 문자열 배열과 인덱스를 받아 인덱스에 있는 문자열 을 리턴하는 메소드이다. (2) take() 메소드를 일반화시키는 제네릭 메소드는 다음과 같이 정의한다. 첫 번 째 매개변수로는 어떤 타입이든지 배열로 받고, 두 번째 매개변수는 항상 int

타입의 인덱스 값을 받아 배열의 원소를 리턴하도록 제네릭 메소드로 작성한 다. JGenClass는 다음과 같다.

class JGenClass { static <T> T take(T s[], int index) { if (index > s.length) { System.out.println("인덱스가 범위를 벗어났습니다."); return null; } return s[index]; } }

(3) JGenClass를 활용하는 코드는 다음과 같다.

class JGenClass { static <T> T take(T s[], int index) { if (index > s.length) { System.out.println("인덱스가 범위를 벗어났습니다."); return null; } return s[index]; } }

public class Example { public static void main(String[] args) { String [] text = { "Java", "C++", "c#" }; System.out.println(JGenClass.take(text, 1)); // 문자열 배열에 대해

Integer [] n = { 0,1,2,3,4,5 }; // int []로 하면 안 된다. System.out.println(JGenClass.take(n, 1)); // 정수 배열에 대해 } }

728x90
그리드형

댓글