그 외 공부

[객체기반SW설계] #Mission 2, JAVA 영어단어 프로그램

ssangeun 2015. 8. 6. 14:52

문제, 영어와 한글 뜻을 저장해 놓고, 영어단어를 입력하면 한글 뜻을, 한글을 입력하면 영어단어를 보여주는 기능과 암기 테스트를 위해 임의의 단어를 뽑아서 제시하는 기능이 있는 프로그램을 작성해보시오.


-code 설명 (설계 진행 순서대로)


package에 따른class


 



1. 영어단어와 한글 뜻을 저장하기 위한 univ.incheon.embedded 패키지의 EngKoreanCard 클래스

#private String 변수 english: 영어단어

#private String 변수 Korean: 한글 뜻

#생성자: 영어단어와 한글 뜻을 인수로 받음

#public String getEngWord(): 영어단어를 반환

#public String getKorWord(): 한글 뜻을 반환


EngKoreanCard 클래스

code 

설명 

 

 영어 단어와 한글 뜻을 저장하기 위한 EngKoreanCard클래스입니다. 생성자 메소드에서는 영어와 한글을 en, ko로 받아서 저장합니다. getEngWord메소드는 해당 객체의 영어 단어를 반환합니다. getKorWord메소드는 해당 객체의 한글 뜻을 반환합니다.



2. EngKoreanCard들의 객체를 저장하기 위한 univ.incheon.embedded 패키지의 MyDictionary 클래스

#private Vector<EngKoreanCard> wordList: 영어단어와 한글 뜻 쌍들의 집합

#public void addCard(EngKoreanCard _card): _card를 인수로 받아 wordList에 추가. 단, 이때 이미 같은 영어단어가 저장되어 있는지를 확인해야 함.

#public EngKoreanCard getCardByEng(String _english): _english를 인수로 받아 wordList에서 해당 EngKoreanCard 객체를 반환. 실패시 null 반환

#public EngKoreanCard getCardByKorean(String _korean): _korean을 인수로 받아 wordList에서 해당 EngKoreanCard 객체를 반환. 실패시 null 반환


MyDictionary 클래스

code 

설명 

 

 MyDictionary 클래스에서는 새로운 카드를 추가하는 addCard메소드와 영어단어를 입력받아 해당 객체를 반환하는 getCardByEng메소드와 한글 뜻을 입력받아 해당 객체를 반환하는 getCardByKorean메소드가 있습니다.

먼저 addCard메소드는 새로운 EngKoreanCard객체를 받아 기존에 있던 단어인지 확인을 하고 추가를 해줍니다. 단어가 있는지 확인하기 위해서 EngKoreanCarditerator를 사용합니다.

getCardByEng메소드는 영어단어를 입력하면 해당 객체를 반환하는데 마찬가지로 EngKoreanCarditerator를 사용합니다. 해당 객체를 찾지 못하면 해당 단어가 없습니다.‘를 출력하고 null값을 반환합니다.

같은 방법으로 getCardByKorean메소드는 한글 뜻을 입력하면 해당 객체를 반환하는데 EngKoreanCarditerator를 사용하여서 검색합니다. 해당 객체를 찾지 못하면 해당 단어가 없습니다.‘를 출력하고 null값을 반환합니다.



3. 1번과 2번에서 구현한 클래스들을 테스트하는 univ.inu.embedded 패키지의 Test 클래스를 작성하시오.


Test 클래스

code

 설명

 

 1번과 2번에서 구현한 클래스는 영어단어와 한글 뜻을 저장하는 EngKoreanCard객체 생성이 가능하고 MyDictionary클래스를 통해서 추가와 영어단어 혹은 한글 뜻을 통하여 검색이 가능합니다.

먼저 같은 단어를 추가해서 테스트하고 영어단어로 한번 한글 뜻으로 한번 찾아보았습니다. 단어를 검색할 때에는 객체를 반환받기 때문에 EngKoreanCard변수로 받아와 null값이 아닐 때 그 객체에 대한 정보를 출력하였습니다


Test 클래스 결과

 

 같은 단어를 추가할 때와 첫 번째는 “sangeun”으로 영어단어를 이용해서 검색하고 두 번째는 당근이로 한글 뜻을 이용해서 검색한 결과입니다.



4. java.util.Random 클래스를 Java API 문서에서 찾아보고 기능을 학습, 테스트 프로그램을 작성하여 nextInt() 함수의 역할에 대해서 학습하시오.


java.util.Random 클래스의 nextInt() 메소드

 

 java.util.Random 클래스에 있는 nextInt 메소드입니다. int n으로 임의의 정수를 입력받아 [0 ~ n-1] 의 범위로 random값을 반환합니다.


java.util.Random 클래스의 nextInt() 메소드 Test

 code&결과

 설명

 

 nextInt 메소드를 사용하기 위해서는 Random 객체를 생성해야 합니다. 생성하고 nextInt(10)으로 범위는 0 ~ 9로 정하고 10번 출력해서 테스트해보았습니다

 10번의 random값들이 나오는데 10을 입력하였기 때문에 모두 0 ~ 9 범위의 정수들이 출력이 됩니다.



5. 스스로 단어 암기테스트를 할 수 있도록 MyDictionary 클래스의 기능을 확장하시오.

#private Random 변수 randomGenerator: 랜덤 숫자 발생기 객체

#public EngKoreanCard getRandomCard(): 임의의 EngKoreanCard 객체를 추출하여 반환


MyDictionary 클래스 (+추가 Random객체 생성, getRandomCard(void) 메소드 추가)

 code

 설명

 

 RandomnextInt메소드를 사용하기 위해서 Random클래스의 객체를 생성합니다.

 

 스스로 단어 암기테스트를 할 수 있도록 기존에 있는 단어들을 random으로 뽑아 해당 객체를 반환하는 getRandomCard메소드입니다. nextInt메소드에 입력하는 정수 인자는 cnt, cnt는 추가를 해줄 때 마다 증가시킨 정수 변수입니다

 

 addCardEngKoreanCard객체를 추가할 때 마다 cnt를 증가시켜 현재의 단어 개수를 확인할 수 있습니다.



6. 5번에서 구현한 기능을 테스트하는 univ.inu.embedded 패키지의 Test2 클래스를 작성하시오.


Test2 클래스

code 

설명 

 

 5번에서 구현한 클래스는 기존의 MyDictionary클래스에서 random으로 정수를 받아와 해당 순서의 객체를 받아와 EngKoreanCard 타입으로 반환해주는 getEngWord메소드를 추가해 확장하였습니다. getEngWord메소드는 random으로 EngKoreanCard객체로 반환하기 때문에 EngKoreanCard변수로 받아와 그 객체에 대한 정보를 출력하였습니다. 저는 이렇게 3번을 테스트해보았습니다.


Test2 클래스 결과

 

 random으로 뽑은 객체에 대한 정보입니다. 3회 테스트하였습니다.



7. MyDictionary 클래스에 기능을 추가하시오.

#public Vector<EngKoreanCard> getRandomCard(int n): 임의로 n개의 EngKoreanCard 객체들을 추출하여 Vector에 넣어 반환하는 메소드. 이때, n개의 객체들은 서로 다르다. 따라서 임의로 추출할 때 중복이 없도록 해야 한다. 실패할 경우 null을 반환. wordList에 저장된 단어가 n개 보다 적을 경우 실패.


MyDictionary 클래스 (+추가 getRandomCard(int n) 메소드 추가)

code 

 설명

 

 기존의 getRandomCard메소드와 달리 직접 함수인자를 입력받아 그 개수만큼의 random으로 뽑은 객체들을 반환하는 메소드입니다. 이때 반환되는 객체들은 중복이 없어야 합니다. 뽑은 객체들을 반환할 때는 그 객체들을 Vector로 묶어서 반환하므로 반환타입은 Vector<EngKoreanCard>이 됩니다. cnt는 현재 단어의 개수이고 이 변수는 객체를 추가해줄 때 마다 증가시킨 정수 변수입니다. 만약 입력받은 정수 ncnt보다 크다면 n개만큼을 random으로 뽑을수 없으므로 저장된 단어 개수보다 입력 값이 더 큽니다.’를 출력해주고 null을 반환합니다. 만약 ncnt보다 작다면 그 만큼의 객체를 random으로 뽑을수 있기 때문에 random.nextInt(n)으로 random정수를 받아오고 받아온 정수의 순서의 EngKoreanCard객체를 Vectoriterator를 이용하여 받아옵니다. 받아온 객체가 현재 random으로 뽑은 객체들이 저장되어있는 Vector에 이미 그 객체가 존재하는지 확인하고 객체가 존재한다면 flag1이 됩니다. flag0이라는 것은 중복없이 random으로 잘 뽑았다는 의미이므로 randomCardVector에 추가해주고 조건은 while(flag!=0)이 됩니다. 이렇게 해서 n개를 뽑아야 하므로 n번 만큼의 for문으로 객체들을 뽑아주고 그 객체들이 저장된 vector(=randomCardVector)를 반환합니다.

 

 addCardEngKoreanCard객체를 추가할 때 마다 cnt를 증가시켜 현재의 단어 개수를 확인할 수 있습니다.



8. 7번에서 구현한 기능을 테스트하는 univ.inu.embedded 패키지의 Test3 클래스를 작성하시오.


Test3 클래스

code 

 설명

 

 7번에서 구현한 클래스는 기존의 MyDictionary클래스에 있는 getEngWord메소드를 직접 함수 인자를 받아와 그 개수만큼의 객체를 반환해주는 부분을 추가하였습니다. getEngWord(int n)메소드는 random으로 EngKoreanCard객체를 n개 만큼 뽑고 그 객체들을 vector에 저장하여 vector를 반환하기 때문에 Vector<EngKoreanCard>변수로 받아와 그 vector에 있는 모든 객체들에 대한 정보를 출력하였습니다. 첫 번째 경우는 현재있는 단어 개수보다 큰 수를 입력할 때이고, 두 번째 경우는 현재있는 단어 개수보다 작은 수를 입력받아 그 수만큼의 객체들을 출력해주는 테스트를 해보았습니다.


Test3 클래스 결과

 

 첫 번째는 7보다 큰 8을 입력하였을 때 이고 두 번째는 7보다는 작은 5를 입력해서 5개의 객체를 random으로 뽑아온 후 출력한 결과입니다.



9. 영어단어 하나에 하나의 한글 뜻만 저장하는 것이 아닌 여러 개의 한글 뜻을 저장할 수 있도록 EngKoreanCard 클래스를 수정하시오.

#변수 korean의 타입을 public Vector<String>로 수정

(위와 같이 수정하면, 3, 6, 8번의 테스트 프로그램들이 정상작동 하지 않을 수도 있다. 문제점을 찾아내고 수정해야함)


EngKoreanCard 클래스 수정 (+수정 Vector를 이용하여 여러 개의 한글 뜻 저장 가능)

 code

 설명

 

private String english;

private String korean;


기존의 EngKoreanCard 클래스를 보면 왼쪽과 같이 하나의 영어단어에 하나의 한글 뜻만 저장이 가능하였습니다. 하나의 한글 뜻만 저장하지 않고 여러 개의 한글 뜻을 저장하기 위해 String변수가 아닌 Vector<String>으로 하나의 영어단어에 여러 개의 한글 뜻을 저장이 가능하도록 수정하였습니다


MyDictionary 클래스의 getCardByKorean 메소드 수정 (+수정 return typeString -> EngKoreanCard로 수정)

 code

 설명

 

 MyDictionary 클래스에서 getCardByKorean메소드는 한글 뜻을 입력받아 해당 객체를 반환해주는 메소드입니다. 전의 경우에는 영어단어 하나에 한글 뜻이 한 개씩 저장이 되어 있어서 비교하는데 어려움이 없었지만 vector로 저장되어있는 한글 뜻을 모두 비교해주어야하기 때문에 Vector<String>iterator를 사용합니다. iterator를 이용하여 hasNexttrue인 동안 next로 이동하며 해당 객체의 모든 한글 뜻을 비교해줍니다. 같은 한글 뜻을 찾으면 해당 객체를 반환해줍니다. 반대로 찾지 못하면 해당 단어가 없습니다.’를 출력해주고 null을 반환해줍니다


Test 클래스 수정

 code

설명 (수정된 부분만 설명) 

 

 먼저 객체를 추가할 때 하나의 영어단어에 하나의 한글 뜻을 저장하지 않고 하나의 영어단어에 여러개의 한글 뜻이 저장가능합니다. getCardByEng 메소드나 getCardByKorean메소드로 EngKoreanCard객체를 반환받을 때 그 객체에 대한 정보를 출력하는 부분에서 한글 뜻은 String 타입이 아닌 Vector<String> 타입이므로 Vector<String>iterator를 이용하여 해당 객체의 한글 뜻을 모두 출력해줍니다.


Test 클래스 결과

 


Test2 클래스 수정

 code

설명 (수정된 부분만 설명) 

 

 먼저 객체를 추가할 때 하나의 영어단어에 하나의 한글 뜻을 저장하지 않고 하나의 영어단어에 여러개의 한글 뜻이 저장가능합니다. getRandomCard메소드로 EngKoreanCard객체들의 정보들을 출력해줄 때 한글 뜻은 String 타입이 아닌 Vector<String> 타입이므로 Vector<String>iterator를 이용하여 해당 객체의 한글 뜻을 모두 출력해줍니다


Test2 클래스 결과

 


Test3 클래스 수정

 code

설명 (수정된 부분만 설명) 

 

  먼저 객체를 추가할 때 하나의 영어단어에 하나의 한글 뜻을 저장하지 않고 하나의 영어단어에 여러개의 한글 뜻이 저장가능합니다. getRandomCard(int n)메소드로 EngKoreanCard객체들의 정보들을 출력해줄 때 한글 뜻은 String 타입이 아닌 Vector<String> 타입이므로 Vector<String>iterator를 이용하여 해당 객체의 한글 뜻을 모두 출력해줍니다.


Test3 클래스 결과

 



10. java.util.HashMap 클래스를 Java API 문서에서 찾아보고 기능을 학습하고, 테스트 프로그램을 작성하여 put(), containsKey(Object key), get(Object key), size() 등의 메소드 동작 학습하시오.


java.util.HashMap 클래스의 put(), containsKey(Object key), get(Object key), size() 메소드

 

 java.util.HashMap 클래스의 put메소드는 keyvalue를 함께 입력 받아 함께 저장이 됩니다

 

 java.util.HashMap 클래스의 containsKey메소드는 key를 입력받아 해당 key가 있는지 확인하는 메소드입니다. 확인이 되면 true, 되지 않으면 false를 반환합니다.

 

 java.util.HashMap 클래스의 get메소드는 key를 입력받아 해당 key에 있는 value를 반환합니다.

 

 java.util.HashMap 클래스의 size메소드 해당 Hashtable객체의 size(key의 개수)를 반환합니다.


java.util.HashMap 클래스의 put(), containsKey(Object key), get(Object key), size() 메소드 Test

code 

 설명

 

 메소드들을 사용하기 위해서 Hashtable객체를 생성합니다. keyvalue의 타입은 <String,String>으로 모두 문자열 타입입니다. put으로 왼쪽과 같이 keyvalue를 짝지어 추가합니다. “LeeSangEun”이라는 key가 존재하는지 확인하기 위해 containsKey메소드를 이용합니다. true가 반환된다면 확인이 되었다는 의미이므로 해당 keyvalue를 반환받는 get메소드를 이용하여 받아온 후 출력해줍니다. 마지막으로 Hashtable객체의 현재 개수를 반환해주는 size메소드를 이용하여 받아온 후 출력해줍니다.



11. 9번에서 완성한 클래스들에서MyDictionary의 영어단어로 찾는 검색기능의 속도개선을 위해 HashMap 클래스를 이용. MyDictionary 클래스의 wordList의 데이터 타입을 다음과 같이 수정한다.

#private HashMap<String, EngKoreanCard> wordList

(위에서 String은 영어단어, EngKoreanCard는 해당 영어단어를 포함한 객체)


HashMAp 클래스를 이용하여 MyDictionary 클래스 확장

 code

 설명 (수정된 부분만 설명)

 

-addCard 메소드 

cntHashtable클래스의 size메소드를 이용하면 되기 때문에 지워도 무관합니다. wordListkey가 영어단어가 되고 value가 영어단어와 여러개의 한글 뜻을 저장하는 EngKoreanCard클래스가 됩니다. 기존에는 EngKoreanCard클래스를 저장하는 Vector를 사용하였지만 11번은 Hashtable클래스를 사용합니다. 추가할때는 put메소드를 사용합니다.


-getCardByEng 메소드

기존에는 iterator를 생성하여 모든 객체들을 비교하며 해당 단어를 찾았지만 Hashtable클래스는 이러한 과정없이 containsKey메소드를 이용하여 반환받을수 있습니다.


-getCardByKorean 메소드

기존에는 iterator를 생성하여 모든 객체들을 비교하며 해당 단어를 찾았지만 Hashtable클래스는 이러한 과정없이 containsKey메소드를 이용하여 반환받을수 있습니다.


-getRandomCard 메소드

getRandomCard메소드 부분에서는 저장된 객체의 개수보다 많은 수를 입력받을 경우 객체를 추가해주는 부분에서 cnt라는 정수 변수도 함께 증가시켜 현재 객체의 개수를 알아야 했지만, Hashtable클래스를 이용하면 현재 객체들의 개수를 반환해주는 size메소드를 이용합니다. 네모난 박스를 보면 values().iterator를 받아오는데 그 이유는 hashtable에는 String(key), value(EngKoreanCard)처럼 value의 타입은 객체입니다. 그 객체들을 가지고 있는 iterator를 따로 변수로 선언을 하고 그 iteratorrandom하게 받은 변수만큼 next를 시켜 그에 해당되는 keygetEngWord메소드로 받고 그 key를 다시 get(key)를 사용하여 해당 객체를 반환하는 EngKoreanCard Vector에 추가합니다. 이렇게 n개의 객체들을 random하게 뽑아 vector에 저장하고 그 vector를 반환해줍니다


Test 클래스 수정

 code

설명 (수정된 부분만 설명) 

 

 Hashtable클래스로 확장하여 수정해도 모든 메소드에서 반환되는 return type은 이전과 동일합니다.


먼저 객체를 추가할 때 하나의 영어단어에 하나의 한글 뜻을 저장하지 않고 하나의 영어단어에 여러개의 한글 뜻이 저장가능합니다. getCardByEng 메소드나 getCardByKorean메소드로 EngKoreanCard객체를 반환받을 때 그 객체에 대한 정보를 출력하는 부분에서 한글 뜻은 String 타입이 아닌 Vector<String> 타입이므로 Vector<String>iterator를 이용하여 해당 객체의 한글 뜻을 모두 출력해줍니다


Test 클래스 결과

 


Test2 클래스 수정

 code

설명 (수정된 부분만 설명) 

 

 Hashtable클래스로 확장하여 수정해도 모든 메소드에서 반환되는 return type은 이전과 동일합니다.

먼저 객체를 추가할 때 하나의 영어단어에 하나의 한글 뜻을 저장하지 않고 하나의 영어단어에 여러개의 한글 뜻이 저장가능합니다. getRandomCard메소드로 EngKoreanCard객체들의 정보들을 출력해줄 때 한글 뜻은 String 타입이 아닌 Vector<String> 타입이므로 Vector<String>iterator를 이용하여 해당 객체의 한글 뜻을 모두 출력해줍니다.


Test2 클래스 결과

 


Test3 클래스 수정

 code

설명 (수정된 부분만 설명) 

 


Hashtable클래스로 확장하여 수정해도 모든 메소드에서 반환되는 return type은 이전과 동일합니다.

먼저 객체를 추가할 때 하나의 영어단어에 하나의 한글 뜻을 저장하지 않고 하나의 영어단어에 여러개의 한글 뜻이 저장가능합니다. getRandomCard(int n)메소드로 EngKoreanCard객체들의 정보들을 출력해줄 때 한글 뜻은 String 타입이 아닌 Vector<String> 타입이므로 Vector<String>iterator를 이용하여 해당 객체의 한글 뜻을 모두 출력해줍니다


Test3 클래스 결과