ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 객체지향(5) - UI코드의 분리
    JAVA 2021. 3. 17. 01:56

    www.youtube.com/watch?v=efMRwQwxmJM&list=PLq8wAnVUcTFX4E2NplMvJfqlcgAeF_BxK&index=10

    이번 포스팅도 위의 강의를 기반으로 작성하였습니다.

     

     

     

     

    지금까지 우리는 완벽한 캡슐화를 이루기 위해 걸어왔습니다.

     

    완벽할 줄 알 았던 캡슐화였지만 아쉽게도 나눌 부분이 또 한가지 발생합니다.

     

    강의 캡처

    바로 ExamList클래스에서 input() 함수와 print()함수에서의 역할이 2개의 부분으로 나눠집니다. 

    즉 효율적이지 못한 코드라는 것이죠!

     

    입/출력을 하는 플랫폼은  콘솔, 윈도우, 웹, 모바일이 있다고 합니다!

     

     

     

    따라서 오늘은  최종적으로 아래와 같은 모습을 만들겠습니다

     

     

     

    아래 코드에서 ------add---를 중심으로 윗 부분은 입력 부분입니다.

                     아래부분은 데이터를 추가하는 부분입니다 

    이부분을 함수로 따로 만들어 관리해 보도록 합시다.

     

     

    add(exam); 함수를 만들어 줍시다

     

     

     

     

     

     

     

    전체 코드!

     

    package part4.ex4.UI코드분리하기;
    
    import java.util.Scanner;
    
    public class ExamList {
    	private Exam[] exams;
    	private int current;
    	
    	  public void printList() {
    			printList(current);
    		}
    	 
    	 public void printList(int size) {
    		System.out.println("┌───────────────────────────┐");
    		System.out.println("             성적  출력         ");
    		System.out.println("└───────────────────────────┘");
    		System.out.println();
    
    		//int size = list.current;
    		Exam[] exams = this.exams;
    		
    		for (int i = 0; i < size; i++) {
    			Exam exam = this.get(i);//this.exams[i];
    			// 변수가 반복문 안에서 사용되어도 큰 문제 ㄴㄴ
    			int kor = exam.getKor();//exam.kor;
    			int eng = exam.getEng();
    			int math = exam.getMath();
    
    			int total = exam.total();//kor + eng + math; // exams[0].kor + ...
    			float avg = exam.avg();//total / 3.0f;
    
    			System.out.printf("국어 %d\n", kor);
    			System.out.printf("영어 %d\n", eng);
    			System.out.printf("수학 %d\n", math);
    
    			System.out.printf("총점 : %3d\n", total);
    			System.out.printf("평균 : %6.2f\n", avg);
    			System.out.println("─────────────────────────────");
    
    		}
    	 }
    	 
    
    	 private Exam get(int i) {
    		// TODO Auto-generated method stub
    		return this.exams[i];
    	}
    
    	public void inputList() {
    				Scanner scan = new Scanner(System.in);
    
    				System.out.println("┌────────────────────────────┐");
    				System.out.println("           성적  입력            ");
    				System.out.println("└────────────────────────────┘");
    				System.out.println();
    
    				int kor, eng, math;
    
    				do {
    					System.out.printf("국어:");
    					kor = scan.nextInt();
    
    					if (kor < 0 || 100 < kor)
    						System.out.println("국어성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    				} while (kor < 0 || 100 < kor);
    
    				do {
    					System.out.printf("영어:");
    					eng = scan.nextInt();
    
    					if (eng < 0 || 100 < eng)
    						System.out.println("영어성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    				} while (eng < 0 || 100 < eng);
    
    				do {
    					System.out.printf("수학:");
    					math = scan.nextInt();
    
    					if (math < 0 || 100 < math)
    						System.out.println("수학성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    				} while (math < 0 || 100 < math);
    
    				
    				/*
    				Exam exam = new Exam();
    				// 실제 국영수방을 만들어준다
    				exam.setKor(kor);//exam.kor = kor;
    				exam.setEng(eng);
    				exam.setMath(math);
    				*/
    				
    				
    				Exam exam = new Exam(kor, eng, math);
    
    				
    				//------------add------------------------
    				
    			
    				add(exam);
    				
    			}
    	 
    
    	private void add(Exam exam) {
    		Exam[] exams = this.exams;
    		int size = this.current;
    		
    		if(exams.length == this.current) {
    			Exam[] temp = new Exam[size + 5];
    			
    			for(int i=0; i<size;i++)
    				temp[i] = exams[i];
    			
    			exams = temp;
    		}
    		
    		exams[current] = exam;
    		current++;
    		
    	}
    
    	public void ExamList() {
    		
    		exams = new Exam[3];
    		current =0; 
    		
    	}
    
    }

     

     

    그 후, 

    입출력과 관련된 함수를 ExamConsole에 옮겨줍시다 

    printList(), inputList함수가 이에 해당 됩니다.

     

     

    옮겼더니 오류가 많이 발생합니다. 오류를 같이 수정해봅시다

     

    오류1
    오류2

    위와 같은 오류는 this를 이용하기 때문에 발생합니다. ExamList에서 옮겨왔기 때문에, this에 오류가 발생하는 것입니다.

     

    그래서 우리는 ExamConsole에 ExamList의 객체를 만들어 줄겁니다

     

     

     

    최종 코드 나가겠습니다

     

    객체 생성시  ExamList -> ExamConsole 부분이 바뀌었습니다. 

    왜냐면 이제 입출력이 ExamList의 역할이 아닌 ExamConsole이기 때문입니다.

    package part4.ex4.UI코드분리하기;
    
    import java.util.Scanner;
    
    public class Program {
    
    	public static void main(String[] args) {
    
    		ExamConsole list = new ExamConsole();
    
    
    		int menu;
    		boolean keepLoop = true;
    
    		while (keepLoop) {
    			menu = inputMenu();
    
    			switch (menu) {
    			case 1:
    				// ExamList.inputList(list);
    				// ExamList에 있는 inputList를 사용하겠다.
    				list.inputList();
    				break;
    			case 2:
    				list.printList();
    				break;
    
    			case 3:
    				System.out.println("Bye~");
    
    				keepLoop = false;
    				break;
    
    			default:
    				System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지 입니다.");
    			}
    		}
    	}
    
    	static int inputMenu() {
    		Scanner scan = new Scanner(System.in);
    
    		System.out.println("┌───────────────────────────┐");
    		System.out.println("│           메인 메뉴          │");
    		System.out.println("└───────────────────────────┘");
    		System.out.println("\t1. 성적입력 ");
    		System.out.println("\t2. 성적출력 ");
    		System.out.println("\t3. 종료 ");
    		System.out.println("\t선택> ");
    		int menu = scan.nextInt();
    
    		return menu;
    	}
    }

     

     

    package part4.ex4.UI코드분리하기;
    
    import java.util.Scanner;
    
    public class ExamList {
    	private Exam[] exams;
    	private int current;
    
    	public Exam get(int i) {
    		// TODO Auto-generated method stub
    		return this.exams[i];
    	}
    
    	public void add(Exam exam) {
    		Exam[] exams = this.exams;
    		int size = this.current;
    
    		if (exams.length == this.current) {
    			Exam[] temp = new Exam[size + 5];
    
    			for (int i = 0; i < size; i++)
    				temp[i] = exams[i];
    
    			exams = temp;
    		}
    
    		exams[current] = exam;
    		current++;
    
    	}
    
    	public void ExamList() {
    
    		exams = new Exam[3];
    		current = 0;
    
    	}
    
    	public int size() {
    		// TODO Auto-generated method stub
    		return current;
    	}
    
    }

     

     

    package part4.ex4.UI코드분리하기;
    
    import java.util.Scanner;
    
    public class ExamConsole {
    
    	private ExamList list = new ExamList(); 
    	
    	public void printList() {
    		printList(list.size());
    		// 이거의 뜻은? size를 했다!
    		// 
    	}
    
    	public void printList(int size) {
    		System.out.println("┌───────────────────────────┐");
    		System.out.println("             성적  출력         ");
    		System.out.println("└───────────────────────────┘");
    		System.out.println();
    
    		// int size = list.current;
    		//Exam[] exams = list.exams;
    
    		for (int i = 0; i < size; i++) {
    			Exam exam = list.get(i);// this.exams[i];
    			// 변수가 반복문 안에서 사용되어도 큰 문제 ㄴㄴ
    			int kor = exam.getKor();// exam.kor;
    			int eng = exam.getEng();
    			int math = exam.getMath();
    
    			int total = exam.total();// kor + eng + math; // exams[0].kor + ...
    			float avg = exam.avg();// total / 3.0f;
    
    			System.out.printf("국어 %d\n", kor);
    			System.out.printf("영어 %d\n", eng);
    			System.out.printf("수학 %d\n", math);
    
    			System.out.printf("총점 : %3d\n", total);
    			System.out.printf("평균 : %6.2f\n", avg);
    			System.out.println("─────────────────────────────");
    
    		}
    	}
    
    	public void inputList() {
    		Scanner scan = new Scanner(System.in);
    
    		System.out.println("┌────────────────────────────┐");
    		System.out.println("           성적  입력            ");
    		System.out.println("└────────────────────────────┘");
    		System.out.println();
    
    		int kor, eng, math;
    
    		do {
    			System.out.printf("국어:");
    			kor = scan.nextInt();
    
    			if (kor < 0 || 100 < kor)
    				System.out.println("국어성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    		} while (kor < 0 || 100 < kor);
    
    		do {
    			System.out.printf("영어:");
    			eng = scan.nextInt();
    
    			if (eng < 0 || 100 < eng)
    				System.out.println("영어성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    		} while (eng < 0 || 100 < eng);
    
    		do {
    			System.out.printf("수학:");
    			math = scan.nextInt();
    
    			if (math < 0 || 100 < math)
    				System.out.println("수학성적은 0~100 까지의 범위만 입력 가능합니다.");
    
    		} while (math < 0 || 100 < math);
    
    		/*
    		 * Exam exam = new Exam(); // 실제 국영수방을 만들어준다 exam.setKor(kor);//exam.kor = kor;
    		 * exam.setEng(eng); exam.setMath(math);
    		 */
    
    		Exam exam = new Exam(kor, eng, math);
    
    		// ------------add------------------------
    
    		list.add(exam);
    
    	}
    
    }
    
    package part4.ex4.UI코드분리하기;
    
    public class Exam {
    
    	int kor;
    	int math;
    	int eng;
    	
    	
    	public Exam() {
    		this(0, 0, 0 );
    	}
    	
    	
    	public Exam(int kor, int eng, int math) {
    		this.kor = kor;
    		this.eng = eng; 
    		this.math = math;
    	}
    	public int getKor() {
    		return kor;
    	}
    	public void setKor(int kor) {
    		this.kor = kor;
    	}
    	public int getMath() {
    		return math;
    	}
    	public void setMath(int math) {
    		this.math = math;
    	}
    	public int getEng() {
    		return eng;
    	}
    	public void setEng(int eng) {
    		this.eng = eng;
    	}
    	public int total() {
    		return kor + eng + math;
    	}
    	public float avg() {
    		return total()/3.0f;
    	}
    }
    	
    	

    댓글

Designed by Tistory.