๐Ÿ“˜ ํŒŒ์ผ ์ฝ์–ด๋“ค์ด๊ธฐ (์ŠคํŠธ๋ฆผ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ™œ์šฉ)

heeezniยท2025๋…„ 5์›” 22์ผ

Java GUI ํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
7/20
post-thumbnail

1. ํŒŒ์ผ ์ž…์ถœ๋ ฅ (I/O)

๐Ÿฅค ๋นจ๋Œ€ - FileInputStream / FileOutputStream ์‚ฌ์šฉ

๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ŠคํŠธ๋ฆผ
์ด๋ฏธ์ง€, ๋™์˜์ƒ, ์‹คํ–‰ํŒŒ์ผ ๋“ฑ ๋ชจ๋“  ํŒŒ์ผ ํ˜•ํƒœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

  • FileInputStream: ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ (๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ๊ธฐ์šฉ)

  • FileOutputStream: ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ (๋ฐ”์ด๋„ˆ๋ฆฌ ์“ฐ๊ธฐ์šฉ)

์ŠคํŠธ๋ฆผ(Stream)

ํ˜„์‹ค์—์„œ stream์€ "๋ฌผ์ค„๊ธฐ", "ํ๋ฆ„"์„ ์˜๋ฏธํ•จ

์ž๋ฐ”์—์„œ์˜ ์ŠคํŠธ๋ฆผ์€ "๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„"์„ ๋œปํ•จ
โ†’ ํŒŒ์ผ, ํ‚ค๋ณด๋“œ, ๋„คํŠธ์›Œํฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž…์ถœ๋ ฅ ๋Œ€์ƒ๊ณผ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ํ†ต๋กœ

โœ… ์ฃผ์š” ๋ฉ”์„œ๋“œ

  • read() : 1๋ฐ”์ดํŠธ์”ฉ ์ฝ์Œ (๋ฆฌํ„ด๊ฐ’ -1์ด๋ฉด ํŒŒ์ผ ๋)
    ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ์Šค์Šค๋กœ ๋‹ค์Œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ

  • write(int b) : 1๋ฐ”์ดํŠธ์”ฉ ์ถœ๋ ฅ

  • close() : ์‚ฌ์šฉํ•œ ์ŠคํŠธ๋ฆผ ์ž์› ํ•ด์ œ


2. ์˜ˆ์™ธ(Exception) ์ฒ˜๋ฆฌ

โœ… try-catch-finally ๋ฌธ ์‚ฌ์šฉ

try : ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ(=์œ„ํ—˜ ๊ตฌ๊ฐ„)๋ฅผ ๊ฐ์‹ธ์„œ ์‹คํ–‰ํ•˜๋Š” ์˜์—ญ
catch : ์˜ˆ์™ธ๊ฐ€ ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ฒŒ, ์ •์ƒ ์ˆ˜ํ–‰์œผ๋กœ ์œ ๋„
finally : try์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋“ , catch๋กœ ๋„˜์–ด๊ฐ€๋“  ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋˜๋Š” ์˜์—ญ

ํŒŒ์ผ ์ž…์ถœ๋ ฅ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ˆ˜

โœ… ์˜ˆ์™ธ ๊ตฌ๋ถ„ ์ฒ˜๋ฆฌ

  • ๐Ÿšซ FileNotFoundException : ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฒฝ๋กœ ์˜ค๋ฅ˜
  • ๐Ÿšซ IOException : ์ผ๋ฐ˜์ ์ธ ์ž…์ถœ๋ ฅ ์˜ค๋ฅ˜ (์ฝ๊ธฐ/์“ฐ๊ธฐ ์‹คํŒจ ๋“ฑ)

โœ… ์ž์› ์ •๋ฆฌ

  • finally ๋ธ”๋ก์—์„œ close() ํ˜ธ์ถœ

  • ์ž…๋ ฅ์ŠคํŠธ๋ฆผ์ด null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ(=์กด์žฌํ•  ๋•Œ๋งŒ)
    close() ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€

์˜ˆ์™ธ vs ์—๋Ÿฌ

Exception์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ
Error๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์†๋Œˆ ์ˆ˜ ์—†๋Š” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ (JVM ์ฐจ์›)

์ฒดํฌ์˜ˆ์™ธ vs ์–ธ์ฒดํฌ ์˜ˆ์™ธ

๊ตฌ๋ถ„โœ… Checked ์˜ˆ์™ธโš ๏ธ Unchecked ์˜ˆ์™ธ
์ •์˜์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์˜ˆ์™ธ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐ•์ œํ•˜์ง€ ์•Š์Œ
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•„์ˆ˜?โญ• try-catch
๋˜๋Š” throws๋กœ ๋ช…์‹œํ•ด์•ผ ํ•จ
โŒ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งก๊น€
์ƒ์† ๊ตฌ์กฐException โ†’ ์ง์ ‘ ์ƒ์†RuntimeException โ†’ ํ•˜์œ„ ํด๋ž˜์Šค
๋Œ€ํ‘œ ์˜ˆ์‹œIOException, SQLException, FileNotFoundExceptionNullPointerException, ArithmeticException, ArrayIndexOutOfBoundsException
์šฉ๋„์™ธ๋ถ€ ์ž์›: ํŒŒ์ผ, DB, ๋„คํŠธ์›Œํฌ ๋“ฑ๋…ผ๋ฆฌ ์˜ค๋ฅ˜: ์ฝ”๋“œ ๋‚ด๋ถ€ ์‹ค์ˆ˜, ์ž˜๋ชป๋œ ์‚ฌ์šฉ ๋“ฑ
๊ฐœ๋ฐœ์ž ์‹ค์ˆ˜?์•„๋‹˜ (์™ธ๋ถ€ ์š”์ธ)๋งž์Œ (ํ”„๋กœ๊ทธ๋ž˜๋จธ ์‹ค์ˆ˜)

โญ์˜ˆ์ œ ์† ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ฝ”๋“œโญ

public void copy() {
    FileInputStream fis = null;
    FileOutputStream fos = null;

    try {
        fis = new FileInputStream(t_ori.getText());
        fos = new FileOutputStream(t_dest.getText());

        int data;
        while ((data = fis.read()) != -1) {
            fos.write(data);
        }

        // ๋ณต์‚ฌ ์™„๋ฃŒ ํ›„ ์•Œ๋ฆผ
        JOptionPane.showMessageDialog(this, "๋ณต์‚ฌ ์™„๋ฃŒ");

    } catch (IOException e) {
        // ๋ณต์‚ฌ ์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
        e.printStackTrace();
        JOptionPane.showMessageDialog(this, "๋ณต์‚ฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ");

    } finally {
        // ์ŠคํŠธ๋ฆผ ์ž์› ์ •๋ฆฌ (๋ฌด์กฐ๊ฑด ์‹คํ–‰)
        try {
            if (fis != null) fis.close();
            if (fos != null) fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ํŒ์—… ๋ฉ”์‹œ์ง€ ๐Ÿ’ฌ

JOptionPane.showMessageDialog(this, "๋ณต์‚ฌ์™„๋ฃŒ");
  • JOptionPane
    ์ž๋ฐ”์—์„œ ๊ฐ„๋‹จํ•œ ํŒ์—… ๋ฉ”์‹œ์ง€ ์ฐฝ์„ ๋„์šฐ๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค
    showMessageDialog(๋ฉ”์‹œ์ง€์ฐฝ ๋„์šธ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ, ์ž…๋ ฅํ•˜๊ณ  ์‹ถ์€ ํ…์ŠคํŠธ)
    ํŒ์—… ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ์šฉ ๋ฉ”์„œ๋“œ

  • Js์˜ alert()๊ณผ ๊ฐ™์€ ์—ญํ• 


printStackTrace( ) ๋ฉ”์„œ๋“œ

  • e.printStackTrace() : ์—๋Ÿฌ์˜ ์›์ธ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ
    ์ผ๋ฐ˜ ์œ ์ €๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋กœ๊ทธ ์ถœ๋ ฅ์ž„

๐Ÿ“‚ ํŒŒ์ผ ๋ณต์‚ฌ ํ”„๋กœ๊ทธ๋žจ

ํŒŒ์ผ ๊ฒฝ๋กœ ์ž…๋ ฅ์„ ํ†ตํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ๋ณต์‚ฌํ•˜๊ธฐ

ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰๊ธฐ๋ฅผ ํ†ตํ•ด ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ 

package com.sinse.ioproject;
import java.awt.*;
import java.io.*;
import javax.swing.*;


public class GuiCopy extends JFrame implements ActionListener {
	JLabel la_ori, la_dest;
	JTextField t_ori, t_dest;
	JButton bt_ori, bt_dest, bt_copy;
	JFileChooser fileChooser;

	public GuiCopy() {
		la_ori = new JLabel("์›๋ณธ");
		la_dest = new JLabel("๋ณต์‚ฌ๋ณธ");
		t_ori = new JTextField();
		t_dest = new JTextField();
		bt_ori = new JButton("์—ด๊ธฐ");
		bt_dest = new JButton("์ €์žฅ");
		bt_copy = new JButton("๋ณต์‚ฌ");

		fileChooser = new JFileChooser("C:/.../res");

		Dimension d = new Dimension(100, 24);
		Dimension d2 = new Dimension(330, 24);

		la_ori.setPreferredSize(d);
		la_dest.setPreferredSize(d);
		t_ori.setPreferredSize(d2);
		t_dest.setPreferredSize(d2);
		bt_ori.setPreferredSize(d);
		bt_dest.setPreferredSize(d);
		bt_copy.setPreferredSize(d);

		setLayout(new FlowLayout());

		bt_ori.addActionListener(this);
		bt_dest.addActionListener(this);
		bt_copy.addActionListener(this);

		add(la_ori);
		add(t_ori);
		add(bt_ori);
		add(la_dest);
		add(t_dest);
		add(bt_dest);
		add(bt_copy);

		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(580, 130);
		setVisible(true);
	}

	public void copy() {
		FileInputStream fis = null;
		FileOutputStream fos = null;

		try {
			fis = new FileInputStream(t_ori.getText());
			fos = new FileOutputStream(t_dest.getText());

			int data;
			while ((data = fis.read()) != -1) {
				fos.write(data);
			}

			JOptionPane.showMessageDialog(this, "๋ณต์‚ฌ ์™„๋ฃŒ");

		} catch (IOException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(this, "๋ณต์‚ฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ");
		} finally {
			try {
				if (fis != null) fis.close();
				if (fos != null) fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();

		if (obj == bt_ori) {
			int result = fileChooser.showOpenDialog(this);
			if (result == JFileChooser.APPROVE_OPTION) {
            
           		//์œ ์ €๊ฐ€ ์„ ํƒํ•œ ํŒŒ์ผ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒฝ๋กœ ์ถ”์ถœ
				//๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ…์ŠคํŠธ ํ•„๋“œ์— ์ถœ๋ ฅ
				File file = fileChooser.getSelectedFile();
				t_ori.setText(file.getAbsolutePath());
			}
		} else if (obj == bt_dest) {
			int result = fileChooser.showSaveDialog(this);
			if (result == JFileChooser.APPROVE_OPTION) {
				t_dest.setText(fileChooser.getSelectedFile().getAbsolutePath());
			}
		} else if (obj == bt_copy) {
			copy();
		}
	}

	public static void main(String[] args) {
		new GuiCopy();
	}
}

๋‹ค์‹œ ์‚ดํŽด๋ด์•ผ ํ•  ๋ถ€๋ถ„

์•ก์…˜์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ถ€๋ถ„์—์„œ...

		if (obj == bt_ori) {
			int result = fileChooser.showOpenDialog(this);
            // showOpenDialog : ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋Š”์ง€์— ๋”ฐ๋ผ ์ •์ˆ˜๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜๋จ
			if (result == JFileChooser.APPROVE_OPTION) {
            
           		//์œ ์ €๊ฐ€ ์„ ํƒํ•œ ํŒŒ์ผ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒฝ๋กœ ์ถ”์ถœ
				//๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ…์ŠคํŠธ ํ•„๋“œ์— ์ถœ๋ ฅ
				File file = fileChooser.getSelectedFile();
				t_ori.setText(file.getAbsolutePath());
			}
		} else if (obj == bt_dest) {
			int result = fileChooser.showSaveDialog(this); 

			if (result == JFileChooser.APPROVE_OPTION) {
				t_dest.setText(fileChooser.getSelectedFile().getAbsolutePath());
			}

1๏ธโƒฃ if(result == JFileChooser.APPROVE_OPTION){...}

fileChooser.showOpenDialog(this) (์ •์ˆ˜๊ฐ’ ๋ฐ˜ํ™˜)์ด๋ž‘
JFileChooser.APPROVE_OPTION (์ƒ์ˆ˜ ๋ฐ˜ํ™˜) ๊ฐ™์œผ๋ฉด ์กฐ๊ฑด ์ˆ˜ํ–‰

2๏ธโƒฃ
showOpenDialog() โ†’ ํŒŒ์ผ์„ "์ฝ๊ธฐ ์œ„ํ•ด" ์„ ํƒ
showSaveDialog() โ†’ ํŒŒ์ผ์„ "์“ฐ๊ธฐ ์œ„ํ•ด" ์„ ํƒ

๋‘˜ ๋‹ค JFileChooser์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์ด์–ผ๋กœ๊ทธ,
๋‘˜ ๋‹ค 0 = ์ˆ˜๋ฝ, 1 = ์ทจ์†Œ, -1 = ์˜ค๋ฅ˜ ์ฒด๊ณ„
โ€œ์—ด๊ธฐ๋ƒ, ์ €์žฅ์ด๋ƒโ€ ๋ชฉ์ ์— ๋”ฐ๋ผ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ฟ

3๏ธโƒฃ File file = fileChooser.getSelectedFile()
ํŒŒ์ผ ์„ ํƒ ์ฐฝ(JFileChooser) ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ํŒŒ์ผ ์ •๋ณด๋ฅผ
File ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ

getSelectedFile()์˜ ๋ฐ˜ํ™˜ํƒ€์ž…์ด File ๊ฐ์ฒด์ž„
๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ new File( ) ํ•ด์„œ ๋„˜๊ฒจ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ new File( ) ํ•  ํ•„์š” ์—†์Œ
File ๊ฐ์ฒด๋Š” ์„ ํƒํ•œ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ, ์ด๋ฆ„, ํฌ๊ธฐ ๋“ฑ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ

profile
์•„์ด๋“ค์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏฟ์—ˆ๋˜ ๋งˆ์Œ ๊ทธ๋Œ€๋กœ, ์ด์ œ๋Š” ๋‚˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏฟ๊ณ  ๋‚˜์•„๊ฐ€๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€