Java programming

(22.10.25)Java ν”„λ‘œκ·Έλž˜λ°: Stream μ‹€μŠ΅

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

νšŒμ›λ²ˆν˜Έ, νšŒμ›μ΄λ¦„ 각 5개λ₯Ό μ€‘λ³΅λ˜μ§€ μ•Šλ„λ‘ μž…λ ₯ν•˜κ³  번호순으둜 이름을 ν•¨κ»˜ 화면에 ν‘œμ‹œν•œλ‹€
λ‹€μ‹œ μ΄λ¦„μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ λ²ˆν˜Έμ™€ ν•¨κ»˜ 이름을 ν‘œμ‹œν•œλ‹€. μ΄λ•Œ μ›λž˜ μ΄λ¦„에 λΆ™μ—¬μ§„ λ²ˆν˜Έκ°€ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ν•œλ‹€

번호순으둜 이름을 ν•¨κ»˜ 화면에 ν‘œμ‹œν•˜κΈ° μœ„ν•΄ (Map<Integer,Member>)λ₯Ό μ΄μš©ν•œλ‹€.

 

Main 클래슀 μ½”λ“œ

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
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import com.ezen.javaoop.Member2;
 
public class MapMain 
{
    public static void main(String[] args) 
    {
        Map<Integer,Member2> map = new HashMap<>();
        map.put(3new Member2(3"ν•΄λ¦°"));
        map.put(1new Member2(1"ν•˜λ‹ˆ"));
        map.put(5new Member2(5"λ―Όμ§€"));
        map.put(4new Member2(4"λ‹€λ‹ˆμ—˜"));
        map.put(2new Member2(2"혜린"));
        
        List<Integer> list = new ArrayList<>(map.keySet());
        Collections.sort(list);
        for(int i =0;i<list.size();i++) {
            System.out.println(map.get(list.get(i)));
        }
        
        List<Member2> list2 = new ArrayList<Member2>(map.values());
        Collections.sort(list2);
        System.out.println("-----------------");
        for(int y =0;y<list2.size();y++) {
            System.out.println(list2.get(y));
        }
    }
}
cs

 

Member2 클래슀 μ½”λ“œ

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
public class Member2 implements Comparable<Member2>
{
    private int num;
    private String name;
    public Member2() {}
    public Member2(int num, String name) {
        super();
        this.setNum(num);
        this.setName(name);
    }
    @Override
    public String toString() {
        return num +"\t" + name;
    }
    @Override
    public int compareTo(Member2 o) {
        
        return this.name.compareTo(o.name);
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
cs

μ½˜μ†” κ°’:

번호λ₯Ό ν‚€ κ°’μœΌλ‘œ μ£Όμ—ˆκΈ° λ•Œλ¬Έμ— ν‚€λ₯Ό λ”°λ‘œ 뽑아 λ‚Ό 수 μžˆλŠ” keySet() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•œλ‹€. μ΄λ•Œ μžλ£Œκ΅¬μ‘°λŠ” Set으둜 μ €μž₯λ˜κΈ°λ•Œλ¬Έμ— μˆœμ„œλŒ€λ‘œ 정렬이 λΆˆκ°€λŠ₯ν•˜λ‹€ λ”°λΌμ„œ List둜 λ§Œλ“€μ–΄μ€˜μ„œ Collections.sort() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μ •λ ¬ν•œλ‹€.

λ‘λ²ˆμ§ΈλŠ” μ΄λ¦„μˆœμœΌλ‘œ μ •λ ¬ν•΄μ•Όν•˜κΈ°λ•Œλ¬Έμ— 값을 얻을 수 μžˆλŠ” values()λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•΄ List λ₯Ό λ§Œλ“€κ³  Member2 ν΄λž˜μŠ€λŠ” μ‚¬μš©μžκ°€ λ§Œλ“  클래슀이기 λ•Œλ¬Έμ—  문자λ₯Ό 비ꡐ할 수 μžˆλŠ” compareTo() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œ ν•΄μ€€λ‹€.

이후에 μ •λ ¬μ‹œν‚€λ©΄ 두가지 경우둜 μ •λ ¬λœ μ½˜μ†” 값을 확인할 수 μžˆλ‹€.


●Stream●

흐름, λ°μ΄ν„°μ˜ 흐름 (source -> sink)

λ‹€μ–‘ν•œ λ°μ΄ν„°μ˜ 흐름을 관리할 수 μžˆλ‹€.

Data IO API 클래슀

λ°μ΄ν„°μ˜ 2κ°€μ§€ μ’…λ₯˜ :

ν…μŠ€νŠΈ 데이터, 1~3 λ°”μ΄νŠΈκ°€ 문자λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

λ°”μ΄λ„ˆλ¦¬(Binary) 데이터(λΉ„λ””μ˜€, μ˜€λ””μ˜€, 이미지 λ“±λ“±) : 1λ°”μ΄νŠΈκ°€ 1개의 정보λ₯Ό κ°–λŠ”λ‹€.

 

Character Stream - ν…μŠ€νŠΈ 데이터λ₯Ό λ‹€λ£° 수 μžˆλ‹€. ν•œλ¬Έμžμ”© 닀룬닀. ~Reader, ~Writer λΆ™λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

 

Binary(bytes)Stream - 문자 μ΄μ™Έμ˜ 데이터λ₯Ό λ‹€λ£° 수 μžˆλ‹€. ν•œ λ°”μ΄νŠΈμ”© 닀룬닀. ~InputStream, ~OutputStream λΆ™λŠ” νŠΉμ§•μ΄ μžˆλ‹€. ~ λ°μ΄ν„°μ˜ μ†ŒμŠ€λ₯Ό κ°€λ₯΄ν‚€λŠ” 말이 자주 λΆ™λŠ”λ‹€.

 

ex) FileReader: νŒŒμΌμ—μ„œ ν…μŠ€νŠΈ 데이터λ₯Ό 읽어 μ˜€λŠ” 슀트림 클래슀(μ†ŒμŠ€ 슀트림)

      FileWriter :νŒŒμΌμ—μ„œ ν…μŠ€νŠΈ 데이터λ₯Ό μ“Έ 수 μžˆλŠ” 슀트림(싱크 슀트림)

 

문자/λΉ„λ¬Έμž 그리고 μž…λ ₯/좜λ ₯λ“± μ—¬λŸ¬κ²½μš°λ‘œ 2κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€

μŠ€νŠΈλ¦Όμ„ 도식화 해보면 데이터가 λ³΄λ‚΄λŠ” μͺ½μ΄ μ†ŒμŠ€ 슀트림 μ΅œμ’…μ μœΌλ‘œ λ°›μ•„μ„œ λ‚˜νƒ€λ‚˜λŠ” μͺ½μ΄ μ‹±ν¬μŠ€νŠΈλ¦Όμ΄λ‹€. μ–‘ 말단을 말단 슀트림(λ…Έλ“œ 슀트림)μ΄λΌν•˜κ³   쀑간에 끼어 μ—¬λŸ¬κ°€μ§€ κΈ°λŠ₯을 ν•˜λŠ” μŠ€νŠΈλ¦Όμ„ ν•„ν„° 슀트림이라 ν•œλ‹€.


Stream μ‹€μŠ΅

λ¬Έμ„œνŒŒμΌ

read() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬

ν•œκΈ€μžλ§Œ 좜λ ₯ν•˜λŠ” 방법 

read() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ λ¬Έμ„œμ— μžˆλŠ” 전체 문자 읽기

μ΄λ•Œ FileReaderλŠ” λ°”λ‘œ μ†ŒμŠ€μŠ€νŠΈλ¦Όμ΄λ‹€. μ†ŒμŠ€μŠ€νŠΈλ¦Όμ€ 읽을 데이터가 μžˆλŠ” μœ„μΉ˜λ₯Ό λ„£μ–΄μ€€λ‹€.

데이터가 μœ„μΉ˜μ— 없을 경우인 μ˜ˆμ™Έ κ²½μš°λ„ try catch문으둜 λ§Œλ“€μ–΄ μ€€λ‹€.

주석문에 κΈ€μžκ°€ μ—†μŒμ΄λΌκ³  잘λͺ» μ μ—ˆλŠ”λ°, κΈ€μžκ°€ μ—†μŒμ΄ μ•„λ‹ˆλΌ 슀트림의 끝이 -1값이닀.

ν•„ν„° μŠ€νŠΈλ¦Όμ„ μ΄μš©ν•˜μ—¬ 문자 ν•œκΈ€μžμ”©μ΄ μ•„λ‹Œ ν•œ ν–‰μ”© 읽기

ν•œν–‰μ”© 읽게 ν•΄μ£ΌλŠ” BufferedReader λŠ” μ†ŒμŠ€μŠ€νŠΈλ¦Ό λ‹€μŒμ— λΆ™λŠ” ν•„ν„°μŠ€νŠΈλ¦Όμ΄λ‹€.

ν•„ν„° 슀트림의 νŒŒλΌλ―Έν„° μ•ˆμ—λŠ” μ†ŒμŠ€μŠ€νŠΈλ¦Όμ²˜λŸΌ λ°”λ‘œ λ°μ΄ν„°μ˜ μœ„μΉ˜λ₯Ό μ μ–΄μ„œ 쀄 수 μ—†λ‹€.

μ†ŒμŠ€μŠ€νŠΈλ¦Όμ„ λ„£μ–΄μ•Όλ§Œ ν•œλ‹€.

 


λ¬Έμ„œμ— μžˆλŠ” 속성듀을 λ³΄λ“œ 객체λ₯Ό λ§Œλ“€μ–΄μ„œ 각각에 μ €μž₯ν•΄ 보기

 

λ¬Έμ„œ λ‚΄μš©

 

 

Board 클래슀 μ½”λ“œ

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
public class Board 
{
    private int num;
    private String title;
    private String author;
    private String date;
    private String contents;
    public Board() {}
    public Board(int num, String title, String author, String date, String contents) {
        super();
        this.num = num;
        this.title = title;
        this.author = author;
        this.date = date;
        this.contents = contents;
    }
    public Board(String[] board) {
        this.num= Integer.valueOf(board[0]);
        this.title= board[1];
        this.author= board[2];
        this.date= board[3];
        this.contents= board[4];
    }
    @Override
    public String toString() {
        return String.format("%d\t%s\t%s\t%s\t%s", num, title, author, date, contents);
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getContents() {
        return contents;
    }
    public void setContents(String contents) {
        this.contents = contents;
    }
}
cs

 

 

Main 클래슀 μ½”λ“œ

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
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
 
public class StreamMain 
{
    public static void main(String[] args) 
    {
        try {
            FileReader fr = new FileReader("D:/java_test/new.txt");
            BufferedReader br = new BufferedReader(fr);
            String line = null;
            List<Board> list = new ArrayList<>();
            while((line=br.readLine())!=null) {
                String[] token = line.split("\\|");
                Board board = new Board(token);
                list.add(board);
            }
            br.close();
            printboardlist(list);
        }    
            catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static void printboardlist(List<Board> list) {
        for(int i=0;i<list.size();i++) {
            System.out.println(list.get(i));
        }
    }
}
cs

μ½˜μ†” κ°’:

|둜 λ‚˜λ‰˜μ–΄μ§„ 정보듀을 μžλ°”μ—μ„œ 각각 κ°œμ²΄μ— μ €μž₯ν•˜μ—¬ ν‘œμ‹œν•  수 μžˆλ‹€.

String[] token = line.split("\\|");

ν•œμ€„ μ”© λ°›μ•„μ˜¨ 정보λ₯Ό |κΈ°μ€€μœΌλ‘œ λ‚˜λˆ„μ–΄ ν† ν°μœΌλ‘œ λ§Œλ“ λ’€ λ¬Έμžμ—΄λ°°μ—΄μ— μ €μž₯ν•˜λ©΄ κ°€λŠ₯ν•΄μ§„λ‹€. 이 λ¬Έμžμ—΄μ€ ν•˜λ‚˜μ˜ Boardκ°μ²΄λ‘œμ„œ λ΄μ„œ Board 객체에 μ €μž₯ν•΄μ€€λ‹€. 값이 μ €μž₯된 객체λ₯Ό μžλ£Œκ΅¬μ‘°μ— λ‹΄μ•„μ€€λ‹€.

이후 좜λ ₯ν•˜λ©΄ ν…μŠ€νŠΈ 정보듀이 μžλ°”μ—μ„œ 각각의 객체둜 λ‚˜λˆ„μ–΄ μ €μž₯된 κ±Έ λ³Ό 수 μžˆλ‹€.


μœ„ 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ 화면에 κ²Œμ‹œκΈ€ λͺ©λ‘μ„ ν‘œμ‹œν•  λ•Œ contents 속성을 μ œμ™Έν•œ λ‹€λ₯Έ μ†μ„±λ“€λ§Œ ν‘œμ‹œν•œλ‹€.

μ΄μš©μžκ°€ ν‚€λ³΄λ“œμ—μ„œ κ²Œμ‹œκΈ€ 번호λ₯Ό μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή κΈ€μ˜ 전체 λ‚΄μš©μ„ 보여쀀닀.

 

Main 클래슀 μ½”λ“œ

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.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class StreamMain 
{
    
    public static void main(String[] args) 
    {
        try {
            FileReader fr = new FileReader("D:/java_test/new.txt");
            BufferedReader br = new BufferedReader(fr);
            String line = null;
            List<Board> list = new ArrayList<>();
            while((line=br.readLine())!=null) {
                String[] token = line.split("\\|");
                Board board = new Board(token);
                list.add(board);
            }
            br.close();
            printboardlist(list);
            Scanner kbd = new Scanner(System.in);
            System.out.println("번호λ₯Ό λˆ„λ₯΄μ„Έμš”.");
            int inputnum = kbd.nextInt();
            kbd.nextLine();
    
            Board kwd = new Board();
            kwd.setNum(inputnum);
            System.out.println(list.get(list.indexOf(kwd)));
        }    
            catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static void printboardlist(List<Board> list) {
        for(int i=0;i<list.size();i++) {
            System.out.println(list.get(i).printlist());
        }
    }
}
cs

 

Board 클래슀 μ½”λ“œ

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
public class Board 
{
    private int num;
    private String title;
    private String author;
    private String date;
    private String contents;
    public Board() {}
    public Board(int num, String title, String author, String date, String contents) {
        super();
        this.num = num;
        this.title = title;
        this.author = author;
        this.date = date;
        this.contents = contents;
    }
    public Board(String[] board) {
        this.num= Integer.valueOf(board[0]);
        this.title= board[1];
        this.author= board[2];
        this.date= board[3];
        this.contents= board[4];
    }
    public String printlist() {
        return String.format("%d\t%s\t%s\t%s", num, title, author, date);
    }
    
    @Override
    public boolean equals(Object obj) {
        Board other = (Board)obj;
        return this.num==other.num;
    }
    @Override
    public String toString() {
        
        return String.format("%d\t%s\t%s\t%s\t%s", num, title, author, date,contents);
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getContents() {
        return contents;
    }
    public void setContents(String contents) {
        this.contents = contents;
    }
}
cs

 

μ½˜μ†” κ°’:

동등비ꡐλ₯Ό ν•˜κΈ° μœ„ν•΄μ„œ λ¨Όμ € Board ν΄λž˜μŠ€μ— equals λ©”μ†Œλ“œλ₯Ό 번호 비ꡐλ₯Ό ν•˜λ„λ‘ μ˜€λ²„λΌμ΄λ“œ ν•΄μ€˜μ•Όν•œλ‹€. contents 없이 ν”„λ¦°νŠΈ ν•  수 μžˆλŠ” λ©”μ†Œλ“œλ„ μƒˆλ‘œ λ§Œλ“€μ–΄μ„œ λͺ©λ‘μ„ 좜λ ₯ν•  λ•Œ μ΄μš©ν•œλ‹€. ν‚€λ³΄λ“œμ—μ„œ 받은 숫자λ₯Ό μƒˆλ‘œμš΄ Board 객체에 setNum() λ©”μ†Œλ“œλ₯Ό 톡해 λ„£μ–΄μ£Όκ³  이 μž…λ ₯된 숫자 값을 κ°€μ§€κ³  μžˆλŠ” Board 객체λ₯Ό μ°Ύμ•„μ„œ ν”„λ¦°νŠΈ ν•΄μ£Όλ©΄ λœλ‹€.

λŒ“κΈ€