Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

기록

day 0524 컬렉션_가위바위보_그림판 본문

📖

day 0524 컬렉션_가위바위보_그림판

슈슈파나 2024. 5. 24. 17:29

/ArrayList/

배열과 같은 메모리 구조 (연속된 메모리 확보)

 

배열의 중간에 새로운 데이터를 추가(add)하거나 삭제(remove)하면 새로운 메모리를 확보하여

가비지도 생성되고 데이터를 모두 이동시켜야 하므로 성능이 떨어집니다

package com.kosta.exam01;

import java.util.ArrayList;

public class ArrayListAndLinkedListTest {

	public static void main(String[] args) {
		ArrayList<String> data = new ArrayList<String>();
		data.add("사과");
		data.add("수박");
		data.add("딸기");
		System.out.println(data);
		
		data.add(1, "포도");
		System.out.println(data);
		
		data.remove(2);
		System.out.println(data);
	}
}

 

/LinkedList/

동작하는 방식은 같지만 내부 구조는 다르다 (연속된 메모리가 아니다)

 

LinkedList는 연속된 메모리가 아니라 요소 하나하나가 데이터를 표현하는 속성과

요소가 있는 주소를 갖고있어요 ((value, next)로 구성되어있다) 연결되있진 않지만 내부적으로 서로 연결되어있다

 

만약에 배열의 중간에 데이터를 추가하거나 삭제 할 일이 빈번하다면

ArrayList보다는 LinkedList를 사용하는 것이 더 적합합니다

package com.kosta.exam02;

import java.util.LinkedList;

public class ArrayListAndLinkedListTest2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		LinkedList<String> data = new LinkedList<String>();
		data.add("사과");
		data.add("수박");
		data.add("딸기");
		System.out.println(data);
		
		data.add(1, "포도");
		System.out.println(data);
		
		data.remove(2);
		System.out.println(data);
	}
}

 

컬렉션 프레임워크 

    배열은 자료형이 같아야하고, 크기가 고정되어 있어 데이터를 추가하거나

    삭제 할 때 코드가 번거로워집니다

    이때 동적인 배열 컬렉션 프레임워크를 사용하면

    다양한 자료형을 담을 수 있고 데이터를 담는 만큼

    배열의 크기가 자동으로 늘고 삭제하면 자동으로 줄어듭니다

 

Set  : 중복을 허용하지 않는다

    HashSet  : 데이터 순서를 유지 X

    LinkedHashSet  :  데이터 순서를 유지 O

    TreeSet  :  데이터를 정렬(단, 자료형이 같아야 함)

 

List  : 중복을 허용한다, 순서 유지 O

    ArrayList, LinkedList 둘 다 사용법은 동일하지만

    ArrayList는 마치 배열처럼 연속된 메모리로 확보되기 때문에

    배열의 중간에 데이터를 추가하거나 삭제하면 가비지가 만들어지고

    또 데이터 수만큼 이동해야하기 때문에 성능이 떨어질 수 있어요

    이런 경우에는 LinkedList를 사용하는것이 효율적입니다

 

Map : 인덱스 대신 key에 의해 데이터에 접근하는 방식 (key,value)

    HashMap  :  순서를 유지 X

    LinkedHashMap  : 순서를 유지 O

    TreeMap  :  key 값으로 정렬

 

/HashMap/

package com.kosta.exam03;

import java.util.HashMap;
import java.util.Map;

public class HashMapTest {

	public static void main(String[] args) {
		// K : key의 자료형, V : value  // HashMap, 순서유지 X
		Map<String, String> data = new HashMap<String, String>();
		
		data.put("name", "홍길동");
		data.put("addr", "서울시 종로구");
		data.put("phone", "010");
		
		String addr = data.get("addr");
		System.out.println(addr);
		System.out.println(data);
	}
}

 

/LinkedHashMap/

package com.kosta.exam03;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class HashMapTest {

	public static void main(String[] args) {
		Map<String, String> data = new LinkedHashMap<String, String>();
		
		data.put("name", "홍길동");
		data.put("addr", "서울시 종로구");
		data.put("phone", "010");
		
		String addr = data.get("addr");
		System.out.println(addr);
		System.out.println(data);
	}
}

 

/TreeMap/

package com.kosta.exam03;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class TreeMapTest {

	public static void main(String[] args) {
		Map<String, String> data = new TreeMap<String, String>();
		
		data.put("name", "홍길동");
		data.put("addr", "서울시 종로구");
		data.put("phone", "010");
		
		String addr = data.get("addr");
		System.out.println(addr);
		System.out.println(data);
	}
}

 

/가위 바위 보/

package com.kosta.exam03;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;

public class GameTestMap {

	public static void main(String[] args) {
		// 컴퓨터와 사용자가 가위, 바위, 보 하는 게임을 만들어 봅시다
		Map<Integer, String>  map = new HashMap<Integer, String>();
		
		// 데이터 넣기
		map.put(0, "가위");
		map.put(1, "바위");
		map.put(2, "보");
		
		Random r = new Random();
		int com = r.nextInt(3);
		
		int user;
		Scanner sc = new Scanner(System.in);
		System.out.println("** 가위 바위 보 게임 **");
		System.out.println("[0] 가위 [1] 바위 [2] 보");
		user = sc.nextInt();
		
		System.out.printf("컴퓨터는 %s를 냈습니다.\n", map.get(com));
		System.out.printf("당신은 %s를 냈습니다.\n", map.get(user));
		
		// 게임 결과를 판별하여 출력하도록 코드를 완성 해 봅니다
		if(com == user) {
			System.out.println("비겼습니다.");
			// ~를 해서 이기거나 || 
		}else if((user == 0 && com == 2)||(user == 1 && com == 0)||(user == 2 && com == 1)){
			System.out.println("당신이 이겼습니다.");
		}else {
			System.out.println("컴퓨터가 이겼습니다.");
		}
	}
}

 

/사각형 그리기/

@Override
public void paint(Graphics g) { 
    // 사각형 그리기는 x, y, width, height를 전달해야 합니다
    // 시작점과 끝점을 통해 width, height를 계산해요
    int x = x1;
    int y = y1;
    int width = x2 - x1;
    int height = y2 - y1;

    g.drawRect(x, y, width, height);
}
@Override
public void paint(Graphics g) { 
    // 사각형 그리기는 x, y, width, height를 전달해야 합니다
    // 시작점과 끝점을 통해 width, height를 계산해요
    int x = x1;
    int y = y1;

    // 시작점보다 끝점이 크다 (순방향)
    int width = x2 - x1;
    int height = y2 - y1;

    // x2가 x1보다 더 작은가? x를 변경, width를 변경
    if(x2 < x1) {
        x = x2;
        width = x1 - x2;
    }

    // y2가 y1보다 더 작은가? y를 변경, height를 변경
    if(y2 < y1) {
        y = y2;
        height = y1 - y2;
    }

    g.drawRect(x, y, width, height);
}

 

/사각형 list에 저장하기/

package com.kosta.exam04;

import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

public class LinePanel extends Panel implements MouseListener {

	ArrayList<GraphicInfo> list = new ArrayList<GraphicInfo>();

	int x1, y1, x2, y2;
	
	public LinePanel() { 
		list = new ArrayList<GraphicInfo>();
		addMouseListener(this);
		
	}

	@Override
	public void paint(Graphics g) {
		
	    int x = x1;
	    int y = y1;

	    int width = x2 - x1;
	    int height = y2 - y1;
		
		for(GraphicInfo info : list) {
			x = info.getX1();
			y = info.getY1();
			width = info.getX2() - info.getX1();
			height = info.getY2() - info.getY1();
			
			if(info.getX2() < info.getX1()) {
				x = info.getX2();
				width = info.getX1() - info.getX2();
			}
			if(info.getY2() < info.getY1()) {
				y = info.getY2();
				height = info.getY1() - info.getY2();
			}
			g.drawRect(x, y, width, height);
			// g.drawOval(x, y, width, height); // 원그리기
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {
	}

	@Override
	public void mousePressed(MouseEvent e) {
		x1 = e.getX();
		y1 = e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		x2 = e.getX();
		y2 = e.getY();
		
		list.add(new GraphicInfo(x1, y1, x2, y2));
		
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}
}

 

/메뉴바 만들기/

package com.kosta.exam04;

import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;

public class MyFrame extends Frame {
	LinePanel lp;
	
	public MyFrame() {
		lp = new LinePanel();

		add(lp);
		
		// 메뉴바를 생성합니다
		MenuBar mb = new MenuBar();
		
		// 주메뉴 "그리기도구"를 만듭니다
		Menu menu_draw = new Menu("DrawType");
		
		// 부메뉴 "선", "사각형", "원"을 만들어요
		MenuItem draw_line = new MenuItem("Line");
		MenuItem draw_rect = new MenuItem("Rect");
		MenuItem draw_oval = new MenuItem("Oval");
		
		// 주메뉴 "그리기도구"에 부메뉴 "선", "사각형", "원"을 담아요
		menu_draw.add(draw_line);
		menu_draw.add(draw_rect);
		menu_draw.add(draw_oval);
		
		//  주메뉴 "그리기도구"를 메뉴바에 담아요
		mb.add(menu_draw);
		
		// Frame에 메뉴바를 설정하는 메소드
		setMenuBar(mb);
		
		setSize(400, 300);
		setVisible(true);
	}
}

 

/메뉴 기능 구현하기/

java.awt.event  - ActionListener

 

/ActionListener 인터페이스로 구현한 이름없는 클래스를 바로 객체 생성 해 준다/

// ActionListener 인터페이스를 구현한 이름없는 클래스를 바로 객체 생성 해 준다
draw_line.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("선 그리기를 선택하였습니다.");
    }
});

    // ActionListener 인터페이스를 구현한 이름없는 클래스를 바로 객체 생성 해 준다
    class MyLineEvent implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("선 그리기를 눌렀어요.");					
        } 
    }
        // MyLineEvent me = new MyLineEvent();
        // draw_line.addActionListener(me);
        draw_line.addActionListener(new MyLineEvent());
}

 

/info에 들어있는 drawType에 따라 해당 그래픽을 그리도록 출력하기/

package com.kosta.exam04;

import java.util.ArrayList;

public class GraphicInfo {
	private int x1;
	private int y1;
	private int x2;
	private int y2;
	private int drawType;
	
	public GraphicInfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	// drawType 추가하기
	public GraphicInfo(int x1, int y1, int x2, int y2, int drawType) {
		super();
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
		this.drawType = drawType;
	}

	public int getX1() {
		return x1;
	}
	
	public void setX1(int x1) {
		this.x1 = x1;
	}
	public int getY1() {
		return y1;
	}
	public void setY1(int y1) {
		this.y1 = y1;
	}
	public int getX2() {
		return x2;
	}
	public void setX2(int x2) {
		this.x2 = x2;
	}
	public int getY2() {
		return y2;
	}
	public void setY2(int y2) {
		this.y2 = y2;
	}

	public int getDrawType() {
		return drawType;
	}

	public void setDrawType(int drawType) {
		this.drawType = drawType;
	}	
}
package com.kosta.exam04;

import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

public class DrawPanel extends Panel implements MouseListener {

	ArrayList<GraphicInfo> list = new ArrayList<GraphicInfo>();

	int x1, y1, x2, y2;
	int drawType; // 0:선, 1:사각형, 2.원
	
	public DrawPanel() { 
		list = new ArrayList<GraphicInfo>();
		addMouseListener(this);
	}

	@Override
	public void paint(Graphics g) {	
	    int x, y, width, height;

		// info에 들어있는 drawType에 따라 해당 그래픽을 그리도록 출력하기  	
		for(GraphicInfo info : list) {
			x = info.getX1();
			y = info.getY1();
			width = info.getX2() - info.getX1();
			height = info.getY2() - info.getY1();		
    			if(info.getX2() < info.getX1()) {
    				x = info.getX2();
    				width = info.getX1() - info.getX2();
    			}
    			if(info.getY2() < info.getY1()) {
    				y = info.getY2();
    				height = info.getY1() - info.getY2();
    			}
    			switch(info.getDrawType()) {
    				case 0: g.drawLine(info.getX1(), info.getY1(), info.getX2(), info.getY2()); break;
    				case 1: g.drawRect(x, y, width, height); break;
    				case 2: g.drawOval(x, y, width, height); break;
    			}
    		}
	    }

	@Override
	public void mouseClicked(MouseEvent e) {
	}

	@Override
	public void mousePressed(MouseEvent e) {
		x1 = e.getX();
		y1 = e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		x2 = e.getX();
		y2 = e.getY();
		
		list.add(new GraphicInfo(x1, y1, x2, y2, drawType));
		
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}
}
package com.kosta.exam04;

import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends Frame {
	DrawPanel dp;
	
	public MyFrame() {
		dp = new DrawPanel();
		
		add(dp);
		
		// 메뉴바를 생성합니다
		MenuBar mb = new MenuBar();
		
		// 주메뉴 "그리기도구"를 만듭니다
		Menu menu_draw = new Menu("DrawType");
		
		// 부메뉴 "선", "사각형", "원"을 만들어요
		MenuItem draw_line = new MenuItem("Line");
		MenuItem draw_rect = new MenuItem("Rect");
		MenuItem draw_oval = new MenuItem("Oval");
		
		// 주메뉴 "그리기도구"에 부메뉴 "선", "사각형", "원"을 담아요
		menu_draw.add(draw_line);
		menu_draw.add(draw_rect);
		menu_draw.add(draw_oval);
		
		//  주메뉴 "그리기도구"를 메뉴바에 담아요
		mb.add(menu_draw);
		
		// Frame에 메뉴바를 설정하는 메소드
		setMenuBar(mb);
		
		setSize(400, 300);
		setVisible(true);
		
		// 각각의 메뉴가 눌러졌을 때 동작하도록 일을 시킵니다 (메뉴 이벤트를 등록한다)		
		// ActionListener 인터페이스를 구현한 이름없는 클래스를 바로 객체 생성 해 준다
		draw_line.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawType = 0;
			}
		});
		
		draw_rect.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawType = 1;
			}
		});
		
		draw_oval.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawType = 2;
			}
		});
		
	}
}
package com.kosta.exam04;

public class GrimpanTest {

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

 


 

14:00 ~ 

 

/컬러 메뉴바 만들기/

//주메뉴 "그리기색상"을 만듭니다.
Menu menu_color = new Menu("DrawColor");

//"그리기색상"의 부메뉴 "빨강","파랑","초록"을 만들어요
MenuItem color_red = new MenuItem("Red");
MenuItem color_blue = new MenuItem("Blue");
MenuItem color_green = new MenuItem("Green");	

//주메뉴 "그리기색상"에 부메뉴 "빨강","파랑","초록"을 담아요
menu_color.add(color_red);
menu_color.add(color_blue);
menu_color.add(color_green);

//주메뉴 "그리기색상"을 메뉴바에 담아요
mb.add(menu_color);

 

/color Override/

color_red.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        dp.drawColor = Color.red;
    }
});
color_blue.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        dp.drawColor = Color.blue;
    }
});
color_green.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        dp.drawColor = Color.green;
    }
});

package com.kosta.grimpan;

import java.awt.Color;
import java.util.ArrayList;

public class GraphicInfo {
	private int x1;
	private int y1;
	private int x2;
	private int y2;
	private int drawType;
	private Color drawColor;
	
	public GraphicInfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	// drawColo 추가하기
	public GraphicInfo(int x1, int y1, int x2, int y2, int drawType, Color drawColor) {
		super();
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
		this.drawType = drawType;
		this.drawColor = drawColor;
	}
	
	public int getX1() {
		return x1;
	}
	public void setX1(int x1) {
		this.x1 = x1;
	}
	public int getY1() {
		return y1;
	}
	public void setY1(int y1) {
		this.y1 = y1;
	}
	public int getX2() {
		return x2;
	}
	public void setX2(int x2) {
		this.x2 = x2;
	}
	public int getY2() {
		return y2;
	}
	public void setY2(int y2) {
		this.y2 = y2;
	}
	public int getDrawType() {
		return drawType;
	}
	public void setDrawType(int drawType) {
		this.drawType = drawType;
	}
	public Color getDrawColor() {
		return drawColor;
	}
	public void setDrawColor(Color drawColor) {
		this.drawColor = drawColor;
	}
}
package com.kosta.grimpan;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends Frame {
	DrawPanel dp;
	
	public MyFrame() {
		dp = new DrawPanel();
		
		add(dp);
		
		// 메뉴바를 생성합니다
		MenuBar mb = new MenuBar();
		
		// 주메뉴 "그리기도구"를 만듭니다
		Menu menu_draw = new Menu("DrawType");
		
		//주메뉴 "그리기색상"을 만듭니다.
		Menu menu_color = new Menu("DrawColor");

		// 부메뉴 "선", "사각형", "원"을 만들어요
		MenuItem draw_line = new MenuItem("Line");
		MenuItem draw_rect = new MenuItem("Rect");
		MenuItem draw_oval = new MenuItem("Oval");
		
		//"그리기색상"의 부메뉴 "빨강","파랑","초록"을 만들어요
		MenuItem color_red = new MenuItem("Red");
		MenuItem color_blue = new MenuItem("Blue");
		MenuItem color_green = new MenuItem("Green");	
		
		// 주메뉴 "그리기도구"에 부메뉴 "선", "사각형", "원"을 담아요
		menu_draw.add(draw_line);
		menu_draw.add(draw_rect);
		menu_draw.add(draw_oval);
		
		//주메뉴 "그리기색상"에 부메뉴 "빨강","파랑","초록"을 담아요
		menu_color.add(color_red);
		menu_color.add(color_blue);
		menu_color.add(color_green);
		
		//  주메뉴 "그리기도구"를 메뉴바에 담아요
		mb.add(menu_draw);

		//주메뉴 "그리기색상"을 메뉴바에 담아요
		mb.add(menu_color);		
		
		// Frame에 메뉴바를 설정하는 메소드
		setMenuBar(mb);
		
		setSize(400, 300);
		setVisible(true);
		
		draw_line.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawType = 0;
			}
		});
		
		draw_rect.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawType = 1;
			}
		});
		
		draw_oval.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawType = 2;
			}
		});
		
		color_red.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawColor = Color.red;
			}
		});
		color_blue.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawColor = Color.blue;
			}
		});
		color_green.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dp.drawColor = Color.green;
			}
		});
		
	}
}
package com.kosta.grimpan;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

public class DrawPanel extends Panel implements MouseListener {

	ArrayList<GraphicInfo> list = new ArrayList<GraphicInfo>();

	int x1, y1, x2, y2;
	
	// 그리기 도구를 위한 멤버변수
	int drawType; 
	
	// 그리기 색상을 위한 멤버변수
	Color drawColor; 	
	
	public DrawPanel() { 
		list = new ArrayList<GraphicInfo>();
		addMouseListener(this);
	}

	@Override
	public void paint(Graphics g) {	
	    int x, y, width, height;
	    
		// info에 들어있는 drawType에 따라 해당 그래픽을 그리도록 출력하기  	
		for(GraphicInfo info : list) {
			
			g.setColor(info.getDrawColor());
			
			x = info.getX1();
			y = info.getY1();
			width = info.getX2() - info.getX1();
			height = info.getY2() - info.getY1();		
    			if(info.getX2() < info.getX1()) {
    				x = info.getX2();
    				width = info.getX1() - info.getX2();
    			}
    			if(info.getY2() < info.getY1()) {
    				y = info.getY2();
    				height = info.getY1() - info.getY2();
    			}
    			switch(info.getDrawType()) {
    				case 0: g.drawLine(info.getX1(), info.getY1(), info.getX2(), info.getY2()); break;
    				case 1: g.drawRect(x, y, width, height); break;
    				case 2: g.drawOval(x, y, width, height); break;
    			}
    		}
	    }

	@Override
	public void mouseClicked(MouseEvent e) {
	}

	@Override
	public void mousePressed(MouseEvent e) {
		x1 = e.getX();
		y1 = e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		x2 = e.getX();
		y2 = e.getY();
		
		list.add(new GraphicInfo(x1, y1, x2, y2, drawType, drawColor));
		
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}
}
package com.kosta.grimpan;

public class GrimpanTest {

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

오류가 났었눈데 ~ drawColor type을 Color로 써야하눈데 자꾸 int로 쓰겠다했더니 난거였다 ㅎ,ㅎ,,

 

<< 파일 입출력 >>

프로그램 실행한 결과를 화면에 출력하면 컴퓨터가 종료되면 그 결과가 사라지게 됩니다 (휘발성)

만약에 프로그램 실행한 결과를 영구적으로 보관(저장) 하려면 파일을 이용할 수 있어요

 

또, 프로그램 실행에 필요한 데이터를 키보드부터 입력받지 않고 파일로부터 입력 받을 수도 있어요

 

"입출력"은 컴퓨터 메모리 입장에서 "입력"이고 "출력"입니다

프로그램 실행한 결과 즉 메모리의 내용을 파일로 "출력"

파일로부터 컴퓨터 메모리로 읽어 들이기 "입력"

 

자바는 이러한 "입출력"을 위하여 java.io 패키지에 관련 클래스들을 만들어 두었어요

 

입출력(스트림)

==> 스트림

==> 순서가 있는 자료의 흐름

==> 보통, 다른 프로그래밍에서는 출력하려는 대상에 따라 

       그것이 파일인가? 혹은 프린터인가 네트워크인가에 따라서

       출력방법이 달라지고 프로그램이 복잡해져요

 

       자바에서는 출력대상이 무엇이라도 동일한 방식으로

       사용 할 수 있도록 만들어 두었습니다

       ==> 그것을 "스트림"이라고 합니다

 

입출력 형태

    - 문자단위의 입출력

        Reader : 문자단위의 입력을 위한 제일 조상 

        Writer : 문자단위의 출력을 위한 제일 조상

 

    - 바이트단위의 입출력

        InputStream : 바이트단위의 입력을 위한 제일 조상

        OutputStream : 바이트단위의 출력을 위한 제일 조상

 

[Class FileWriter]

    java.lang.Object

        java.io.Writer

            java.io.OutputStreamWriter

                 java.io.FileWriter

 

프로그램 실행한 결과를 문자단위로 파일로 출력하려면

Writer의 후손클래스인 FileWriter를 이용할 수 있어요

 

/원하는 형태로 저장 하 ㄹ수 있다/

package com.kosta.file;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

// 어떤 사람의 이름, 주소, 전화를 입력받아 출력하는 프로그램
public class FileTest01 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String name, addr, phone;
		System.out.print("이름 : ");
		name = sc.next();
		System.out.print("주소 : ");
		addr = sc.next();
		System.out.print("번호 : ");
		phone = sc.next();
		
		try {
			// c:/data라는 폴더가 있어야한다
			FileWriter fw = new FileWriter("c:/data/info.txt");
            
			fw.write("이름 : " + name + "\n");
			fw.write("주소 : " + addr + "\n");
			fw.write("폰 : " + phone + "\n");
			fw.close();
			System.out.println("파일이 생성 되었습니다.");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

/기존 파일에 내용 추가하기/

package com.kosta.file;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

// 어떤 사람의 이름, 주소, 전화를 입력받아 출력하는 프로그램
public class FileTest01 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String name, addr, phone;
		System.out.print("이름 : ");
		name = sc.next();
		System.out.print("주소 : ");
		addr = sc.next();
		System.out.print("번호 : ");
		phone = sc.next();
		
		try {
			// c:/data라는 폴더가 있어야한다
			
			// 파일을 생성하면 기본적으로 기존의 파일을 덮어쓰기 합니다
			// FileWriter fw = new FileWriter("c:/data/info.txt");
			
			//파일 생성시에 두번째 매개변수(append mode)에 true 주면 
			// 그 파일이 없다면 새로 만들어주고 그 파일이 이미 있다면 내용을 추가 해 줍니다
			FileWriter fw = new FileWriter(("c:/data/info.txt"), true);
			fw.write("이름 : " + name + "\n");
			fw.write("주소 : " + addr + "\n");
			fw.write("폰 : " + phone + "\n");
			fw.close();
			System.out.println("파일이 생성 되었습니다.");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

/파일의 내용 한글자만 읽기/

package com.kosta.grimpan;

import java.io.FileNotFoundException;
import java.io.FileReader;

// c:/data/info.txt 파일의 내용을 한글자(메모리)로 읽어 들여 화면에 출력하는 프로그램을 만들어 봅시다
public class FileReaderTest {

	public static void main(String[] args) {
		try {
			FileReader fr = new FileReader("c:/data/info.txt");
			int ch;
			ch = fr.read();
			System.out.println((char)ch);
			fr.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

/파일의 내용 모두 읽기/

package com.kosta.grimpan;

import java.io.FileNotFoundException;
import java.io.FileReader;

// c:/data/info.txt 파일의 내용을 모두 읽어 들여 화면에 출력하는 프로그램을 만들어 봅시다
public class FileReaderTestAll {

	public static void main(String[] args) {
		try {
			FileReader fr = new FileReader("c:/data/info.txt");
			int ch;
			while(true) {
				ch = fr.read();
				// 파일의 끝에 도달하면
				if(ch == -1) {
					break;
				}
				System.out.println((char)ch);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}
package com.kosta.grimpan;

import java.io.FileNotFoundException;
import java.io.FileReader;

// c:/data/info.txt 파일의 내용을 모두 읽어 들여 화면에 출력하는 프로그램을 만들어 봅시다
public class FileReaderTestAll2 {

	public static void main(String[] args) {
		try {
			FileReader fr = new FileReader("c:/data/info.txt");
			int ch;
			while((ch = fr.read()) != -1) {
				System.out.print((char)ch);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}
package com.kosta.grimpan;

import java.io.FileNotFoundException;
import java.io.FileReader;

// c:/data/info.txt 파일의 내용을 모두 읽어 들여 화면에 출력하는 프로그램을 만들어 봅시다
public class FileReaderTestAll2 {

	public static void main(String[] args) {
		try {
			FileReader fr = new FileReader("c:/data/info.txt");
			int ch;
			String data = "";
			
			// -1이면 탈출한다
			while((ch = fr.read()) != -1) {
				data += (char)ch;
			}
			System.out.println(data);
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}

 

/그림판 열기, 저장 만들기/

생성자에서 implements Serializable 해주기

public class GraphicInfo implements Serializable{
	private int x1;
	private int y1;
	private int x2;
	private int y2;
	private int drawType;
	private Color drawColor;
}
public class MyFrame extends Frame {
	DrawPanel dp;
	
	public MyFrame() {
		dp = new DrawPanel();
		
		add(dp);
		
		// 메뉴바를 생성합니다
		MenuBar mb = new MenuBar();
		
		// 주메뉴 "그리기도구"를 만듭니다
		Menu menu_draw = new Menu("DrawType");
		
		//주메뉴 "그리기색상"을 만듭니다.
		Menu menu_color = new Menu("DrawColor");

		//주메뉴 "파일"을 만듭니다
		Menu menu_file = new Menu("File");
		
		// 부메뉴 "선", "사각형", "원"을 만들어요
		MenuItem draw_line = new MenuItem("Line");
		MenuItem draw_rect = new MenuItem("Rect");
		MenuItem draw_oval = new MenuItem("Oval");
		
		//"그리기색상"의 부메뉴 "빨강","파랑","초록"을 만들어요
		MenuItem color_red = new MenuItem("Red");
		MenuItem color_blue = new MenuItem("Blue");
		MenuItem color_green = new MenuItem("Green");	
		
		MenuItem file_open = new MenuItem("Open"	); 
		MenuItem file_save = new MenuItem("Save"); 
				
		// 주메뉴 "그리기도구"에 부메뉴 "선", "사각형", "원"을 담아요
		menu_draw.add(draw_line);
		menu_draw.add(draw_rect);
		menu_draw.add(draw_oval);
		
		//주메뉴 "그리기색상"에 부메뉴 "빨강","파랑","초록"을 담아요
		menu_color.add(color_red);
		menu_color.add(color_blue);
		menu_color.add(color_green);
		
		menu_file.add(file_open);
		menu_file.add(file_save);
		
		//  주메뉴 "그리기도구"를 메뉴바에 담아요
		mb.add(menu_draw);
		
		//주메뉴 "그리기색상"을 메뉴바에 담아요
		mb.add(menu_color);		
		
		mb.add(menu_file);
		
		// Frame에 메뉴바를 설정하는 메소드
		setMenuBar(mb);

		setSize(400, 300);
		setVisible(true);
		
		file_save.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					/*
					우리가 그린 그래픽의 모든 정보는 패널의 리스트에 담겨있어요
					그래서 파일로 출력할 내용은 바로 리스트입니다
					자바에는 객체단위로 입출력을 위하여
					ObjectIutputStream과 ObjectIutputStream을 만들어 두었습니다
					
					객체단위의 출력을 위한 ObjectOutputStream객체를 생성합니다
					이때 생성시에 FileOutStream의 객체를 매개변수로 전달하여
					생성할 파일의 위치와 이름을 알려줍니다
					*/
					ObjectOutputStream oos = 
						new ObjectOutputStream(new FileOutputStream("c:/data/bus.pan"));
					
					//ObjectOutputStream 객체 oos로 통해서 리스트를 출력합니다
					oos.writeObject(dp.list);
					
					//파일의 사용이 끝나면 파일을 닫아 줍니다
					oos.close();
					
					System.out.println("파일을 생성하였습니다.");
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		
		// 파일열기에 대한 이벤트
		file_open.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 객체단위로 읽어들기 위한 OnjectInputStream을 생성
				try {
					ObjectInputStream ois = 
						new ObjectInputStream(new FileInputStream( "c:/data/bus.pan"));
					
					// 파일로부터 객체를 읽어들여 패널의 리스트에 담아요
					dp.list = (ArrayList<GraphicInfo>)ois.readObject();
					
					// 패널의 리스트에 담긴만큼 그래픽을 그리기 위하여 repaint를 요청한다
					dp.repaint();
					
					// 파일의 사용이 끝나면 담아줍니다
					ois.close();
					
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} 
			}
		});
	}
}

 

- 오늘 학습한 내용에 대하여 요약 및 정리하고 이해가 되지 않는 부분은 질문을 통해 이해하고 넘어가도록 합니다

- 요약 및 정리가 다 된 사람들은 "메모장" 프로그램을 만들어 봅니다

  TextArea 컴포넌트를 이용합니다

- 숙제

  pdf "컬렉션 프레임워크"의 PROGRAMMING 11번, LAB 2번 중에서 하나 이상을 택하여 프로그래밍 해 봅니다

/*
PROGRAMMING 11.
Map을 사용하여서 영어 사전을 구현하여 보자. 사용자가 단어를 입력하면 단어의 설명을 보여준다.
사전에 단어를 추가하거나 검색, 삭제할 수 있는 간단한 메뉴 시스템을 만든다.
*/
package com.kosta.exam01;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class HomeWork {
	
	public static Scanner sc = new Scanner(System.in);
	
	// 메뉴
	public static void menu() {
		System.out.println("[1] 추가 [2] 검색 [3] 삭제 [0] 종료");
		System.out.println("메뉴를 선택하세요 : ");
	}
	
	// 추가
	public static void insertEng(Map<String, String> map) {
		String word, mean;
		
		System.out.println("단어 추가 : ");
		word = sc.next();
		System.out.println("설명 추가 : ");
		mean = sc.next();
		
		map.put(word, mean);
		System.out.println("추가하였습니다.");
	}
	
	// 검색
	public static void searchEng(Map<String, String> map) {
		String word;
		
		System.out.println("단어 검색 : ");
		word = sc.next();
		
		if(map.containsKey(word)) {
			System.out.printf("%s : %s\n", word, map.get(word));
		}else {
			System.out.println("존재하지 않습니다.");
		}
	}
	
	// 삭제
	public static void deleteEng(Map<String, String> map) {
		String word;
		
		System.out.println("단어 삭제 : ");
		word = sc.next();
		
		map.remove(word);
		System.out.println("삭제되었습니다.");
		
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Map<String, String> map = new HashMap<String, String>();

		int sel;
		
		while(true) {
			menu();
			sel = sc.nextInt();
			if(sel == 0) {
				break;
			}
			switch(sel) {
			case 1: insertEng(map); break;
			case 2: searchEng(map); break;
			case 3: deleteEng(map); break;
			}
		}
		System.out.println("** 프로그램 종료 **");
	}
}

'📖' 카테고리의 다른 글

day 0528 StringAndStringBuffer_예외처리  (1) 2024.05.28
day 0527 문자열  (0) 2024.05.27
day 0523 컬렉션  (0) 2024.05.23
day 0522 인터페이스  (0) 2024.05.22
day 0521 추상클래스_추상메소드  (0) 2024.05.21