• 내부 클래스 이용해서 리스트 출력(ListTest2)

 

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package swingTest;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.List; //util에 있는 List는 Arraylist
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
 
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class ListTest2 extends JFrame{
    private JTextField tf;
    private JTextArea ta;
    private List list;
    private JCheckBox cb;
    
    public ListTest2() { //생성자 만들기
        setTitle("List 예제");
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel p1=new JPanel();
        tf=new JTextField(15);
        JButton btn=new JButton("추가");
        cb=new JCheckBox("다중선택");
        p1.setBackground(Color.DARK_GRAY);
        p1.add(tf); p1.add(btn); p1.add(cb);
        
        JPanel p2=new JPanel(new GridLayout(1,2));
        list=new List();
        ta=new JTextArea();
        p2.add(list); p2.add(ta);
        ActionH ah=new ActionH();
        ItemH ih=new ItemH();
        btn.addActionListener(ah); //연결
        tf.addActionListener(ah); //엔터쳐도 값 들어감
        list.addItemListener(ih); //연결
        cb.addItemListener(ih); //연결
        
        add(BorderLayout.NORTH,p1);
        add(BorderLayout.CENTER,p2);
        
        setSize(400,400);
        setVisible(true);
        
        
    }
    
    public static void main(String[] args) {
        new ListTest2(); //생성자 부르기
    }
    //ActionH
    class ActionH implements ActionListener{
 
        
        public void actionPerformed(ActionEvent e) {
            if(tf.getText().isEmpty()) return;
            list.add(tf.getText());
            tf.setText(""); //비우기
        }
        
    }
    //ItemH
    class ItemH implements ItemListener{
 
        public void itemStateChanged(ItemEvent e) {
            Object obj=e.getSource();
            if(obj==list) { //list가 이벤트 발생
                ta.setText("");
                if(list.isMultipleMode()) { //리스트가 다중선택
                    String []arr=list.getSelectedItems();
                    for(int i=0;i<arr.length;i++) {
                        ta.append(arr[i]+"\n");
                    }
                }else { //리스트가 단일선택
                    //리스트(list)에서 선택한 내용을 textarea(ta)에 출력하기
                    ta.setText(list.getSelectedItem());
                }
            }else if(obj==cb) { //checkbox가 이벤트 발생
                if(cb.isSelected()) { //checkbox 선택인지->리스트가 다중모드
                    list.setMultipleMode(true);
                }else { //checkbox 해제인지->리스트가 단일모드
                    list.setMultipleMode(false);
                }
            }
        }
        
        
    }
}
cs

 

  • 내부 클래스를 이용하여 바나나 체크, 오렌지 체크 프레임 만들기

  • 클래스를 나눠서 사용하면 전역 변수를 쓸 수 없음. 그래서 내부 클래스, 어노니머스 클래스가 필요

  • 내부 클래스의 장점: 부모 클래스의 전역변수를 마치 제 것처럼 쓸 수 있음 (부모 클래스$자신의 클래스 이름으로 표시)

  • 내부 클래스를 이용하여 바나나 체크, 오렌지 체크 프레임 만들기

    • 내부 클래스의 장점: 부모 클래스의 전역변수를 마치 제 것처럼 쓸 수 있음 (부모 클래스$자신의 클래스 이름으로 표시)

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
package swingTest;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.List;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
 
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
 
public class CheckBoxTest_inner2 extends JFrame{
    private JCheckBox cb1;
    private JCheckBox cb2;
    private JTextArea ta;
    private JPanel p1;
    private JPanel p2;
    
    public CheckBoxTest_inner2() {
        setTitle("CheckBoxTest_inner2");
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        p1=new JPanel();
        cb1=new JCheckBox("바나나");
        cb2=new JCheckBox("오렌지");
        ta=new JTextArea();
        JScrollPane jsp=new JScrollPane(ta); //만약 매개변수가 10개 20개라면?
        p1.add(cb1); p1.add(cb2);
        
        ItemEventH2 ih=new ItemEventH2();
        cb1.addItemListener(ih);
        cb2.addItemListener(ih);
        
        add(BorderLayout.NORTH,p1);
        add(BorderLayout.CENTER,jsp);
        
        setSize(500,400);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new CheckBoxTest_inner2();
    }
    
    class ItemEventH2 implements ItemListener{
 
        @Override
        public void itemStateChanged(ItemEvent e) {
            JCheckBox cb=(JCheckBox)e.getSource();
            if(cb.isSelected()) {
                ta.append(cb.getText()+"선택\n");
                ta.setBackground(Color.green);
            }else {
                ta.append(cb.getText()+"선택해제\n");
                ta.setBackground(Color.white);
            }
        }
        
        
    }
    
}
cs

 

 

 

  • 체크박스 테스트 클래스
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
package swingTest;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.List;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
 
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
 
public class CheckBoxTest_inner extends JFrame{
    private JCheckBox cb1;
    private JCheckBox cb2;
    private JTextArea ta;
    private JPanel p1;
    private JPanel p2;
    
    public CheckBoxTest_inner() {
        setTitle("CheckBoxTest_inner");
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        p1=new JPanel();
        cb1=new JCheckBox("바나나");
        cb2=new JCheckBox("오렌지");
        ta=new JTextArea();
        JScrollPane jsp=new JScrollPane(ta); //만약 매개변수가 10개 20개라면? 
        p1.add(cb1); p1.add(cb2); 
        
        ItemEventH ih=new ItemEventH(ta); //매개변수를 이용하여 연결 시킴
        cb1.addItemListener(ih);
        cb2.addItemListener(ih);
        
        add(BorderLayout.NORTH,p1);
        add(BorderLayout.CENTER,jsp);
        
        setSize(500,400);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new CheckBoxTest_inner();
    }
    
    
}
 
cs

 

 


  • 아이템이벤트 클래스

 

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 swingTest;
 
import java.awt.Color;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
 
import javax.swing.JCheckBox;
import javax.swing.JTextArea;
 
public class ItemEventH implements ItemListener{
    JTextArea ta;
    public ItemEventH(JTextArea ta) {
        this.ta=ta;
    }
 
 
    @Override
    public void itemStateChanged(ItemEvent e) {
        JCheckBox cb=(JCheckBox)e.getSource();
        if(cb.isSelected()) {
            ta.append(cb.getText()+"선택\n");
            ta.setBackground(Color.green);
        }else {
            ta.append(cb.getText()+"선택해제\n");
            ta.setBackground(Color.white);
        }
    }
    
}
 
cs
  • 바나나 선택, 오렌지 선택 체크박스 만들고 리스트에 체크한대로 글자 출력, 배경색상 바꾸기 (CheckBoxTest)

    • 메인함수에 생성자 부르기

    • 생성자 만들기

      • 프레임 제목은 CheckBoxTest

      • 레이아웃은 BorderLayout

      • 닫았을때 프레임이 종료되도록 setDefaultColoseOpration 부르기

 

      • 패널1 생성

      • 체크박스2개 (바나나, 오렌지) 생성

      • 패널1에 체크박스 2개 붙이기

 

      • 패널 2 생성 (리스트가 붙을 것이고 화면에 꽉 채울 것이므로 GridLayout을 매개변수로.

      • 리스트 생성

      • 패널 2에 리스트 붙이기

 

      • 체크박스와 리스트는 ITemListener임. 체크박스 두개와 리스트에 addITemLister 메소드 생성

 

      • add(BorderLayout.North,패널1);

      • add(BorderLayout.Center,패널2);

 

      • 프레임 사이즈 주기

      • 프레임 보이도록 하기

 

      • 체크박스와 리스트는 itemStateChanged 메소드를 생성해줘야함. 아이템 이벤트 e는 JCheckBox형의 cb 객체에 넣음 (오브젝트형의 obj 개체로 안만들어도 됨. 아까는 체크박스 외에도 있었으니까)

      • 바나나 선택, 바나나 선택해제, 오렌지 선택, 오렌지 선택해제 총 4가지의 선택지가 있음. cb가 선택되었다면 (isSelected()) => 리스트에 체크박스의 글자(바나나, 오렌지)에 "선택"을 더해서  붙이던지, "선택해제"를 더해서 리스트에 붙이던지 if/else문으로 나누면 됨

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
package swingTest;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.List;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class CheckBoxTest extends JFrame implements ItemListener {
     private JCheckBox cb1;
     private JCheckBox cb2;
     private JTextArea ta;
     private JPanel p1;
     private JPanel p2;
     
     public CheckBoxTest() {
          setTitle("CheckBoxTest");
          setLayout(new BorderLayout());
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          
          p1=new JPanel();
          cb1=new JCheckBox("바나나");
          cb2=new JCheckBox("오렌지");
          ta=new JTextArea();
          JScrollPane jsp=new JScrollPane(ta);
          p1.add(cb1); p1.add(cb2);
          
          cb1.addItemListener(this);
          cb2.addItemListener(this);
          
          add(BorderLayout.NORTH,p1);
          add(BorderLayout.CENTER,jsp);
          
          setSize(500,400);
          setVisible(true);
     }
     
     public static void main(String[] args) {
          new CheckBoxTest();
     }
     
     @Override
     public void itemStateChanged(ItemEvent e) {
          JCheckBox cb=(JCheckBox)e.getSource();
          if(cb.isSelected()) {
              ta.append(cb.getText()+"선택\n");
              ta.setBackground(Color.green);
          }else {
              ta.append(cb.getText()+"선택해제\n");
              ta.setBackground(Color.white);
          }
     }
}
cs

  • TextField에 입력한 값을 추가 버튼을 눌렀을때 TextArea에 나타내기. (다중선택 가능) (ListTest)

    • 메인함수에 생성자 부르기 

    • 생성자 만들고 setTitle로 제목 짓기, BorderLayout으로 원하는 컴포넌트들 배치할 수 있도록 하기, X버튼 눌렀을때 종료되도록 하기

    • 패널 생성하고 텍스트필드 만들기, 추가 버튼 생성, 다중선택 체크박스 생성, 패널의 색상 그레이색으로, 패널에 텍스트필드, 버튼, 체크박스 붙이기

    • 패널 2 생성하고 그리드 레이아웃(행, 열)을 매개변수로 주기, 리스트 생성(패널에 리스트 추가), 리스트에 출력되는 값들을 TextArea에 나오도록 TextArea생성, 패널2에 리스트와 TextArea붙이기

    • 버튼에 액션을 주기위해 액션리스터 연결하기

    • BorderLayout의 North에 패널 1 붙이기, Center에 패널 2 붙이기

    • 프레임의 사이즈 정하고 프레임이 나오도록하기

    • 만약에 텍스트필드에 공백을 넣는다면? 

    • 리스트에는 텍스트 필드에 쓴 값을 붙이기

    • 텍스트 필드 비우기 (공백주기)

    • 체크박스를 누르는건 아이템이벤트, 아이템리스너 (버튼은 액션이벤트 액션리스너)

    • 이벤트를 발생한객체를 구분하여 (체크박스인지 리스트인) if문 적어주고 또 그 안에서 리스트가 다중선택인지 아닌지, 체크박스 선택인지 해제인지 나누기

 

 

 

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
85
86
87
88
89
90
91
92
93
package swingTest;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.List; //util에 있는 List는 Arraylist
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
 
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class ListTest extends JFrame implements ActionListener, ItemListener{
    private JTextField tf;
    private JTextArea ta;
    private List list;
    private JCheckBox cb;
    
    public ListTest() { //생성자 만들기
        setTitle("List 예제");
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel p1=new JPanel();
        tf=new JTextField(15);
        JButton btn=new JButton("추가");
        cb=new JCheckBox("다중선택");
        p1.setBackground(Color.DARK_GRAY);
        p1.add(tf); p1.add(btn); p1.add(cb);
        
        JPanel p2=new JPanel(new GridLayout(1,2));
        list=new List();
        ta=new JTextArea();
        p2.add(list); p2.add(ta);
        
        btn.addActionListener(this); //연결
        tf.addActionListener(this); //엔터쳐도 값 들어감
        list.addItemListener(this); //연결
        cb.addItemListener(this); //연결
        
        add(BorderLayout.NORTH,p1);
        add(BorderLayout.CENTER,p2);
        
        setSize(400,400);
        setVisible(true);
        
        
    }
    
    public static void main(String[] args) {
        new ListTest(); //생성자 부르기
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
//        if(tf.getText().length()==0) return;
        if(tf.getText().isEmpty()) return
        list.add(tf.getText());
        tf.setText(""); //비우기
        
    }
 
    @Override
    public void itemStateChanged(ItemEvent e) {
        //이벤트를 발생한 객체를 구분 (체크박스인지 리스트인지)
        Object obj=e.getSource();
        if(obj==list) { //list가 이벤트 발생
            ta.setText("");
            if(list.isMultipleMode()) { //리스트가 다중선택
                String []arr=list.getSelectedItems();
                for(int i=0;i<arr.length;i++) {
                    ta.append(arr[i]+"\n");
                }
            }else { //리스트가 단일선택
                //리스트(list)에서 선택한 내용을 textarea(ta)에 출력하기
                ta.setText(list.getSelectedItem());
            }
        }else if(obj==cb) { //checkbox가 이벤트 발생
            if(cb.isSelected()) { //checkbox 선택인지->리스트가 다중모드
                list.setMultipleMode(true);
            }else { //checkbox 해제인지->리스트가 단일모드
                list.setMultipleMode(false);
            }
        }
    }
}
 
cs

 

 

  • BorderLayout 이용하여 계산기 만들기
  • BorderLayout: North, South, Center, East, West

 

 

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
package swingTest;
 
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
public class CalTest_Border extends JFrame implements ActionListener {
    private JTextField tf1, tf2, tf3;
    
    public CalTest_Border() {
        setTitle("계산기 BorderLayout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        
        JPanel p1=new JPanel();
        JPanel p2=new JPanel();
        JPanel p3=new JPanel();
        
        tf1=new JTextField(5); //숫자 1
        tf2=new JTextField(5); //숫자 2
        tf3=new JTextField(15); //결과
        
        JButton b1=new JButton("+");
        JButton b2=new JButton("-");
        JButton b3=new JButton("*");
        JButton b4=new JButton("/");
        
        p1.add(new JLabel("숫자1"));
        p1.add(tf1);
        p1.add(new JLabel("숫자2"));
        p1.add(tf2);
        p2.add(b1); p2.add(b2); p2.add(b3); p2.add(b4);
        p3.add(new JLabel("결과"));
        p3.add(tf3);
        
        add(BorderLayout.NORTH,p1);
        add(BorderLayout.CENTER,p2);
        add(BorderLayout.SOUTH,p3);
        
        b1.addActionListener(this);
        b2.addActionListener(this);
        b3.addActionListener(this);
        b4.addActionListener(this);
        
        setSize(400,200);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new CalTest_Border();
    }
    
    
    @Override
    public void actionPerformed(ActionEvent e) {
        String str=e.getActionCommand();
        try {
        int a= Integer.parseInt(tf1.getText());
        int b= Integer.parseInt(tf2.getText());
        
        switch(str) {
        case "+" : tf3.setText(String.valueOf(a+b)); break;
        case "-" : tf3.setText(a-b+""); break//문자를 더하면 자동적으로 문자로 바뀜
        case "*" : tf3.setText(a*b+""); break;
        case "/" : tf3.setText(a/b+""); break
            }
        }catch (NumberFormatException n) {
            tf3.setText("숫자를 입력하세요");
        }catch (ArithmeticException a) {
            tf3.setText("0으로 나눌 수 없습니다.");
        }
        
    }
    
}
 
cs

 

 

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
package swingTest;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class CalTest extends JFrame implements ActionListener {
     private JTextField tf1, tf2, tf3;
     
     public CalTest() {
          setTitle("계산기");
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setLayout(new FlowLayout());
          tf1=new JTextField(5); //숫자 1
          tf2=new JTextField(5); //숫자 2
          tf3=new JTextField(20); //결과
          
          JButton b1=new JButton("+");
          JButton b2=new JButton("-");
          JButton b3=new JButton("*");
          JButton b4=new JButton("/");
          
          b1.addActionListener(this);
          b2.addActionListener(this);
          b3.addActionListener(this);
          b4.addActionListener(this);
          
          add(new JLabel("숫자1"));
          add(tf1);
          add(new JLabel("숫자2"));
          add(tf2);
          add(b1); add(b2); add(b3); add(b4);
          add(new JLabel("결과"));
          add(tf3);
          
          setSize(700,100);
          setVisible(true);
     }
     
     public static void main(String[] args) {
          new CalTest();
     }
     
     
     @Override
     public void actionPerformed(ActionEvent e) {
          String str=e.getActionCommand();
          try {
          int a= Integer.parseInt(tf1.getText());
          int b= Integer.parseInt(tf2.getText());
          
          switch(str) {
          case "+" : tf3.setText(String.valueOf(a+b)); break;
          case "-" : tf3.setText(a-b+""); break//문자를 더하면 자동적으로 문자로 바뀜
          case "*" : tf3.setText(a*b+""); break;
          case "/" : tf3.setText(a/b+""); break;
              }
          }catch (NumberFormatException n) {
              tf3.setText("숫자를 입력하세요");
          }catch (ArithmeticException a) {
              tf3.setText("0으로 나눌 수 없습니다.");
          }
          
     }
     
}
cs

 

  • Swing 이용하여 컴포넌트 3개 만들어서 Field에서 글을 작성해서 버튼을 누르면 Area에 나타내기

 

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
package swingTest;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class SwingTest extends JFrame implements ActionListener{
     private JTextField tf1;
     private JTextArea ta;
     
     public SwingTest() {
          setTitle("연습");
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X표시를 누르면 JFrame 종료
          setLayout(new FlowLayout());
          tf1=new JTextField(20);
          JButton btn=new JButton("클릭");
          ta=new JTextArea(520);
          btn.addActionListener(this);
          add(tf1);
          add(btn);
          add(ta);
          setSize(500,500);
          setVisible(true);
          
     }
     
     public static void main(String[] args) {
          new SwingTest();
     }
     @Override
     public void actionPerformed(ActionEvent e) {
          ta.append(tf1.getText()+"\n");
          tf1.setText("");
          
     }
 
}
cs

 

 

 

  • 나라와 수도를 입력하고 퀴즈를 맞추는 CapitalTest클래스 만들기.

    • 메뉴선택, 입력 메소드, 퀴즈 메소드, 파일 저장 메소드 4개의 메소드를 구현한다.

    • 파일 저장은 FileWriter 클래스를 사용한다.

    • 랜덤변수 생성은 Math.random()메소드를 사용한다.

 

  • CapitalTest 클래스 (CapitalTest)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.exam02;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class CapitalTest {
    public static Scanner sc=new Scanner(System.in);
    private Map<StringString>map=new HashMap<StringString>();
    File dir, file;
    public CapitalTest() {
        dir=new File("src\\com\\exam02");
        file=new File(dir,"CapitalTest.txt");
        map.clear();
        try {
        if(!file.exists()) {
            file.createNewFile();
            return;
        }
        Scanner scanner=new Scanner(file);
        while(scanner.hasNext()) {
            String country=scanner.next();
            String capital=scanner.next();
            map.put(country, capital);
        }
        scanner.close();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void showMenu() {
        System.out.println("****수도 맞추기 게임을 시작합니다.****");
        System.out.println("1.입력, 2.퀴즈, 3.파일저장 및 종료");
        System.out.println("선택>>");
    }
    
    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 quiz() {
        Set<String > set=map.keySet();
        Object[]arr=set.toArray();
        while(true) {
            int n=(int)(Math.random()*map.size());
            String city="";
            try{
                city=(String)arr[n];
            }catch(ArrayIndexOutOfBoundsException e) {
                System.out.println("map이 비어 있습니다.");
                return;
            }
            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 void save() {
        FileWriter fw=null;
        try {
            fw=new FileWriter(file);
            Set<String> set=map.keySet();
            Iterator<String>it=set.iterator();
            while(it.hasNext()) {
                String key=it.next();
                String value=map.get(key);
                fw.write(key+" ");
                fw.write(value+"\n");
            }
            fw.close();
            System.out.println("종료");
            System.exit(0);
        }catch (IOException x) {
            x.printStackTrace();
            System.out.println("파일저장 오류");
        }
    }
    
    public static void main(String[] args) {
        CapitalTest ca=new CapitalTest();
        while(true) {
            CapitalTest.showMenu();
            int choice=CapitalTest.sc.nextInt();
            switch(choice) {
            case 1 : ca.input(); break;
            case 2 : ca.quiz(); break;
            case 3 : ca.save(); break;
            default : System.out.println("입력오류");          
            }
        }
    }
}
  • 이름, 학과, 학번, 학점 정보를 가진 Student클래스를 작성하라. ArrayList<Student> 컬렉션을 만들고, 사용자로부터 입력받아 저장하고, 학생 이름으로 검색하는 StudentManager 클래스를 작성하라.

    • com.exam01 패키지를 생성하고 Student, StudentManager 클래스 만들기. 

    • Student클래스에 멤버변수 선언

    • StudentManager에는 메뉴 입력 메소드, 학생정보 입력 메소드, 전체 학생 보기 메소드, 학생 찾는 메소드, 파일 저장 메소드 5가지를 생성.

    • 메뉴선택 메소드는 static을 사용

    • 학생입력 메소드는 한 라인으로 학생정보를 입력받아 ,로 구분하여 처리한다. (StringTokenizer 사용)

 

  • Student 클래스 (Student)
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
package com.exam01;
import java.io.Serializable;
public class Student implements Serializable{
    String name;
    String dept;
    int studentID;
    double avg;
    
    public Student(String name, String dept, int studentID, double avg) {
        this.name=name;
        this.dept=dept;
        this.studentID=studentID;
        this.avg=avg;
    }
    
    public String getName() {
        return name;
    }
    public String getDept() {
        return dept;
    }
    public int getStudentID() {
        return studentID;
    }
    public double getAvg() {
        return avg;
    }
}
 

 


 

  • StudentManager 클래스 (StudentManager)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.exam01;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.StringTokenizer;
//메뉴선택, 학생정보 입력, 입력한 학생 전체 목록 보기, 학생 이름으로 찾기, 파일로 저장하기 메소드
public class StudentManager {
    static Scanner sc=new Scanner(System.in);
    static ArrayList<Student>arr=new ArrayList<Student>();
    File dir,file;
    
    public StudentManager() throws IOException, ClassNotFoundException {
        dir=new File("src\\com\\exam01");
        file=new File(dir, "Student.txt");
        if(file.exists()) {
            ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
            arr=(ArrayList<Student>)ois.readObject();
        }else {
            file.createNewFile();
        }
    }
    
    public static void showMenu() {
        System.out.println("선택하세요");
        System.out.println("1.데이터입력");
        System.out.println("2.전체보기");
        System.out.println("3.학생찾기");
        System.out.println("4.종료");
        System.out.println("선택>>");
    }
    
    public void inputData() {
        while(true) {
            System.out.println("학생 이름,학과,학번,학점평균 입력하세요.(입력은 , 로 구분하고 종료는 x)");
            System.out.println(">>");
        try {
            String text=StudentManager.sc.nextLine();
            if(text.toLowerCase().equals("x")) {
                System.out.println("입력 종료");
                break;
            }
            StringTokenizer stk=new StringTokenizer(text,",");
            String name=stk.nextToken();
            String dept=stk.nextToken();
            int studentID=Integer.parseInt(stk.nextToken());
            double avg=Double.parseDouble(stk.nextToken());
            arr.add(new Student(name, dept, studentID, avg));
        }catch (NoSuchElementException n) {
            System.out.println("정확하게 입력하세요.");
            return;
            }
        }
    }
    
    public void viewData() {
        System.out.println("전체보기");
        for(Student student:arr) {
            System.out.println("이름: "+student.getName());
            System.out.println("학과: "+student.getDept());
            System.out.println("학번: "+student.getStudentID());
            System.out.println("학점평균: "+student.getAvg());
            System.out.println();
        }
    }
    
    public void searchData() {
        System.out.println("학생 찾기....");
        System.out.println("찾을 학생 이름>>");
        String searchName=StudentManager.sc.next();
        Student s=search(searchName);
        if(s==null) {
            System.out.println("찾는 학생 없음");
            return;
        }
        System.out.println("이름: "+s.getName());
        System.out.println("학과: "+s.getDept());
        System.out.println("학번: "+s.getStudentID());
        System.out.println("학점평균: "+s.getAvg());
    }
    
    private Student search(String searchName) {
        for(int i=0;i<arr.size();i++) {
            if(searchName.equals(arr.get(i).getName())) { //arraylist는 get으로 접근, 크기는 size
                return arr.get(i);
            }
        }
        return null;
    }
    
    public void saveData() throws FileNotFoundException, ClassNotFoundException, EOFException, IOException  {
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(arr);
    }
    
    public static void main(String[] args) throws InputMismatchException, FileNotFoundException, ClassNotFoundException, IOException{
        StudentManager sm=new StudentManager();
        while(true) {
            StudentManager.showMenu();
            int num=sc.nextInt();
            sc.nextLine();
            switch(num) {
            case 1 : sm.inputData(); break;
            case 2 : sm.viewData(); break;
            case 3 : sm.searchData(); break;
            case 4 : sm.saveData();
                     System.out.println("프로그램 종료");
                     System.exit(0);
            default : System.out.println("입력오류");
            }
        }
    }
}

+ Recent posts