[TIL] 객체의 분리와 결합 (Has A 관계)

1) 객체의 분리와 결합 (Has A 관계)

1-1) 캡슐의 분리와 Composition Has A 결합하기

  • Exam에서 입출력을 담당하는 input()print()부분만 ExamConsole로 분리시킨다.

  • 분리시켰을 때 기본형이 존재하지 않기 때문에 this.로 받을 것이 사라진다.

  • 이때 Exam 자료형의 객체 exam을 변수로 선언한다.

  • 객체형 이기에 this.exam.kor과 같은 형식으로 쓸 수 있다.

  • ExamConsole이 Exam을 상속받았다라고 말하며 has a 상속 관계에 있다라고도 한다.

1-2) Getters와 Setters

Exam 클래스


package part3.ex3.has;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class Exam {

		private int kor;
		private int eng;
		private int math;

		
		public Exam() {
			this(1,1,1);
		}
		
		public Exam(int kor, int eng, int math) {
			this.kor = kor;
			this.eng = eng;
			this.math = math;
		}
		

		
		   public void save() throws IOException {      

			      File file = new File("res/data.txt");
			      FileOutputStream fos = new FileOutputStream(file);
			      PrintStream ps = new PrintStream(fos);

			      ps.printf("%d,%d,%d\n", kor, eng, math);

			      ps.close();
			      fos.close();
			   }
		   
		   public void load() throws IOException {
			      
			      File file = new File("res/data.txt");      
			      FileInputStream fis = new FileInputStream(file);
			      Scanner scan = new Scanner(fis);

			      String[] tmps = scan.nextLine().split(",");

			      scan.close();
			      fis.close();

			      kor = Integer.parseInt(tmps[0]);
			      eng = Integer.parseInt(tmps[1]);
			      math = Integer.parseInt(tmps[2]);

			   }
		   
			public int total() {
				return kor+eng+math;
			}
			public double avg() {
				return total() / 3.0;
			}
			
			//----------------------------------------------------
			public int getKor() {
				return this.kor;
			}

			public int getEng() {
				return this.eng;
			}

			public int getMath() {
				return this.math;
			}

			//----------------------------------------------------
			public void setKor(int kor) {
				this.kor = kor;
			}
			
			public void setMath(int math) {
				this.math = math;
			}
			

			public void setEng(int eng) {
				this.eng = eng;
			}


			//----------------------------------------------------

	
		   


}

ExamConsole 클래스


package part3.ex3.has;

import java.util.Scanner;

public class ExamConsole {
		
		private Exam exam;
		
		public ExamConsole() {
			exam = new Exam();
		}
		
		
			public void print() {
		      
		      Scanner scan = new Scanner(System.in);

		      System.out.println("┌───────────────────────────────────┐");
		      System.out.println("│              성적 출력           │");
		      System.out.println("└───────────────────────────────────┘");
		      System.out.println("국어 : " + exam.getKor());
		      System.out.println("영어 : " + exam.getEng());
		      System.out.println("수학 : " + exam.getMath());

		      int total = exam.total();
		      double avg = exam.avg();
		      System.out.println("총점 :" + total);
		      System.out.printf("평균 : %.2f\n",  avg);
		   }
	 
			public void input() {
		      
		      Scanner scan = new Scanner(System.in);
		      
		      System.out.println("┌───────────────────────────────────┐");
		      System.out.println("│              성적 출력           │");
		      System.out.println("└───────────────────────────────────┘");
		      
		      System.out.println("국어 >");
		      int kor  = scan.nextInt();
		      System.out.println("영어 >");
		      int eng = scan.nextInt();
		      System.out.println("수학 >");
		      int math = scan.nextInt();
		      
		      exam.setKor(kor);
		      exam.setEng(eng);
		      exam.setMath(math);
		      
		   }

}

  • 캡슐화를 보호하기 위해 private로 막혀있어 getters 메소드를 만들어 호출한다.

  • setters를 이용해 exam에 세팅한다. (남한테 부탁하는 것)

1-3) Getters와 Setters를 사용해야 하는 이유

  • 데이터 구조가 변경되는 것 때문이다.

  • 초기값을 다른 클래스로 만들어 주어 구성은 그대로였지만 구조가 바뀌었다.

  • 구성(원), 구조의 차이를 알도록 하자.

  • Gestters나 Setters는 구조가 아닌 구성을 바꾸는 것이다.

1-4) Has A 관계로 결합된 Console 캡슐 사용하기


package part3.ex3.has;

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

public class Program1 {

   public static void main(String[] args) throws IOException {
	   
	   Exam exam = new Exam();
	   ExamConsole console = new ExamConsole();

      while (true) {

         int menu = inputMenu();

         switch (menu) {
         case 1:
        	 console.input(); 
            break;
            
         case 2:
        	 console.print();
            break;
            
         case 3:
        	exam.load();
            break;
            
         case 4:
        	exam.save();
            break;
            
         case 5:
            exitProgram();
            break;
            
         }
      }

   }

   // Program의 Bottom 구성
   private static boolean exitProgram() {
      return true;
   }


   private static int inputMenu() {
      
      Scanner scan = new Scanner(System.in);

      int menu = 0;

      System.out.println("┌────────────────────────────────┐");
      System.out.println("│      성적관리 Main Menu       │");
      System.out.println("└────────────────────────────────┘");
      System.out.println("1. 입력");
      System.out.println("2. 출력");
      System.out.println("3. 읽기");
      System.out.println("4. 저장");
      System.out.println("5. 종료");
      System.out.print(">");
      menu = scan.nextInt();

      return menu;
   }

}

  • Exam exam = new Exam();ExamConsole console = new ExamConsole();을 통해 객체를 생성한다.

1-5) Association Has A 관계로 결합하기

  • 입출력 exam은 ExamConsole 클래스의 exam을 쓰고 저장이나 불러오기는 Program 클래스의 exam을 써서 제대로 결과가 나오지 않는다.

public class Program1 {

   public static void main(String[] args) throws IOException {
	   
	   Exam exam = new Exam();
	   ExamConsole console = new ExamConsole();
	   console.setExam(exam);

      while (true) {

         int menu = inputMenu();

  • console.setExam(exam) 을 통해 동일한 exam에 저장해 줄 수 있도록 한다.

public class ExamConsole {
		
		private Exam exam;
		
		public ExamConsole() {
			// 1. Composition(일체형) Has A 관계
			// exam = new Exam();
		}
		
		// 2. Association(결합형) Has A 관계
		public void setExam(Exam exam) {
			this.exam = exam;
		}

위와 같이

  • Composition Has A 관계는 각 클래스 안에 있는 객체를 이용해 주는 것이다.

  • Association Has A 관계는 매개변수를 이용해 서로 다른 클래스에 있는 것들을 결합해주는 것이다.

좋은 웹페이지 즐겨찾기