명품 자바 프로그래밍 7장 open challenge - myeongpum jaba peulogeulaeming 7jang open challenge

- 3. 객체들만 삽입되므로 int와 같은 기본 타입의 값을 저장하는 방법이 없어 아쉽다. _ 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에는 실수 값을 삽입할 수 없다.


- 2. 벡터 v는 원소를 30개만 저장할 수 있는 벡터이다. _ 초기 크기가 30이고 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>();  // E에 구체적인 타입을 지정해야 한다.

3. HashMap<String> h = new HashMap<String>();  // HashMap은 두 개의 타입 매개변수가 필요하다.

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


- 1. Stack<String> ss; 


[7장 6번]


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

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

v.add(3.14); // 자동 박싱

double d = v.get(0); // 자동 언박싱


[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)); // 벡터에 변한 용량은 얼마?



- 12 _ 벡터의 초기 용량 : 3 반복문이 4번째 돌 때 벡터의 공간이 부족하다. 이때 벡터는 용량을 2배 증가시켜 용량이 6이 된다. 다시 반복문이 7번째 돌 때 용량이 2배 늘어나 12가 되며, 10번 반복문을 돌았을때 용량은 12이다.

영어 단어 뜻 맞추기 게임을 만들어 보자. 영어 단어와 한글 단어로 구성되는 Word 클래스를 작성하고, 프로그램 내에서 미리 여러 개의 Word 객체를 Vector<Word> 컬렉선에 삽입해둔다. 그리고 다음 결과와 같이 랜덤하게 사용자에게 문제를 던진다. 벡터 내에 정답이 아닌 단어를 랜덤하게 3개 선택하고 정답과 함께 4개의 보기를 출력한다.

import java.util.*; import java.util.Scanner; class Word { private String eng; //영어 단어 private String kor; //한글 단어 public Word(String eng, String kor) { this.eng = eng; this.kor = kor; } public String getEng() { return eng; } public String getKor() { return kor; } } class Ex { int ex[] = {-1, -1, -1, -1}; // 4개의 보기 배열을 -1로 초기화 해 둠. public Ex(int num, int size) { int answerNum = (int)(Math.random()*4); // 1~4중 정답의 번호 ex[answerNum] = num; // 정답의 인덱스 번호 for(int i=0; i<4; i++) { int n = (int)(Math.random()*size); if(ex[i]==-1) { ex[i] = n; } else continue; for(int j=0; j<4; j++) { if(i!=j && ex[j]==ex[i]) { ex[i] = -1; i--; } else continue; } } } } public class WordQuiz { Scanner sc = new Scanner(System.in); Vector v = new Vector(); private String name; public WordQuiz(String name) { // 단어 테스트 이름과 단어 삽입. this.name = name; v.add(new Word("love", "사랑")); v.add(new Word("animal", "동물")); v.add(new Word("picture", "그림")); v.add(new Word("emotion", "감정")); v.add(new Word("baby", "아기")); v.add(new Word("error", "오류")); v.add(new Word("society", "사회")); v.add(new Word("doll", "인형")); v.add(new Word("bear", "곰")); v.add(new Word("example", "보기")); v.add(new Word("deal", "거래")); v.add(new Word("photo", "사진")); v.add(new Word("human", "인간")); v.add(new Word("statue", "조각상")); v.add(new Word("eye", "눈")); v.add(new Word("hand", "손")); v.add(new Word("ant", "개미")); } public void Run() { System.out.println("\"" + name + "\"" + "의 단어 태스트를 시작합니다. -1을 입력하면 종료합니다."); System.out.println("현재 " + v.size() + "의 단어가 들어있습니다."); Quiz(); } public void Quiz() { while(true) { int num = (int)(Math.random()*v.size()); // 랜덤으로 뽑은 정답의 인덱스 번호 String e = v.get(num).getEng(); // 랜덤으로 뽑은 영단어 System.out.println(e + "?"); Ex example = new Ex(num, v.size()); for(int i=0; i<4; i++) { System.out.print("(" + (i+1) + ")" + v.get(example.ex[i]).getKor() + " :"); } int sel = sc.nextInt(); // 사용자가 고른 번호 if(sel == -1) { // -1 입력 시 종료 System.out.println("\"" + name + "\"" + "을 종료합니다"); return; } else if(example.ex[(sel-1)] == num) System.out.println("Excellent !!"); else System.out.println("No. !!"); } } public static void main(String[] args) { WordQuiz wq = new WordQuiz("명품영어"); wq.Run(); } }