//Exam 자료형 캡슐화하기.
//변수 수정시 외부에서 사용할시 영향을 준다.
//get으로 빌려주면 여기서 변수명이 변경되어도 외부에서 오류가 나지 않는다.
//private한 변수도 set을 사용하면 외부클래스에서도 값을 넣어 줄 수 있다.
package oop.ex03.Getters와Setters;
public class Exam {
private int kor;
private int eng;
private int math;
public Exam() {
//생성자 오버로드 시 꼭 기본 생성자 설정. 코드집중화로 중복 코드 삭제
this(0, 0, 0);
}
public Exam(int kor, int eng, int math) {
//this를 생략해서 지역변수명과 헷갈릴 수 있을때는 생량하지 않는다.
this.kor = kor;
this.eng = eng;
this.math = math;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int total() {
return kor + eng + math;
}
public float avg() {
return total()/3.0f;//this생략가능
}
}
package oop.ex03.Getters와Setters;
import java.util.Scanner;
public class ExamList {
private Exam[] exams;
private int current;
public void printList() {
this.printList(this.current);
//오버로드 된 printList(ExamList list, int count)를 사용해서 코드를 집중화했다.
}//printList
public void printList(int count) {
System.out.println("┌────────────────────────┐");
System.out.println(" │ 성적출력 │");
System.out.println("└────────────────────────┘");
System.out.println();
//int count = list.current;
Exam[] exams = this.exams;
for(int i=0; i<count; i++) {
Exam exam = exams[i];
int kor = exam.getKor();//exam.kor;
int eng = exam.getEng();
int math = exam.getMath();
int total = exam.total();//kor + eng + math; exam에서 하는게 바람직
float avg = exam.avg();//total/3.0f;
System.out.printf("%d번 학생\n",i+1);
System.out.printf("\t국어 : %3d\n", kor);
System.out.printf("\t영어 : %3d\n", eng);
System.out.printf("\t수학 : %3d\n", math);
System.out.println("-----------------------");
System.out.printf("\t총점 : %3d\n",total);
System.out.printf("\t평균 : %6.2f\n",avg);
System.out.println("────────────────────────");
}
}
//오버로드해서 count(매개변수)를 받는만큼만 출력하는 printList
/*인자가 없는쪽이 할 수 없는 일을 다 할 수 있다.*/
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;
System.out.printf("%d번 학생\n",current+1);
do {
System.out.printf("국어 : ");
kor = scan.nextInt();
if(kor<0 || 100<kor)
System.out.println("입력오류 : 성적유효범위에 맞게 입력하세요.");
} while(kor<0 || 100<kor);
do {
System.out.printf("영어 : ");
eng = scan.nextInt();
if(eng<0 || 100<eng)
System.out.println("입력오류 : 성적유효범위에 맞게 입력하세요.");
} while(eng<0 || 100<eng);
do {
System.out.printf("수학 : ");
math = scan.nextInt();
if(math<0 || 100<math)
System.out.println("입력오류 : 성적유효범위에 맞게 입력하세요.");
} while(math<0 || 100<math);
/*Exam exam = new Exam();
exam.setKor(kor);//exam.kor = kor;
exam.setEng(eng);//exam.eng = eng;
exam.setMath(math);//exam.math = math;*/
//생성자오버로드를 통해 코드를 3줄 줄일 수 있다.
Exam exam = new Exam(kor, eng, math);
Exam[] exams = this.exams;
int count = this.current;
if(exams.length == current) { //list.exams 배열의 길이가 현재 list.current와 같다. 즉 exams의 공간이 없다면.
// 1. 크기가 5개 정도 더 큰 새로운 배열을 생성하시오.
Exam[] temp = new Exam[exams.length + 5]; //총 8개
// 2. 값을 이주시키기
for(int i=0; i<count; i++)
temp[i]=exams[i];
// 3. list.exams가 새로만든 temp 배열을 참조 할 수 있도록 한다.
exams = temp;
}
exams[current] = exam;
current++;
System.out.println("────────────────────");
}//inputList()
public ExamList() { //init은 초기화 함수로 사용하는건 바람직하지 않다.
//컴파일러가 기본적으로 생성자를 null/0으로 만들어 주긴 하지만
//그외 초기값을 원하거나 오버로드 시엔 꼭 기본 생성자 필수!
/* 오버로드 된 생성자를 호출해서 코드를 집중화한다.
exams = new Exam[3]; //this생략가능 가능하면 지워쓰기권장
current =0;
*/
this(3); //갓태어난 객체를 통해서만 호출 할 수 있다. 함수처럼 호출 불가.
}
//생성자 오버로드 => 기본 생성자를 만들고 만들어야한다. 꼭!
public ExamList(int size) { //init은 초기화 함수로 사용하는건 바람직하지 않다.
exams = new Exam[size]; //this생략가능 가능하면 지워쓰기권장
current =0;
}
}
캡슐화 : 데이터 구조와 함수를 하나의 영역에서 관리 해 줄 수 있게 했다.
접근지정자 private를 사용해서 외부클래스에서 영향을 줄 수 없게 만들었다.
getter, setter를 해주어서 외부클래스에서 값을 가져가거나, 값을 대입 할 수 있고, 캡슐화 된 곳에서 변수명이 바뀌어도 외부클래스에서 사용 된 함수에서는 오류가 나지 않게 해주었다.
생성자를 통해서 초기화를 해주고, 생성자 오버로드시에는 꼭 기본 생성자를 설정 해주었다.
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] class 재사용하기 (0) | 2021.11.28 |
---|---|
[JAVA] UI코드 분리 - 국영수 성적 입출력 프로그램 (0) | 2021.11.28 |
[JAVA] 함수 Overloading - 국영수 성적 입출력 프로그램 (0) | 2021.11.25 |
[JAVA] 구조체 배열 가변 길이 추가 - 국영수 성적 입출력 프로그램 (0) | 2021.11.24 |
[JAVA] 구조적인 프로그래밍 (0) | 2021.11.24 |