본문 바로가기

Learning/JAVA

해쉬맵, Vector, Set, 자바의 예외처리(try-catch, finally), Thread (run-start), 자바의 입출력(InputStream-read, OutputStream-write)

  • 해쉬맵에 간단한 영어사전을 만들기. 사용자로부터 영어단어를 입력받고 한글 단어 검색. exit 입력받으면 종료. (HashMapDic)
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
package utilTest;
import java.util.HashMap;
import java.util.Scanner;
public class HashMapDic {
    public static void main(String[] args) {
        
        HashMap<StringString>dic=new HashMap<StringString>();
        dic.put("baby""아기");
        dic.put("love""사랑");
        dic.put("apple""사과");
        //사용자로부터 영어 단어를 입력받고 한글 단어 검색.
        //"exit" 입력받으면 종료.
    
        while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println("영어단어 입력>> 종료 exit");
            String word=sc.nextLine();
            if(word.toLowerCase().equals("exit")) {
                System.out.println("종료합니다.");
                break;
            }
            String kor=dic.get(word); //get을 하면 value값이 리턴되니까 그 값이 있다고 미리 가정하는 것
            if(kor==null) {
                System.out.println(word+"는 없는 단어");
            }else {
                System.out.println(kor);
            }
        }System.out.println(dic);
    }
}
cs

 


  • 해쉬맵에는 자료형 뿐만 아니라 객체가 올 수 있다. 아이디를 입력했을때 학생 정보 출력하기 (HashMapStudent)
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
package utilTest;
import java.util.HashMap;
class Student{
    private String id;
    private String tel;
    private String name;
    
    public Student(String id, String tel, String name) {
        this.id = id;
        this.tel = tel;
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public String getTel() {
        return tel;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", tel=" + tel + ", name=" + name + "]";
    }
}
public class HashMapStudent {
    
    public static void main(String[] args) {
        //id를 물어보면 학생이 있는지 알려줘야하니까 value값에는 클래스 Student가 들어감
        HashMap<String, Student>map=new HashMap<String, Student>();
        map.put("홍",new Student("1""010-1111-1111","홍길동"));
        map.put("이",new Student("2""010-2222-2222","이순신"));
        map.put("강",new Student("3""010-3333-3333","강감찬"));
        
        //키 값에 "홍"이 있을때의 value 값은?
        Student sid =map.get("홍");
        
        //System.out.println(sid.name)하면 오류남. name을 private이라 했으니.
        //따라서 name을 돌려주는 getter 메소드 가 필요함
        System.out.println(sid.getName());
        System.out.println(sid); //객체니까 주소값이 나올 수 밖에 없음.
        //주소 값이 안나오도록 toString()을 사용하여 오버라이딩 해야함.
        System.out.println(sid);
    
        System.out.println(sid.getTel());
    }
}
cs

 


  • Vector-동기화가 구현. iterator-메소드를 이용하여 객체 이동시킬 수 있다. hasNext()-그 다음에 이동할 공간이 있는지 물어보고 false라면 자동종료 (VectorTest)
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
package utilTest;
 
import java.util.Iterator;
import java.util.Vector;
 
public class VectorTest {
 
    public static void main(String[] args) {
        //Vector에는 동기화가 구현.
        Vector<Integer> v=new Vector<Integer>();
        v.add(5);
        v.add(new Integer(5)); //정확한 표현은 이렇게 클래스화를 하기..
        //Vector나 Arraylist는 중복이 됨. 순서에 중점.
        v.add(-1);
        v.add(2,100); //2는 위치값. 위치값을 안넣게 되면 맨끝에 붙음.
        for(Integer i:v) {
            System.out.print(i+"\t");
        }
        System.out.println();
        
        //iterator라는 메소드를 이용하여 객체를 이동시킬 수 있다. (for문 같은 것)
        //hasNext()는 그 다음에 이동할 공간이 있는지 물어봄. 나중에 false가 되면 자동으로 빠져나옴.
        Iterator<Integer> it=v.iterator();
        while(it.hasNext()) {
            System.out.print(it.next()+"\t");
        }
        System.out.println();
        
    }
}
cs

 


  • Set-중복을 허용하지 않는 자료구조. 나라를 보여주면 수도를 맞추는 어플. 해쉬맵의 key에 나라, value에 수도 값을 준다. 어플의 메뉴를 보여주고 사용자가 나라와 수도를 추가할 수 있으며, 나라를 알려주면 해당하는 수도를 맞추는 퀴즈를 풀 수 있다.  (CapitalApp)
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
75
76
77
78
79
80
81
82
83
84
package utilTest;
//나라를 보여주면 수도를 맞추는 어플
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
public class CapitalApp {
    static Scanner sc=new Scanner(System.in);
    private HashMap<StringString>map=new HashMap<StringString>();
    public CapitalApp() {
        map.put("한국""서울");
        map.put("일본""동경");
        map.put("중국""베이찡");
        map.put("미국""워싱턴");
        map.put("영국""런던");
        map.put("프랑스""파리");
        map.put("독일""베를린");
    }
    
    static void showMenu() {
        System.out.println("***수도 맞추기 게임을 시작합니다.***");
        System.out.println("입력: 1, 퀴즈: 2, 종료: 3>>");
    }
    
    public void input() {
        System.out.println("현재 "+map.size()+" 개 나라와 수도 입력");
        while(true) {
            System.out.println("나라와 수도 입력(종료는 x)>>");
            String cont=sc.next(); //나라
            if(cont.toUpperCase().equals("X")) break;
            //맵에 입력한 나라가 있는지 확인
            if(map.containsKey(cont)==true) {
                System.out.println("이미 입력한 나라입니다.");
                continue//다시 반복문을 수행해라
            }
            String cap=sc.next(); //수도
            map.put(cont,cap);
        }
    }
    
    public void test() {
        //나라를 알려주면 해당하는 수도를 맞추는 퀴즈.
        //나라를 랜덤하게 알려줘야함. 맵의 특성은 랜덤하게 값을 저장한다는 것.
        //맵은 위치값으로 접근할 수 없다. 해쉬맵을 배열에 담아줘야 순서를 정할 수 있다.
        //컴퓨터가 랜덤하게 나라를 알려주면 그에 대한 수도를 입력. 그에 대한 정답, 오답 판단.
        //중복을 허용하지 않는 자료구조를 set이라 함
        Set<String> set = map.keySet();
        //배열로 변환
        Object[]arr=set.toArray(); //set을 배열 형태로 변환(순서를 알기위해)
        while(true) {
            int n=(int)(Math.random()*map.size());
            String city=(String)arr[n]; //나라 이름
            String dosi=map.get(city); //도시
            //문제출제
            System.out.println(city+" 의 수도는? 종료는 x>>");
            String dap=sc.next();
            if(dap.toLowerCase().equals("x")) {
                System.out.println("종료합니다.");
                break;
            }
            if(dap.equals(dosi)) {
                System.out.println("정답입니다.");
            }
            else {
                System.out.println("틀렸습니다.");
            }
        }
    }
        
    public static void main(String[] args) {
        CapitalApp ca=new CapitalApp();
        while(true) {
            //클래스 이름을 앞에 붙였단 것은 static으로 만들었다는 것.
            CapitalApp.showMenu();
            int choice=sc.nextInt();
            switch(choice) {
            case 1 : ca.input(); break;
            case 2 : ca.test(); break;
            case 3 : System.out.println("종료");
                     System.exit(0);
            default : System.out.println("입력오류");
            }
        }
    }
}
cs

 


  • 자바의 예외처리, try-catch문, finally. (ExceptionTest)
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
package exception;
//오류: 컴파일 오류, 실행 오류
//예외: 프로그램이 감지할 수 있는 오류
public class ExceptionTest01 {
    public static void main(String[] args) {
        int[]arr=new int[5];
        String str="";
        //오류가 날 법한 코드를 try안에 넣고
        //catch안에 어떤 오류인지 구분해서 변수와 함께 기재
        //보통 넓은 범위를 밑에 쓴다.
        try {
            System.out.println(str.length());
            for(int i=0;i<5;i++) {
                arr[i]=i;
                System.out.println(arr[i]);
            }
        }catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("예외발생");
        }catch (NullPointerException n) {
            System.out.println("null 값");
        }finally {
            //try가 수행되든 catch가 수행되든 반드시 수행되어야 하는 문장은 finally안에.
            System.out.println("반드시 수행되는 문장");
        }
        
    }
}
cs

 


  • Thread. 어떠한 영역을 누구나 접근할 수 있도록 비동기적으로 처리하는 것. 예를 들어 채팅에서 말하는 기능은 사용자가 동시에 할 수 있어야 한다. 사람이라는 클래스에서 speak란 함수가 있을때 20개의 사람 객체가 speak라는 메소드를 같이 쓰는 셈. 이게 Thread(가장 작은 실행 단위). start()라는 메소드 이름을 붙이면 run()으로 가서 자바 가상 머신(JVM)이 준비되어 있는 스레드를 실행시켜준다. (GuguThread, SaramTalk, SaramThread, SaramRunnable, GuguRunnable)

 

  • Thread를 이용하여 구구단 출력하기 (GuguThread)
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
package threadTest;
public class GuguThread extends Thread{
    //Thread는 jvm이 실행. start라고 메소드 이름을 붙이면
    //jvm이 알아서 run()을 실행.
    private int dan;
    
    public GuguThread(int dan) {
        this.dan=dan;
    }
    
    public void run() {
        int gugudan;
        System.out.println(dan+"단");
        for(int i=1;i<10;i++) {
            gugudan=dan*i;
            System.out.println(dan+"*"+i+": "+gugudan);
        }
    }
    
    public static void main(String[] args) {
        GuguThread g1=new GuguThread(5);
        g1.start();
        GuguThread g2=new GuguThread(7);
        g2.start();
        GuguThread g3=new GuguThread(3);
        g3.start();
    }
}

 


  • 일반적인 for문을 돌린 메소드 형태-차례대로 5번씩 값이 출력 (SaramTalk)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package threadTest;
public class SaramTalk {
    private String name;
    
    public SaramTalk(String name) {
        this.name=name;
    }
    
    public void speak() {
        for(int i=0;i<5;i++) {
            System.out.println(name+" 이 말한다.");
        }
    }
    
    public static void main(String[] args) {
        SaramTalk s1=new SaramTalk("홍길동");
        SaramTalk s2=new SaramTalk("이순신");
        SaramTalk s3=new SaramTalk("강감찬");
        s1.speak();
        s2.speak();
        s3.speak();
    }
}

 

  • Thread형식으로 for문 출력-순서에 상관없이 5번씩 값이 출력 (SaramThread)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package threadTest;
public class SaramThread extends Thread {
    private String name;
    public SaramThread(String name) {
        this.name=name;
    }
    
    public void run() {
        for(int i=0;i<5;i++) {
            System.out.println(name+" 이 말한다.");
        }
    }
    
    public static void main(String[] args) {
        SaramThread s1=new SaramThread("홍길동");
        SaramThread s2=new SaramThread("이순신");
        SaramThread s3=new SaramThread("강감찬");
        s1.start();
        s2.start();
        s3.start();
    }
}

  • 자바에서 다중상속을 받기 위한 Runnable 인터페이스 상속. Thread와 함께 쓰이며 예외처리 가능. Thread 속도를 늦춰서 출력하기. (SaramRunnable)
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
package threadTest;
//자바에서 상속은 단일만 가능. Thread 이외에도 따로 상속받을 게 또 있다면?
//runnable이라는 인터페이스를 implements로 상속받으면 됨.
//인터페이스는 추상으로만 이루어져있기 때문에 반드시 추상메소드를 구현해야한다.
public class SaramRunnable implements Runnable{
    private String name;
    
    public SaramRunnable(String name) {
        this.name=name;
    }
    public static void main(String[] args) {
        SaramRunnable sr1=new SaramRunnable("홍길동");
        SaramRunnable sr2=new SaramRunnable("이순신");
        SaramRunnable sr3=new SaramRunnable("강감찬");
        Thread th1=new Thread(sr1);
        Thread th2=new Thread(sr2);
        Thread th3=new Thread(sr3);
        //Thread가 start를 부르기
        th1.start();
        th2.start();
        th3.start();
    }
    
    public void run() {
        for(int i=0;i<5;i++) {
            System.out.println(name+" 이 말한다.");
            try{
                Thread.sleep(1000); //1000ms->1초 동안 쉬어달라는 표시.
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
}
  • Runnable형식으로 구구단 출력하기 (GuguRunnable)
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
package threadTest;
public class GuguRunnable implements Runnable {
    private int dan;
    public GuguRunnable(int dan) {
        this.dan=dan;
    }
    
    public static void main(String[] args) {
        GuguRunnable g1=new GuguRunnable(5);
        Thread th1=new Thread(g1);
        th1.start();
        GuguRunnable g2=new GuguRunnable(7);
        Thread th2=new Thread(g2);
        th2.start();
        GuguRunnable g3=new GuguRunnable(3);
        Thread th3=new Thread(g3);
        th3.start();
    }
    @Override
    public void run() {
        int gugudan;
        System.out.println(dan+"단");
        for(int i=1;i<10;i++) {
            gugudan=dan*i;
            System.out.println(dan+"*"+i+": "+gugudan);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 


  • 자바 API중 read. InputStream과 관련된 메소드. 값을 읽어들인다는 뜻. 입출력에 관계된 메소드들은 반드시 예외처리를 해줘야함. 입력받은 값을 텍스트 파일로 내보내고, 파일에서 값을 읽어서 출력하기. (InputTest, InputTest01, InputStreamTest, FileInputStreamTest)
  • read를 이용하여 정수형 변수 i에 값을 입력하기. 예외처리 해주기 (InputTest)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package ioTest;
import java.io.IOException;
public class InputTest {
    public static void main(String[] args) {
        while(true) {
            try {
                int i=System.in.read(); //System.in=input Stream.
                if(i==-1break;
                System.out.print((char)i);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

  • while문에 hasNext()의 조건(값을 입력하는 동안 유지)을 걸고 입력한 값을 그대로 출력하기. (InputTest01)
1
2
3
4
5
6
7
8
9
10
11
package ioTest;
import java.util.Scanner;
public class InputTest01 {
    public static void main(String[] args) {
        Scanner sc=new Scanner (System.in);
        while(sc.hasNext()) {//있는 동안
            String str=sc.next();
            System.out.println(str);
        }
    }
}

 

  • 파일로 내보내는 객체 fs를 만들기. 키보드로부터 받은 값을 텍스트파일에 입력하여 저장하기 (InputStreamTest)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package ioTest;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class InputStreamTest {
    public static void main(String[] args) {
        try {
            //파일로 내보내는 객체 fs를 만듦.
            FileOutputStream fs=new FileOutputStream("text.txt"); //refresh하면 text.txt파일이 생김
            while(true) {
                int i = System.in.read(); //키보드로부터 값을 받는다.
                if(i==-1break;
                fs.write(i); //콘솔로 입력받은 값을 내보내는 함수
            }
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

  • 텍스트 파일을 읽어들여 그 파일의 내용을 출력하기 (FileInputTest)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputTest {
    public static void main(String[] args) {
        try {
            FileInputStream fis=new FileInputStream("text.txt");
            while(true) {
                int i = fis.read(); //fis는 FileInputStream의 객체
                if(i==-1break;
                System.out.print((char)i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 

  • Synchronized된 자바 파일을 읽어들이기, 합하여 파일로 출력하기 (FileTest)
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
package ioTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileTest {
    public static void main(String[] args) {
        try {
            //Synchronized된 자바 파일을 읽어들이기
            FileInputStream fis=new FileInputStream("src\\threadTest\\SynchronizedEx.java");
            FileOutputStream fos=new FileOutputStream("output.txt");
            int c;
            while((c=fis.read())!=-1) {
              System.out.print((char)c);
              fos.write(c);
            }
            fis.close();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}