2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

명품자바 7장 연습문제 1~12

2023. 1. 13. 13:59ㆍ명품 자바 문제

 

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

 

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

▶ 컬렉션은 크기를 지정해도 그 크기를 넘어가면 가변적으로 크기를 늘립니다.

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

 

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

 

▶ 컬렉션은 객체만 삽입되는것은 맞으나 int를 저장하고 싶다면 Wrapper 클래스로 Integer로 작성하면 된다.

 

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

 

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

 

 

 

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

 

 

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

 

 

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

 

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

 

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

▶ Integer라는 객체타입만 저장이 가능하다.

 

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

 

▶위에서 말했다 싶이 제네릭은 타입의 크기를 최대치를 넘으면 가변적으로 값을 늘린다.

 

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

 

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

 

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

 

 

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

 

 

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

 

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

 

 

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

 

 

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

 

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

 

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

 

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

 

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

 

 

 

다음 코드에서 맞는 것은?

 

(1)Stack<String> ss;

 

(2) ArrayList<E> ar = new ArrayList<E>();

 

▶ 제네릭 <E>에 구체적인 타입을 지정해야한다. 그리고 제네릭 타입에는 객체타입만 들어갈 수 있음.

 

(3) HashMap<String> h = new HashMap<String>();

 

▶해시맵은 키와 벨류값 두 개가 들어가야만 하는데 구체적 타입을 스트링밖에 지정하지 않음.

 

(4) Set<Integer> s = new Set<Integer>(100)

 

▶Set은 인터페이스이기 때문에 객체를 생성 할 수 없습니다. 

만약 Set set = new Set()으로 생성하기되면 인터페이스이기 때문에 모든 메서드를 오버라이딩 해줘야 합니다.

인터페이스 Set을 상속받은 hashset이나 treeset으로 사용하는 것이 적절합니다.

 

 

▶ 답 : (1)

 

 

 

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

 

Vector<Double> v = new Vector<Double>();
v.add(3.14); // 자동 박싱
double d = v.get(0); // 자동 언박싱

 

 

다음 프로그램은 초기에 벡터의 크기를 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));

 

▶백터는 capacity 즉 용량이 부족할때는 두 배 씩 늘립니다. 그렇기에

반복문이 3번쨰에서 4번쨰로 넘어갈때 용량이 부족함으로 벡터의 크기를 6으로 늘립니다.

다시 6에서 7로 넘어갈때 용량이 부족하기 때문에 크기를 12로 늘리기 때문에 

답은 12입니다.

 

 

 

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

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

 

 

다음에서 밑줄친 부분과 동일하게 작동하도록 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++)
System.out.print(v.get(i)+" ");

 

public class example_file2 {

    public static void main(String[] args) {
        Vector<Integer> v = new Vector<>();

        for(int i=0;i<10;i++){
            v.add(i); //v의 i의 값을 0~9까지 넣어준다.
        }
        Iterator iterator = v.iterator(); //v 객체를 iterator에 넣어준다.
        

        while (iterator.hasNext()){ //iterator의 값이 있는 동안
            System.out.println(iterator.next()+" "); // 출력
        }

    }
}​


 

 

다음은 해시맵 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에 들어 있는 원소 개수 출력

 

 
class Ex{
    HashMap<String,Integer> h = new HashMap<>(); //해쉬맵을 생성.

    void EX_method(){
        h.put("a",10);
        h.put("b",20);
        System.out.println(func(h));
    }
    int func(HashMap hashmap){ //func 메서드에 반환 값을 int로 지정함.
        return hashmap.size(); // Hashmap은 리턴 값을 int로 주기때문에 매개변수 타입을 Hashmap으로 해도 됨.
    }

}

 

 

 

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

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

 

 

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

- JGeneric의 타입 매개변수는 1개이며 W이다.

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

 

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

 

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

 

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

 

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

 

package 예제파일1번;



import java.util.*;

public class example_file2 {

    public static void main(String[] args) {
        //6 번 답 
    JGeneric<String> jGeneric = new JGeneric<>("hello","안뇽");

    System.out.println("한글로 인사는 :"+jGeneric.first());
    System.out.println("영어로 인사는 :"+jGeneric.second());
    System.out.println("그렇다면 한글과 영어는 같을까요?"+jGeneric.equals());

    }
}

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 equals(){return x.equals(y);} // 5번 답 
}

 

 

 

다음 질문에 답하라.

 

 

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가 매개변수로 들어와서 index가 s의 길이보다 크다면

배열 오류를 출력하고 null을 출력함.

크지 않으면 s[index]를 출력한다.

 

(2) JClass의 take() 메소드가 임의의 타입에 대해 동작하도록 제네릭 메소드로 수정하여 JGenClass를 작성하라.

 

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