Java programming

(22.10.31)Java ν”„λ‘œκ·Έλž˜λ°: Thread, Stream μ‹€μŠ΅ λ„€νŠΈμ›Œν¬κ°„ μ†Œν†΅

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2022. 10. 31.

ν‚€λ³΄λ“œμ—μ„œ 숫자λ₯Ό μž…λ ₯ν•  λ•Œλ§ˆλ‹€ μž…λ ₯된 수의 ꡬꡬ단이 화면에 ν‘œμ‹œλ˜λŠ” κΈ°λŠ₯을 λ¬΄ν•œνžˆ λ°˜λ³΅ν•œλ‹€.

그와 λ™μ‹œμ— 였늘 λ‚ μ§œλ₯Ό 1μ΄ˆμ— ν•œλ²ˆμ”© dates.txt νŒŒμΌμ— ν•œν–‰μœΌλ‘œ κΈ°λ‘ν•˜κΈ°λ₯Ό λ¬΄ν•œνžˆ λ°˜λ³΅ν•œλ‹€.

λ§Œμ•½ μ΄μš©μžκ°€ 숫자λ₯Ό μž…λ ₯ν•˜λŠ” λŒ€μ‹  문자λ₯Ό  μž…λ ₯ν•˜λ©΄, λͺ¨λ“  κΈ°λŠ₯이 μ •μ§€λ˜κ³  ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ„λ‘ν•œλ‹€.

Threadλ₯Ό μ’…λ£Œν•˜λ €λ©΄ μ“°λ ˆλ“œκ°€ μ‹€ν–‰ν•˜λŠ” λ¬΄ν•œ 루프λ₯Ό μ™„μ „νžˆ μ’…λ£Œν•˜λ©΄ λœλ‹€.

 

Daemon μ“°λ ˆλ“œ : μ–΄λ–€ μ“°λ ˆλ“œκ°€ μ’…λ£Œν•  λ•Œ, κ·Έ μ“°λ ˆλ“œκ°€ μƒμ„±ν•œ ν•˜μœ„ μ“°λ ˆλ“œλ„ ν•¨κ»˜ μ’…λ£Œλ˜λŠ” μ“°λ ˆλ“œ

Main() λ©”μ†Œλ“œλŠ” μžλ°”μ—μ„œ μ§€μ›ν•˜λŠ” Main Threadκ°€ μ‹€ν–‰ν•˜λ„λ‘ λ˜μ–΄ 있고, Main() λ©”μ†Œλ“œ μ•ˆμ—μ„œ μƒμ„±λ˜λŠ” μ“°λ ˆλ“œλŠ” Main Thread의 ν•˜μœ„ (μžμ‹) μ“°λ ˆλ“œμΈ μ…ˆμ΄λ‹€. λΆ€λͺ¨ μ“°λ ˆλ“œκ°€ μ’…λ£Œν•  λ•Œ κ·Έ μ•ˆμ—μ„œ μƒμ„±λœ μžμ‹ μ“°λ ˆλ“œκΉŒμ§€ μ’…λ£Œ λ˜λ„λ‘ ν•˜λ €λ©΄, μžμ‹ μ“°λ ˆλ“œλ₯Ό 생성할 λ•Œ μ°Έμ‘°λ³€μˆ˜κ°€ t1이라면 t1.setDaemon(true)λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€. 이런 μƒνƒœμ—μ„œ λΆ€λͺ¨ μ“°λ ˆλ“œκ°€ μ’…λ£Œλ˜λ©΄ κ·Έ μžμ‹ μ“°λ ˆλ“œμΈ t1도 ν•¨κ»˜ μ’…λ£Œν•œλ‹€. 

 

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
import java.io.FileWriter;
import java.io.*;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Scanner;
 
public class ThreadMain 
{
    public static void main(String[] args) 
    {
        Thread gg = new Thread(
            new Runnable() {//읡λͺ… ν΄λž˜μŠ€(Anonymous Class)의 κ°μ²΄ μƒμ„±
                @Override
                public void run() {
                    Code1();    
                }
            }
        );
        gg.setDaemon(true);
        gg.start();
 
        try {
            PrintWriter pw = new PrintWriter(new FileWriter("D:/java_test/dates.txt"));
            while(!exit) {
                pw.println(new Date());
                pw.flush();
                Thread.sleep(1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("메인 μ“°λ ˆλ“œ μ’…λ£Œ");
    }
    static boolean exit = false;
    
    static void Code1(){
        boolean go = true;
        while(go) {
            System.out.println("λ‹¨μˆ˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”.");
            Scanner kbd = new Scanner(System.in);
            try {
                int inputnum = kbd.nextInt();
                kbd.nextLine();
                for(int i =1;i<10;i++) {
                    System.out.printf("%d * %d = %d\n",inputnum,i,inputnum*i);
                }
            } catch (Exception e) {
                exit = true;
            } 
        }
    }
}
cs

μ½˜μ†” κ°’:

λ‹¨μˆ˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”.
5
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
λ‹¨μˆ˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”.
6
6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
λ‹¨μˆ˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”.
ㅁ
메인 μ“°λ ˆλ“œ μ’…λ£Œ

 

 

dates.txt λ¬Έμ„œ

deamon μ“°λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ code1μ—μ„œ 문자λ₯Ό μž…λ ₯ν•˜λ©΄ 메인 μ“°λ ˆλ“œμ— 있던 λ¬΄ν•œ λ£¨ν”„μ—μ„œ λΉ μ Έλ‚˜κ°€κ²Œ λ˜μ–΄ ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ”κ³  ν•¨κ»˜ code1 λ©”μ†Œλ“œλ„ μ’…λ£Œλ˜κ²Œ λ§Œλ“€μ—ˆλ‹€. μ‹€ν–‰ν›„ 문자λ₯Ό μž…λ ₯ν•˜μ—¬ 였λ₯˜λ₯Ό λ°œμƒν–ˆλ”λ‹ˆ λ¬΄ν•œλ£¨ν”„μ—μ„œ λΉ μ Έλ‚˜κ°€ ν”„λ‘œκ·Έλž¨μ΄ 끝났고 μ‹œκ°„μ„ 계속 μ°μ–΄λ‚΄λŠ” 루프도 μ•½ 8μ΄ˆκ°„λ§Œ μž‘λ™ν•œ κ±Έ 확인할 수 μžˆλ‹€.


Protocol :  톡신 κ·œμ•½ (TCP/IP, HTTP)

μžλ°”μ—μ„œ μ œκ³΅ν•΄μ£ΌλŠ” TCP 클래슀 μ†ŒμΌ“ (Socket)κ³Ό μ„œλ²„ μ†ŒμΌ“(Sever socket)을 μ΄μš©ν•˜μ—¬ λ„€νŠΈμ›Œν¬κ°„μ˜ ꡐλ₯˜κ°€ κ°€λŠ₯ν•˜λ‹€.

 

파일과 νŒŒμΌκ°„μ˜ 데이터 이동 말고도 λ„€νŠΈμ›Œν¬μ™€ λ„€νŠΈμ›Œν¬ κ°„μ˜ 데이터 이동도 κ°€λŠ₯ν•˜λ‹€. 정보λ₯Ό 전달 λ˜λŠ” μš”μ²­ν•˜λŠ” 컴퓨터λ₯Ό ν΄λΌμ΄μ–ΈνŠΈ 컴퓨터라 ν•˜κ³  그것을 μˆ˜μ‹ ν•˜μ—¬ κ²°κ³Όλ₯Ό λ³΄λ‚΄μ£ΌλŠ” 컴퓨터λ₯Ό μ„œλ²„ 컴퓨터라고 ν•œλ‹€. μžλ°” μ½”λ“œμ—μ„œλ„ μš”μ²­ν•˜κ³  λ°›κ³  λ‹€μ‹œ μš”μ²­ν•˜κ³  λ°›κ³  ν•˜λŠ” 일련의 κ³Όμ •λ“€λ‘œ 데이터λ₯Ό 전달 κ°€λŠ₯ν•΄ μ§„λ‹€.

 

 

λ„€νŠΈμ›Œν¬ 데이터 이동 기초 맛보기

 

λ„€νŠΈμ›Œν¬κ°„μ˜ 데이터λ₯Ό μ£Όκ³  λ°›μœΌλ €λ©΄ λ¨Όμ € μ„œλ²„ 컴퓨터가 λŒμ•„ κ°€μ•Όν•œλ‹€. μ„œλ²„ 클래슀λ₯Ό μ‹€ν–‰μ‹œν‚€λ©΄ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‹ ν˜Έλ₯Ό κΈ°λ‹€λ¦¬λŠ” λŒ€κΈ° μƒνƒœλ‘œ μžˆλŠ”λ‹€.

 

 

ν΄λΌμ΄μ–ΈνŠΈ 클래슀λ₯Ό μ‹€ν–‰μ‹œν‚€λ©΄ μž…λ ₯ν•΄μ€€ 호슀트의 포트둜 연결을 ν•œλ‹€. 

 

ν΄λΌμ΄μ–ΈνŠΈμ™€ 잘 μ—°κ²°λ˜μ–΄ ν”„λ‘œκ·Έλž¨μ΄ λ§ˆμ§€λ§‰κΉŒμ§€ μ‹€ν–‰λœ κ±Έ 확인할 수 μžˆλ‹€.


Stream을 μ΄μš©ν•œ λ„€νŠΈμ›Œν¬κ°„ 데이터 이동(νŒŒμ›Œ μ½”λ”©μœΌλ‘œ κ°„λž΅ν•œ 둜그인 μ‹œμŠ€ν…œ 맛보기)

 

Server 클래슀 μ½”λ“œ

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
import java.io.*;
import java.net.*;
 
public class Server 
{
    public static void main(String[] args) 
    {
        try { 
            ServerSocket ss = new ServerSocket(1234);
            //0~1024 : μ΄ ν¬νŠΈλ“€μ€ ν”Όν•΄μ„œ λ§Œλ“ λ‹€.
            
            System.out.println("μ„œλ²„μ†ŒμΌ“ λŒ€κΈ°μ€‘");
            Socket s = ss.accept();//μ„œλ²„μͺ½μ—μ„œ λ©ˆμΆ°μ„œ λ¬΄ν•œ λŒ€κΈ° ν•˜λ‹€κ°€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 
            //접속 μš”청을 ν•˜λ©΄ μ ‘속을 λ°›μ•„듀이고 μ ‘μ†λœ ν΄λΌμ΄μ–ΈνŠΈμ™€ ν†΅μ‹ ν•˜κΈ° μœ„ν•œ Socket μƒμ„±
            System.out.println("ν΄λΌμ΄μ–ΈνŠΈ μ ‘속됨");
            //접속 κ΄€λ¦¬
            
            
            //ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ©”μ‹œμ§€ ν˜ΈμΆœ
            OutputStream os = s.getOutputStream();
            OutputStreamWriter ow = new OutputStreamWriter(os);
            //λ¬Έμžμ—΄ λ°μ΄ν„°λ₯Ό λ°”μ΄νŠΈ λ°μ΄ν„°λ‘œ λ³€ν™˜ν•΄μ„œ μΆœλ ₯
            PrintWriter pw = new PrintWriter(ow);
            //λ¬Έμžμ—΄ ν•œν–‰ν•œν–‰μ„ μΆœλ ₯
            
            pw.println("접속 μ„±κ³΅");
            pw.flush(); //μž‘μ€ λ°μ΄ν„°λΌλ„ μΆœλ ₯ν•˜κ²Œλ” λͺ…λ Ή
            
            //ν΄λΌμ΄μ–ΈνŠΈκ°€ λ³΄λ‚΄λŠ” μ•„이디 μ•”ν˜Έλ₯Ό μˆ˜μ‹ ν•˜κ³  μΈμ¦μ„ μˆ˜ν–‰ν•œλ‹€.
            InputStream is = s.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String msg = br.readLine();
            String[] login = msg.split(" ");
            String uid = login[0];
            String upw = login[1];
            
            if(uid.equals("Smith")&&upw.equals("12345")) {
                pw.println("둜그인 μ„±κ³΅");
                pw.flush(); 
            }else {
                pw.println("둜그인 μ‹€νŒ¨");
                pw.flush(); 
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("μ„œλ²„ μ’…λ£Œ");
    }
}
cs

 

Client 클래슀 μ½”λ“œ

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
import java.io.*;
import java.net.*;
 
public class Client
{
    public static void main(String[] args)
    {
        try {
            Socket s = new Socket("127.0.0.1",1234);//루프 λ°± μ•„이피 μ£Όμ†Œ
                                //(String host, int port)
            System.out.println("μ„œλ²„μ ‘μ† μ„±κ³΅");
            
            //μ„œλ²„μ—μ„œ μ „μ†‘ν•œ λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•œλ‹€
            InputStream is = s.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String msg = br.readLine();
            
            System.out.println("μ„œλ²„μΈ‘μ—μ„œ λ³΄λ‚΄μ˜¨ λ©”μ„Έμ§€:"+msg);
            
            if(msg.equals("접속 μ„±κ³΅")) {
                OutputStream os = s.getOutputStream();
                OutputStreamWriter ow = new OutputStreamWriter(os);
                PrintWriter pw = new PrintWriter(ow);
                pw.println("Smith 12345");
                pw.flush();
                
                String loginresult = br.readLine();
                if(loginresult.equals("둜그인 μ„±κ³΅")) {
                    System.out.println("둜그인 κ²°κ³Ό:"+loginresult);
                    //μ±„νŒ… λ©”μ‹œμ§€λ₯Ό μ†‘μˆ˜μ‹ ν•œλ‹€.
                    //λ¬΄ν•œ λ£¨ν”„λ₯Ό μ‚¬μš©ν•˜μ—¬ μ±„νŒ… λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄κ³  λ°›λŠ”λ‹€
                    //ν‚€λ³΄λ“œ μž…λ ₯ > μ„œλ²„λ‘œμ „μ†‘ : ν•˜λ‚˜μ˜ λ¬΄ν•œλ£¨ν”„λ‘œ κ΅¬μ„±(좜λ ₯κΈ°λŠ₯)
                    //λ„€νŠΈμ› μž…λ ₯ > λͺ¨λ‹ˆν„° μΆœλ ₯ : ν•˜λ‚˜μ˜ λ¬΄ν•œ λ£¨ν”„λ‘œ κ΅¬μ„±(μž…λ ₯ κΈ°λŠ₯)
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("ν΄λΌμ΄μ–ΈνŠΈ μ’…λ£Œ");
    }
}
cs

μ„œλ²„ μ½˜μ†” κ°’:

μ„œλ²„μ†ŒμΌ“ λŒ€κΈ°μ€‘
ν΄λΌμ΄μ–ΈνŠΈ μ ‘속됨
μ„œλ²„ μ’…λ£Œ

 

ν΄λΌμ΄μ–ΈνŠΈ μ½˜μ†” κ°’:

μ„œλ²„μ ‘μ† μ„±κ³΅
μ„œλ²„μΈ‘μ—μ„œ λ³΄λ‚΄μ˜¨ λ©”μ„Έμ§€:접속 μ„±κ³΅
둜그인 κ²°κ³Ό:둜그인 μ„±κ³΅
ν΄λΌμ΄μ–ΈνŠΈ μ’…λ£Œ

 

μŠ€νŠΈλ¦Όμ„ 톡해 정보λ₯Ό 보내고 λ°›κ³  λ‹€μ‹œ 보내고 λ°›κ³ μ˜ 과정을 λ°˜λ³΅ν•΄μ€€λ‹€.

μ„œλ²„ ν΄λž˜μŠ€μ—μ„œ 접속성을 좜λ ₯ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈ ν΄λž˜μŠ€μ—μ„œ μž…λ ₯ λ°›κ³  그것이 쑰건문에 μΆ©μ‘±ν•œλ‹€λ©΄ ν΄λΌμ΄μ–ΈνŠΈ ν΄λž˜μŠ€μ—μ„œ 아이디와 λΉ„λ°€λ²ˆν˜Έλ₯Ό 좜λ ₯ν•˜κ³  μ„œλ²„ ν΄λž˜μŠ€μ—μ„  κ·Έ 정보듀을 μž…λ ₯ λ°›λŠ”λ‹€. 받은 정보가 데이터 λ² μ΄μŠ€μ— 있던 정보와 λ§žλ‹€λ©΄ 둜그인 성곡을 좜λ ₯ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈ ν΄λž˜μŠ€μ—μ„  보낸 것을 μž…λ ₯ λ°›λŠ”λ‹€.

 

μ„œλ²„ 컴퓨터가 ν•˜λŠ” 일은 λ¬΄ν•œ λŒ€κΈ°ν•˜κ³  μžˆλ‹€κ°€ ν΄λΌμ΄μ–ΈνŠΈ 컴퓨터가 μ ‘μ†ν•˜λ©΄ ν†΅μ‹ ν•œλ‹€. 근데 μ„œλ²„ 컴퓨터라면 ν†΅μ‹ ν•˜λ©΄μ„œ λŒ€κΈ°λ„ ν•  수 있게 λ³‘ν–‰μ²˜λ¦¬ ν•΄μ•Όν•œλ‹€. μ•ˆκ·ΈλŸ¬λ©΄ ν•œλͺ…이 μ„œλ²„λ₯Ό μ΄μš©ν•˜λ©΄ λ‹€λ₯Έ μ΄μš©μžλ“€μ΄ μ΄μš©ν•˜μ§€ λͺ»ν•œλ‹€. μ΄λŸ¬ν•œ 방법을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„   μ“°λ ˆλ“œ 처리(ν†΅μ‹ μš© μ „λ‹΄ μ“°λ ˆλ“œ μƒμ„±ν•˜μ—¬ μ‹€ν–‰) λ₯Ό ν•΄μ€˜μ•Όν•œλ‹€.

 

λŒ“κΈ€