[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 관계는 매개변수를 이용해 서로 다른 클래스에 있는 것들을 결합해주는 것이다.
Author And Source
이 문제에 관하여([TIL] 객체의 분리와 결합 (Has A 관계)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@psh94/TIL-객체의-분리와-결합-Has-A-관계저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)