자바 - SungJukView 리팩토링

지환·2023년 10월 11일
0

JAVA

목록 보기
29/39
post-thumbnail

기존코드

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; // 입력 받을 사람수 저장할 변수

	//선언부 에서 SungJukView 생성자 생성
	
	DefaultTableModel dtm;
	JTable table; // = new JTable(value, col); 테이블
	JScrollPane jsp; // = new JScrollPane(table); 스크롤

	JFrame jf_sungjuk = new JFrame();
	// JFrame에 붙일 속지 두 개 선언하고 생성하기
	JPanel jp_center = new JPanel();
	// 배치-jp_center 속지 중앙에 배치하자
	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);            //디폴트 테이블 생성 col 배열에 있는 값들로 컬럼이름 하고, p_num만큼 밑에 행열 생성함
		table= new JTable(dtm);	                                    //테이블 생성(디폴트 테이블에 정해둔 값으로 생성됨)
		jsp=new JScrollPane(table);									//스크롤바 붙임
	    jp_center.add("Center",jsp);
	    jp_center.validate();
				
		jf_sungjuk.setBackground(new Color(214, 211, 206));

		// 속지 두 장을 JFrame에 붙이기
		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)
	{
		//p_num=dtm.getRowCount();     //계산할때 인원수는 현재 테이블의 행 숫자이므로
		cal.calcTable();
	}
	
	
	else if(obj==jbt_add)
	{
		String input[] = new String[col.length];    //사용자값 저장할 배열 선언, col배열길이만큼
		input[0]=jt_name.getText();       //이름 input[0]에 저장
		input[1]=jt_oracle.getText();      //오라클점수
		input[2]=jt_java.getText();        //자바점수
		input[3]=jt_html.getText();      //html점수
		
		dtm.addRow(input);
		
		 //입력값 저장 하고 나서 텍스트입력 칸 다시 초기화 해두기
		jt_name.setText("");                 
		jt_oracle.setText("");
		jt_java.setText("");
		jt_html.setText("");
		
		
	}
	
	else if(obj==jbt_selectDelRow)
	{	//테이블 선택했을때 .getSelectedRow() 메소드 값은 그 행의 값이 나오고
		//아무것도 선택 안되어잇을때는 -1을 전달함.
		if(table.getSelectedRow()==-1) //-1일때(아무것도 선택되지 않았을때
		{										 //if문 탈출할때 return;을 사용함	
			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; // NullPointException 방지
	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);
		      }
		    }
		 // 학점 구하기
		    /*
		     * 평균을 구해서 -> 90< x --> A+
		     * 85<x<=90 --> A
		     * 75<x<= 85 --> B+
		     * 65 < x <=75 ---> C+
		     * 55 < x <=65 ----> C
		     * else -->F
		     */
		    
		    
		    
		    // 석차 구하기
		    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);
		      }
		    }
		 // 학점 구하기
		    /*
		     * 평균을 구해서 -> 90< x --> A+
		     * 85<x<=90 --> A
		     * 75<x<= 85 --> B+
		     * 65 < x <=75 ---> C+
		     * 55 < x <=65 ----> C
		     * else -->F
		     */
		    
		    
		    
		    // 석차 구하기
		    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)
	{
		//p_num=dtm.getRowCount();     //계산할때 인원수는 현재 테이블의 행 숫자이므로
		svu.sjl.calcTable();
	}
	
	
	else if(obj==svu.jbt_add)
	{
		String input[] = new String[svu.col.length];    //사용자값 저장할 배열 선언, col배열길이만큼
		input[0]=svu.jt_name.getText();       //이름 input[0]에 저장
		input[1]=svu.jt_oracle.getText();      //오라클점수
		input[2]=svu.jt_java.getText();        //자바점수
		input[3]=svu.jt_html.getText();      //html점수
		
		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)
	{	//테이블 선택했을때 .getSelectedRow() 메소드 값은 그 행의 값이 나오고
		//아무것도 선택 안되어잇을때는 -1을 전달함.
		if(svu.table.getSelectedRow()==-1) //-1일때(아무것도 선택되지 않았을때
		{										 //if문 탈출할때 return;을 사용함	
			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));

		// 속지 두 장을 JFrame에 붙이기
		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 패턴을 기반으로 진행했으며 아직 부족하다. 많은 오픈 소스를 보면서 분석해야겠다.
profile
아는만큼보인다.

0개의 댓글