-> 블로그 이전

[명품 Java] 7장 연습문제 (제네릭과 컬렉션)

2021. 12. 13. 16:40Solution`/Java

[7장 1번]

컬렉션에 관한 설명으로 틀린 것은?

1. 가변 크기라서 배열보다 사용하기 편리하다.

2. 삽입 삭제 시 원소의 위치를 컬렉션이 자동 조절하므로 편하다.

3. 객체들만 삽입되므로 int와 같은 기본 타입의 값을 저장하는 방법이 없어 아쉽다.

4. 컬렉션은 모두 제네릭(generics)으로 만들어져 있다.

 

- 3번, int와 같은 기본 타입의 값은 Wrapper 클래스를 이용해서 객체로 만들어서 저장하면 된다

 

 

[7장 2번]

다음 빈칸에 적절한 단어를 기입하라.

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

<보기>
추상화, 템플릿, 일반화, 구체화, 제네릭, 컬렉션, 상속, 제네릭 객체, 타입 매개변수, 다형성, 상수

- 일반화, 제네릭, 타입 매개변수, 구체화, 템플릿

 

 

[7장 3번]

다음 코드에 대한 설명으로 틀린 것은?

Vector<Integer> v = new Vector<Integer>(30);

1. Integer 타입 객체만 저장할 수 있는 구체화된 벡터를 생성하는 코드이다.

2. 벡터 v는 원소를 30개만 저장할 수 있는 벡터이다.

3. v.add(10)를 호출하여 정수 10을 벡터에 삽입할 수 있다.

4. 벡터 v에는 실수 값을 삽입할 수 없다.

 

- 초기 크기가 30이고, 벡터는 자동으로 용량을 조절한다

 

 

[7장 4번]

다음 물음에 적합한 코드를 간단히 작성하라.

(1) 문자열만 저장할 수 있는 벡터 sv 생성

Vector<String> sv = new Vector<String>();

 

(2) '키'가 문자열이고 '값'이 실수인 해시맵 h 생성

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

 

(3) Person 타입의 객체를 10개 저장할 공간을 갖춘 ArrayList 컬렉션 pa 생성

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

 

(4) 나라 이름과 인구를 저장하고 관리하는 해시맵 pop 생성

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

 

 

[7장 5번]

다음 코드에서 맞는 것은?

1. Stack<String> ss;
2. ArrayList<E> ar = new ArrayList<E>(); 
3. HashMap<String> h = new HashMap<String>();
4. Set<Integer> s = new Set<Integer>(100);

- 1번 (O)

- 2번 (X) → E에 구체적인 타입을 지정해야 한다

- 3번 (X) → HashMap은 타입 매개변수가 2개 필요하다

- 4번 (X) → Set은 인터페이스이기 때문에 객체를 생성할 수 없다

 

 

[7장 6번]

다음 코드에서 자동 박싱과 자동 언박싱이 일어나는 곳을 지적하라.

Vector<Double> v = new Vector<Double>();
v.add(3.14);
double d = v.get(0);

- 자동 박싱 : v.add(3.14) → v.add(Double.valueOf(3,14))로 자동 박싱된다

- 자동 언박싱 : v.get(0) → Double obj = v.get(0);, double d = obj.doubleValue();로 자동 언박싱된다

 

 

[7장 7번]

다음 프로그램은 초기에 벡터의 크기를 3으로 설정하였다. for 문을 실행하고 벗어났을 때 벡터의 용량이 어떻게 변했는지 확인하라. 벡터는 용량이 모자랄 때, 한 번에 얼마만큼씩 용량을 늘리는가?

Vector<Integer> v = new Vector<Integer>(3); //현재 벡터 용량은 3
for(int i=0; i<10; i++) v.add(i); // 정수를 10개 벡터에 삽입
System.out.println(v.capacity)); // 벡터에 변한 용량은 얼마?

- 초기용량만 설정한 상태이면 용량이 모자르면 2배 씩 증가된다

- 3를 add할때 벡터 용량 → 6 / 6을 add할때 벡터 용량 → 12

- 따라서 12가 된다

 

 

[7장 8번]

주석문을 참고하여 빈칸에 적절한 코드로 채워라.

ArrayList<String> a = ______________________; // 초기 용량이 10인 ArrayList 생성
______________________ // a의 맨 끝에 "Java" 삽입
______________________ // a의 맨 앞에 "C++" 삽입
______________________ // a에 현재 삽입된 개수 출력
______________________ // a의 마지막에 있는 문자열 삭제

≫ 풀이

ArrayList<String> a = new ArrayList<String>(10);
a.add("Java");
a.add(0, "C++");
a.size();
a.remove(a.size()-1);

 

 

[7장 9번]

다음에서 밑줄친 부분과 동일하게 작동하도록 Iterator를 이용하여 다시 작성하라.

Vector<Integer> v = new Vector<Integer>(3); 
for(int i=0; i<10; i++) v.add(i);			
for(int i=0; i<v.size(); i++) // 전체 밑줄1
	System.out.print(v.get(i)+" "); // 전체 밑줄2

≫ 풀이

Vector<Integer> v = new Vector<Integer>(3); 
for(int i=0; i<10; i++) v.add(i);	

Iterator<Integer> it = v.iterator();
while(it.hasNext())
    System.out.print(it.next() + " ");

 

 

[7장 10번]

다음은 해시맵 h를 만들고, func(h) 메소드를 호출하여 h에 들어 있는 원소의 개수를 리턴받아 출력하는 코드이다. func() 메소드를 작성하라.

HashMap<String, Integer> h = new HashMap<String, Integer>();
h.put("a", 10);
h.put("b", 10);
System.out.println(func(h)); // 해시맵 h에 들어 있는 원소 개수 출력

≫ 풀이

public static int func(HashMap<String, Integer> h){
        return h.size();
    }
    public static void main(String[] args) {
        HashMap<String, Integer> h = new HashMap<String, Integer>();
        h.put("a", 10);
        h.put("b", 10);
        System.out.println(func(h));
    }

 

 

[7장 11번]

다음 제네릭 클래스에 대해 아래 문항에 답하라.

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

(1) JGeneric의 타입 매개변수는 몇 개이며, 무엇인가?

- 1개, W

 

(2) String으로 구체화한 JGeneric 객체를 생성하는 코드를 작성하라.

JGeneric<String> jg = new JGeneric<String>("Hello", "Java");

 

(3) 첫 번째 값 x를 리턴하는 메소드 first()를 작성하라.

public W first(){
        return x;
    }	// (3) 여러 줄로 작성 가능

 

(4) 두 번째 값 y를 리턴하는 메소드 second()를 작성하라.

public W second(){
        return y;
    }    // (4) 여러 줄로 작성 가능

 

(5) equal() 메소드를 작성하라. equal()는 필드 x와 y를 비교하여 같으면 true, 아니면 false를 리턴한다.

public boolean equal(){
        return first().equals(second());
    }    // (5) 여러 줄로 작성 가능

 

(6) <W>를 String으로 구체화한 JGeneric 객체를 활용하는 예를 들어라.

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 first().equals(second());
    }    // (5) 여러 줄로 작성 가능
}

public class test {
    public static void main(String[] args) {
        JGeneric<String> jg = new JGeneric<String>("Hello", "Helli");
        System.out.println(jg.first());
        System.out.println(jg.second());
        System.out.println(jg.equal());
    }
}
---------------------
Hello
Helli
false

 

 

[7장 12번]

다음 질문에 답하라.

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

(1) JClass의 take() 메소드는 무엇을 처리하는 코드인가?

- s[index] 를 return 하는 코드

 

(2) JClass의 take() 메소드가 임의의 타입에 대해 동작하도록 제네릭 메소드로 수정하여 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 test {
    public static void main(String[] args){
        JGenClass jgc = new JGenClass();
        Integer[] s = new Integer[5];
        String[] str = {"Java","Python", "C"};
        for(int i=0; i<5; i++){
            s[i] = Integer.valueOf(i);
        }
        System.out.println(jgc.take(s, 6) + "\n");
        System.out.println(jgc.take(s, 3) + "\n");
        System.out.println(jgc.take(str, 6) + "\n");
        System.out.println(jgc.take(str, 0) + "\n");
    }
}
-----------------------------
인덱스가 범위를 벗어났습니다.
null

3

인덱스가 범위를 벗어났습니다.
null

Java