프로그래밍 언어/<Java>영어단어장 project

1.java 메모장 읽어오기, 단어 구분하기, 벡터에 저장하기

창조적생각 2021. 7. 26. 18:56

<시작>

java를 통해서 영어단어장을 만들어보는 프로젝트를 진행하고 있습니다.

이전에 배웠던 것들을 토대로 swing의 기능을 이용하여 단어장을 만들어보긴 했는데,

부족한 점도 많고, 스스로도 만족할만한 기능이 없어 조금씩 기능을 추가하여 새로 만들어 보는 연습을 해보려 합니다.

 

<목표>

1. 단어와 뜻을 프로그램 안에서 입력받아 메모장에 저장하고, 메모장에서 그 단어와 뜻을 불러온다.

2. 자신이 저장한 단어와 뜻이 무엇인지 확인 할 수 있어야한다.

3. 공부를 다하고 공부한 단어와 뜻을 객관식 혹은 주관식으로 테스트를 진행한다.

4. 이 것을 그래픽화 하여 구현한다.

 

이러한 목표들 중에 오늘 해 볼 것은 메모장에서 그 단어와 뜻을 불러오는 것입니다.

 

<목차>

1. 메모장의 텍스트 불러오기(InputStreamReader FileInputStream)

 

2. 영어와 한글을 구분하고 영어 뜻에 맞게 한글 배치하는 사용자지정함수 addvector() 작성하기

      2-1 String[] 배열이름 = 배열이름.split("구분자")

 

      2-2 클래스를 매개변수로한 벡터 작성

 

 

<전체 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.util.*;
import java.io.*;
class Word{
    private String english; 
    private String korean; 
    public Word(String english, String korean) {
        this.english = english;
        this.korean = korean;
    }
    public String getEnglish() { return english; }
    public String getKorean() { return korean; }
}
public class question_box {
    question_box(){
        Question_R();
        addvector();
    }
    Scanner sc = new Scanner(System.in);
    
    Vector<Word> v = new Vector<Word>();
    Vector<String> V_eng = new Vector<String>();
    Vector<String> V_kor = new Vector<String>();
    
    String meta ="";
 
    
    void Question_R() {
        InputStreamReader in = null;
        FileInputStream fin = null;
        try {
            fin = new FileInputStream("c:\\Temp\\test.txt");
            in = new InputStreamReader(fin,"UTF-8");
            int c;
            
            while((c = in.read()) != -1) {
                meta += (char)c;
            }
            System.out.println();
            System.out.println(meta);
            fin.close();
            in.close();
        }
        catch(IOException e) {
            System.out.println("입출력오류");
        }
    }
    void addvector() {
        String [] tokens = meta.split("/");
        for(int i =0; i<tokens.length;i++) {
            if(i%2 == 0)
                V_eng.add(tokens[i]);
            else V_kor.add(tokens[i]);
                
        }
        for(int i =0; i < V_kor.size();i++) {
            String Kor = V_kor.get(i);
            String Eng = V_eng.get(i);
            v.add(new Word(Eng,Kor));
            String M = v.get(i).getEnglish();
            String N =v.get(i).getKorean();
            System.out.print("("+M+","+N+")");
            
            
        }
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new question_box();
        
    }
 
}
 
cs

 

[해설]

1. 메모장에 있는 내용 불러오기(InputStreamReader FileInputStream 사용하기)

 

 (1) 일단 c에 Temp 폴더에 test.txt라는 텍스트파일을 하나 만들어 둡니다.

     텍스트 파일 안에 영어단어와 뜻을 순서대로 씁니다.

 

fair/공평한;상당한;박람회/attempt/노력;시도(하다)/merely/한낱.단지,그저/diversify/다양화하다;다양해지다/revolve/돌다,회전하다/evolve/진화시키다;발달하다/accuse/고발하다,비난하다/include/포함하다,넣다,포함시키다/exclude/제외하다;차단하다/approach/접근하다,다가오다/nevertheless/그럼에도불구하고/reliable/믿을수있는,확실한/promote/승진시키다.승진하다/adjust/적응하다/pridict/예언하다/install/설치하다/alternative/대안,선택가능한것

 

 

 - 영어와 한글 뜻을 번갈아가면서 썼습니다.

 - 각 단어들 사이에 "/" 를 넣어줬는데 이것은 String클래스에 split 메소드를 사용해 단어들을 하나씩 구분해주기 위해서입니다.

 

 

 (2) 메모장에 있는 모든 단어들을 불러들일 사용자지정함수 Question_R()을 작성합니다.(InputStreamReader FileInputStream 사용하기)

이해를 돕기 위해 스크린샷으로 잘라왔습니다. 위쪽에 전체 코드를 참고해 보셔도 좋습니다.

[실행결과]

한글은 영어와 달리 한글자당 2byte임으로 불러 오려면 InputStreamReader FileInputStream 를 사용해줘야 합니다.

FileInputStream으로 가져올 파일의 주소를 지정해줍니다.

InputStreamReader로 fin에서 가져온 것을 인코딩할 방식을 정하여 출력해 옵니다.

*한글을 깨지지 않고 가지고 오려면 반드시 UTF-8 의 인코딩 방식으로 해야 합니다.

그리고 아스키코드로 불러오기에 정수형 변수 c를 정의하고 c가 -1이 아닌, 즉 아스키코드가 있는 것이라면 meta라는 String 변수에 저장해주는 작업을 해줍니다.

그렇게 하면 meta는 실행결과와 같이 메모장에 있는 정보들을 그대로 저장하게 됩니다.

 

 

 2. 영어와 한글을 구분하고 영어 뜻에 맞게 한글 배치하는 사용자지정함수 addvector() 작성하기 (String[] 배열이름 = 배열이름.split("구분자"), class를 매개로 한 Vector)

 

  (1) 영어와 한글을 구분해주기(split())

   앞서 메모장에 영어단어와 뜻을 입력할때 단어들이 끝날때마다 "/"를 적어줬던 이유가 여기 있습니다.

바로 String 클래스의 split 메서드를 이용해 주기 위해서입니다.

 

String [] tokens = meta.split("/");

 

meta에 저장되어 있었던 영어단어와 뜻을 String 으로 구성된 배열 tokens에 단어 별로 저장하기 위해 "/"를 구분자로 이용하여 단어를 구별해서 tokens에 저장하라 입니다.

그렇게 해서 tokens 는 {영어, 한글, 영어, 한글......}의 형태로 저장됩니다.

요런 식으로 말이죠.

배열은 0번째부터 시작합니다.

그렇다는 것은 tokens[0], tokens[2],tokens[4].... 등등의 tokens의 짝수번째는 영어이고,

tokens[1],tokens[3],tokens[5] 등의 tokens 홀수번째는 한글이라는 말이 됩니다.

그렇기 때문에 홀짝을 구분해주기 위해 if(i%2 == 0)을 써줍니다.

if(i%2 == 0)

                V_eng.add(tokens[i]);

            else V_kor.add(tokens[i]);

참이라면 영어를 모아둔 벡터인 V_eng에 모이게 해주고, 거짓이라면 한글 벡터인 V_kor에 모이게 했습니다.

 

아래에서 프린트해서 맞는가 보겠습니다.

V_eng의 경우

V_kor의 경우

둘 다 잘 나오는 것을 확인할 수가 있습니다.

 

 

   (2) 영어와 한글의 뜻이 짝이 맞게 벡터 값에 저장하기(class를 매개로 한 Vector)

     이 두개의 값이 짝을 이룬 벡터를 만들기 위해서 우리는 클래스를 매개로 하는 벡터를 만들어야 합니다.

     그래서 영어와 한글의 값을 가진 각각의 클래스를 벡터 안에 저장하고 그 클래스를 불러와 클래스가 저장하고 있는

     영어값과 한글값을 불러 오는 것입니다.       그러기 위해서 우리는 word 클래스를 따로 만듭니다.

그래서 이 클래스는 (String english, String korean)을 매개로 받으며,  String english, String korean 를 저장하며, 

getEnglish() getKorean() 함수를 통해 그 값을 불러 올 수 있는 클래스입니다.

앞서 V.eng과 V.kor 안의 내용을 가져와서 word 클래스의 벡터인 v에 추가해주면됩니다.

검증해보면

이렇게 (영어,한글뜻) 으로 짝을 맞춰서 저장이 되어있는 것을 볼 수 있습니다.

 

오늘은 메모장에 있는 텍스트를 읽어오고, 그 텍스트를 구분하여 벡터에 저장하고 다시 짝을 이뤄서 벡터에 저장하는 것을 알아보았습니다.

다음시간에는 프로그램 안에서 텍스트 파일에 저장하는 방법에 대해서 알아보도록 하겠습니다.

긴글 읽어봐주셔서 감사합니다.

여러분의 커리어, 학습, 인생에 늘 좋은 일만 있기를 기원합니다.

 

 

[처음으로 돌아가기]

728x90