기존코드
SungJukView
package com.calcc;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
public class SungJukView implements ActionListener {
String col[] = { "이름", "오라클", "자바", "HTML", "총점", "평균", "학점", "석차" };
Calclogic cal = new Calclogic(this);
int p_num = 0;
DefaultTableModel dtm;
JTable table;
JScrollPane jsp;
JFrame jf_sungjuk = new JFrame();
JPanel jp_center = new JPanel();
JPanel jp_north = new JPanel();
JPanel jp_south = new JPanel();
JButton jbt_clear = new JButton("전체 삭제");
JButton jbt_selectDelRow = new JButton("선택 삭제");
JButton jbt_add = new JButton("추가");
JTextField jt_name = new JTextField(6);
JTextField jt_oracle = new JTextField(6);
JTextField jt_java = new JTextField(6);
JTextField jt_html = new JTextField(6);
JTextField total = new JTextField(6);
JTextField avg = new JTextField(6);
JTextField grade = new JTextField(6);
JTextField rank = new JTextField(6);
JButton jbt_process = new JButton("점수계산");
JButton jbt_exit = new JButton("종료");
public void initDisplay() {
System.out.println("initDisplay 호출성공");
jp_center.setLayout(new BorderLayout(0, 20));
jbt_clear.addActionListener(this);
jbt_selectDelRow.addActionListener(this);
jbt_process.addActionListener(this);
jbt_add.addActionListener(this);
jbt_exit.addActionListener(this);
jp_north.add(jbt_selectDelRow);
jp_north.add(jbt_clear);
jp_south.add(jt_name);
jp_south.add(jt_oracle);
jp_south.add(jt_java);
jp_south.add(jt_html);
jt_name.setText("");
jt_oracle.setText("");
jt_java.setText("");
jt_html.setText("");
jp_south.add(jbt_add);
jp_south.add(jbt_process);
jp_south.add(jbt_exit);
dtm = new DefaultTableModel(col,0);
table= new JTable(dtm);
jsp=new JScrollPane(table);
jp_center.add("Center",jsp);
jp_center.validate();
jf_sungjuk.setBackground(new Color(214, 211, 206));
jf_sungjuk.add("Center", jp_center);
jf_sungjuk.add("South", jp_south);
jf_sungjuk.add("North", jp_north);
jf_sungjuk.setSize(600, 400);
jf_sungjuk.setTitle("성적처리");
jf_sungjuk.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent ae) {
Object obj = ae.getSource();
if(obj==jbt_process)
{
cal.calcTable();
}
else if(obj==jbt_add)
{
String input[] = new String[col.length];
input[0]=jt_name.getText();
input[1]=jt_oracle.getText();
input[2]=jt_java.getText();
input[3]=jt_html.getText();
dtm.addRow(input);
jt_name.setText("");
jt_oracle.setText("");
jt_java.setText("");
jt_html.setText("");
}
else if(obj==jbt_selectDelRow)
{
if(table.getSelectedRow()==-1)
{
return;
}
else
{
dtm.removeRow(table.getSelectedRow());
}
}
else if(obj==jbt_clear)
{
for(int i = dtm.getRowCount(); i>0; i--)
{
dtm.removeRow(0);
}
}
else if(obj==jbt_exit)
{
System.exit(0);
}
}
public SungJukView()
{
initDisplay();
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
new SungJukView();
}
}
Calclogic
package com.calcc;
public class Calclogic {
SungJukView sv = null;
public Calclogic(SungJukView sv)
{
this.sv = sv;
}
public void calcTable() {
int total[] = new int[sv.dtm.getRowCount()];
for (int i = 0; i < total.length; i++) {
for (int j = 1; j <= 3; j++) {
System.out.println(total[i]);
total[i] += Integer.parseInt(sv.table.getValueAt(i, j).toString());
}
sv.table.setValueAt(total[i], i, 4);
}
double avg[] = new double[sv.dtm.getRowCount()];
for (int i = 0; i < avg.length; i++) {
avg[i] = (total[i] / 3.0);
sv.table.setValueAt(String.format("%.4f", avg[i]), i, 5);
if (90<avg[i])
{
String hint ="A+";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else if(85<avg[i] && avg[i] <= 90)
{
String hint ="A";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else if (75<avg[i] && avg[i]<=85)
{
String hint ="B+";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else if (65<avg[i] && avg[i]<=75)
{
String hint ="C+";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else if (55<avg[i] && avg[i]<=65)
{
String hint ="C";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else
{
String hint ="F";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
}
int rank[] = new int[sv.dtm.getRowCount()];
for (int i = 0; i < rank.length; i++) {
rank[i] = 1;
for (int j = 0; j < rank.length; j++) {
if (avg[i] < avg[j]) {
rank[i] += 1;
}
}
sv.table.setValueAt(rank[i], i, 7);
}
}
}
리팩토링 코드
SungJuckLogic
package com.ClassDiv2;
public class SungJuckLogic {
SungJukViewUI sv = null;
public SungJuckLogic(SungJukViewUI sungJukViewUI) {
this.sv = sungJukViewUI;
}
public void calcTable() {
int total[] = new int[sv.dtm.getRowCount()];
for (int i = 0; i < total.length; i++) {
for (int j = 1; j <= 3; j++) {
System.out.println(total[i]);
total[i] += Integer.parseInt(sv.table.getValueAt(i, j).toString());
}
sv.table.setValueAt(total[i], i, 4);
}
double avg[] = new double[sv.dtm.getRowCount()];
for (int i = 0; i < avg.length; i++) {
avg[i] = (total[i] / 3.0);
sv.table.setValueAt(String.format("%.4f", avg[i]), i, 5);
if (90<avg[i])
{
String hint ="A+";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else if(85<avg[i] && avg[i] <= 90)
{
String hint ="A";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else if (75<avg[i] && avg[i]<=85)
{
String hint ="B+";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else if (65<avg[i] && avg[i]<=75)
{
String hint ="C+";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else if (55<avg[i] && avg[i]<=65)
{
String hint ="C";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
else
{
String hint ="F";
sv.table.setValueAt(String.format("%s", hint), i, 6);
}
}
int rank[] = new int[sv.dtm.getRowCount()];
for (int i = 0; i < rank.length; i++) {
rank[i] = 1;
for (int j = 0; j < rank.length; j++) {
if (avg[i] < avg[j]) {
rank[i] += 1;
}
}
sv.table.setValueAt(rank[i], i, 7);
}
}
}
SungJuckViewEvent
package com.ClassDiv2;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SungJuckViewEvent implements ActionListener{
SungJukViewUI svu = null;
public SungJuckViewEvent(SungJukViewUI sungJukViewUI) {
this.svu = sungJukViewUI;
}
@Override
public void actionPerformed(ActionEvent ae) {
Object obj = ae.getSource();
if(obj==svu.jbt_process)
{
svu.sjl.calcTable();
}
else if(obj==svu.jbt_add)
{
String input[] = new String[svu.col.length];
input[0]=svu.jt_name.getText();
input[1]=svu.jt_oracle.getText();
input[2]=svu.jt_java.getText();
input[3]=svu.jt_html.getText();
svu.dtm.addRow(input);
svu.jt_name.setText("");
svu.jt_oracle.setText("");
svu.jt_java.setText("");
svu.jt_html.setText("");
}
else if(obj==svu.jbt_selectDelRow)
{
if(svu.table.getSelectedRow()==-1)
{
return;
}
else
{
svu.dtm.removeRow(svu.table.getSelectedRow());
}
}
else if(obj==svu.jbt_clear)
{
for(int i = svu.dtm.getRowCount(); i>0; i--)
{
svu.dtm.removeRow(0);
}
}
else if(obj==svu.jbt_exit)
{
System.exit(0);
}
}
}
SungJukViewUI
package com.ClassDiv2;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
public class SungJukViewUI {
String col[] = { "이름", "오라클", "자바", "HTML", "총점", "평균", "학점", "석차" };
int p_num = 0;
DefaultTableModel dtm;
JTable table;
JScrollPane jsp;
JFrame jf_sungjuk = new JFrame();
JPanel jp_center = new JPanel();
JPanel jp_north = new JPanel();
JPanel jp_south = new JPanel();
JButton jbt_clear = new JButton("전체 삭제");
JButton jbt_selectDelRow = new JButton("선택 삭제");
JButton jbt_add = new JButton("추가");
JTextField jt_name = new JTextField(6);
JTextField jt_oracle = new JTextField(6);
JTextField jt_java = new JTextField(6);
JTextField jt_html = new JTextField(6);
JTextField total = new JTextField(6);
JTextField avg = new JTextField(6);
JTextField grade = new JTextField(6);
JTextField rank = new JTextField(6);
JButton jbt_process = new JButton("점수계산");
JButton jbt_exit = new JButton("종료");
SungJuckLogic sjl = new SungJuckLogic(this);
SungJuckViewEvent sjve = new SungJuckViewEvent(this);
public void initDisplay() {
System.out.println("initDisplay 호출성공");
jp_center.setLayout(new BorderLayout(0, 20));
jbt_clear.addActionListener(sjve);
jbt_selectDelRow.addActionListener(sjve);
jbt_process.addActionListener(sjve);
jbt_add.addActionListener(sjve);
jbt_exit.addActionListener(sjve);
jp_north.add(jbt_selectDelRow);
jp_north.add(jbt_clear);
jp_south.add(jt_name);
jp_south.add(jt_oracle);
jp_south.add(jt_java);
jp_south.add(jt_html);
jt_name.setText("");
jt_oracle.setText("");
jt_java.setText("");
jt_html.setText("");
jp_south.add(jbt_add);
jp_south.add(jbt_process);
jp_south.add(jbt_exit);
dtm = new DefaultTableModel(col,0);
table= new JTable(dtm);
jsp=new JScrollPane(table);
jp_center.add("Center",jsp);
jp_center.validate();
jf_sungjuk.setBackground(new Color(214, 211, 206));
jf_sungjuk.add("Center", jp_center);
jf_sungjuk.add("South", jp_south);
jf_sungjuk.add("North", jp_north);
jf_sungjuk.setSize(600, 400);
jf_sungjuk.setTitle("성적처리");
jf_sungjuk.setVisible(true);
}
public static void main(String[] args) {
SungJukViewUI sju = new SungJukViewUI();
sju.initDisplay();
}
}
- 이번 코드는 클래스 쪼개기를 진행했다. MVC 패턴을 기반으로 진행했으며 아직 부족하다. 많은 오픈 소스를 보면서 분석해야겠다.