본문 바로가기
Java/연습문제

[명품자바] 7장 제네릭과 컬렉션 이론문제

by Meaning_ 2021. 7. 10.
728x90
반응형

1번

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

 

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

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

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

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

 

이유) int와 같은 기본타입을 Wrapper클래스로 만들어 객채로 만들면 된다. 

 

2번

 

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

 

3번

 

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

 

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

 

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

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

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

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

 

이유) 초기 크기가 30이라는 것.벡터는 스스로 저장공간을 늘릴 수 있다.

 

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>();

 

5번

 

다음 코드에서 맞는 것은?

 

1) Stack<String> ss;

2) ArrayList<E> ar=new ArrayList<E>(); --> E가 아니라 구체적 타입의 명시가 필요하다

3) HashMap<String>h=new HashMap<String>(); --> k,v 각각 두개의 타입으로 들어가야 한다.

4) Set<Integer> s=new Set<Integer>(100);  --> set은 인터페이스이므로 객체를 생성할 수 없다. 

 

6번

 

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

 

Vector<Double>v=new Vector<Double>();

v.add(3.14); --> 자동 박싱 v.add(Double.valueOf(3.14))

double d=v.get(0); --> 자동 언박싱 v.get(0).doubleValue();

 

7번

 

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

 

Verctor<Integer> v=new Vector<Integer>(3); //현재 벡터 용량은 3

 

for(int i=0;i<10;i++) //정수를 10개 벡터에 삽입

   v.add(i);

 

System.out.println(v.capacity());  //벡터에 변한 용량은 얼마?

 

반복문의 횟수가 4번이 될때, 초기 벡터용량 3의 2배인 6으로 늘어난다. 반복문의 횟수가 7이될때는 6의 2배인 12가 되므로 변한용량은 12이고, 한번에 기존값의 2배만큼 용량을 늘리는 것을 알 수 있다.

 

8번

 

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

 

ArrayList<String> a= new ArrayList<String>(10); // 초기용량이 10인 ArrayList 생성

a.add("Java");//a의 맨끝에 "Java" 삽입

a.add(0,"C++"); //a의 맨 앞에 "C++" 삽입

System.out.println(a.size());//a에 현재 삽입된 개수 출력

a.remove(a.size()-1);//a의 마지막에 있는 문자열 삭제

 

9번

 

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

 

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

for (int i=0;i<10;i++){

  v.add(i);

}

for(int i=0;i<10;i++){

 System.out.println(v.get(i)+" ");

}

 

답)

Iterator<Integer> it=v.iterator();

while(it.hasNext()){

 int n=it.next();

  System.out.print(n+"  ");

}

 

10번

 

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

 

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

h.put("a",10);

h.put("b",20);

System.out.println(func(h)); //해시맵에 들어있는 원소의 개수 출력 

 

답)

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

 

public static int(HashMap<String,Integer>h){

 return h.size();

}

h.put("a",10);

h.put("b",20);

System.out.println(func(h));

 

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 객체를 생성하는 코드를 작성하라. 

 

--> JGenric <String> j=new JGeneric <String> ("Hi","Hello");

 

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

 

public W first(){

   return x;

}

 

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

 

public W second(){
   return y;

}

 

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

 

public boolean equals(){
  retrun x.equals(y);

}

 

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

 

System.out.println(j.first());

System.out.println(j.second());

System.out.println(j.equals());

 

 

12번

 

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

   return null;

   }

 }

}

 

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

 

문자열 배열과 인덱스를 받아 인덱스에 해당하는 문자열을 리턴

 

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

 

class JGenClass{

 static <T> T take(T s[],int index){

    if(index>s.length){

           System.out.println("인덱스가 범위를 벗어났습니다.");

           return null;

     }

   }

 }

(3)JGenClass 를 활용하는 코드 사례를 보여라.

 

   

728x90
반응형

댓글