Java 코드연습

[뉴렉처] Getters와 Setters 그리고 이것을 써야하는 이유

양상추상츄 2021. 10. 21. 17:29

get 함수와 set 함수를 만들어 이용하여 캡슐을 깨트리지 않고 간접적으로 데이터를 가져옴

같은 클래스가 아닌 다른 클래스에서 많은 데이터를 가져다가 썼다가 다른 클래스에서 수정이 일어날 경우

코드양이 많은 경우 수정하기 복잡할 수 있음

 

package Exam_1.getter_setter;

public class Exam {
	int kor;
	int eng;
	int math;
	
	public int getKor() {
		return kor;
	}

	public int getEng() {
		return eng;
	}

	public int getMath() {
		return math;
	}
	
	public void setKor(int kor) {
		this.kor = kor;		
	}

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

수정이 필요하면 Exam 클래스에서만 해주면되고 Exam에서 데이터가 필요하면 get과 set만 이용해서 가져오면된다.

 

 

package Exam_1.getter_setter;

import java.util.Scanner;

public class ExamList {

	private int current;
	private Exam[] exams;
	
	public ExamList() { // 생성자 : 객체 생성시 단한번만 실행 되게됨
		this.exams = new Exam[3];
		this.current = 0;
	}
	
	void inputList() { //앞에 private 있으면 호출 안됨 다른 클래스에서 못씀
		Scanner scan = new Scanner(System.in);
		System.out.println("--------------------");
		System.out.println("성적입력");
		
		int kor, eng, math;
		
		do {
			System.out.print("국어 : ");
			kor = scan.nextInt();
			
			if(kor<0||100<kor) {
				System.out.print("국어성적은 0~100까지 범위만 입력해주세요");
			}
		}while(kor<0||100<kor);
		
		do {
			System.out.print("영어 : ");
			eng = scan.nextInt();
			
			if(eng<0||100<eng) {
				System.out.println("영어성적은 0~100까지 범위만 입력해주세요");
			}
		}while(eng<0||100<eng);
		
		do {
			System.out.print("수학 : ");
			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.setEng(eng);//exam.eng = eng;
		exam.setMath(math);//exam.math = math;
		
		Exam[] exams = this.exams;
		int size = this.current;
		
		if(exams.length == size) {
			//1. 크기가 5개정도 더 큰 새로운 배열 생성
			Exam[] temp = new Exam[size+5];
			//2. 값을 이주시키기
			for(int i=0; i<size; i++) {
				temp[i] = exams[i];
			//3. list.exams가 새로만든 temp 배열을 참조하도록함
			//exams = temp 하고는 다름 이거는 틀림
			this.exams = temp;	
			}
		}
		
		this.exams[this.current] = exam; // 이부분이 좀 이해가 안되지만 값이 여기서 들어간듯함
		this.current++;
	}
	
	void printList() {//overloading
		this.printList(this.current);//성적입력할때마다 list.current가 ++됨, 갯수만큼 출력
	}
	void printList(int size) { //size를 지정하면 size만큼만 출력
		System.out.println("---------------------");
		System.out.println("성적출력");
		
		//int size = list.current;//성적입력할때마다 list.current가 ++됨, 갯수만큼 출력
		Exam[] exams = this.exams;
		
		for(int i=0; i<size; i++) {
			Exam exam = exams[i];
			int kor = exam.getKor();
			int eng = exam.getEng();//exam.eng;
			int math = exam.getMath();//exam.math;
			
			int total = kor+eng+math;
			float avg = total / 3.0f;
			
			System.out.printf("국어%d : %d\n", i+1, kor);
			System.out.printf("영어%d : %d\n", i+1, eng);
			System.out.printf("수학%d : %d\n", i+1, math);
			
			System.out.printf("총점 : %3d\n", total);
			System.out.printf("평균 : %6.2f\n", avg);
			System.out.println("----------------------");
		}
		
	}

}