본문 바로가기

Java

OOP - 캡슐화

import java.util.Scanner;
public class MakeArraylist {
static Scanner sc = new Scanner(System.in);
    public static void main(String... args) {
        Exam ex = new Exam();
        boolean loop = true;
 
        while (loop) {
            int m = menu();
            switch (m) {
            case 1:
                ex.input();
                break;
            case 2:
                ex.output();
                break;
            case 3:
                System.out.println("프로그램 종료.");
 
                loop = false;
                break;
 
            default:
                System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
            }
        }
        sc.close();
    }
    
    static int menu() {
        System.out.println("      -메인 메뉴-");
        System.out.println("\t1. 성적입력 ");
        System.out.println("\t2. 성적출력 ");
        System.out.println("\t3. 종료 ");
        System.out.print("\t선택> ");
        int menu = sc.nextInt();
        return menu;
    }
    
}
 
cs

main메소드, 초기화면 메소드가 포함된 클래스

 

import java.util.Scanner;
public class Exam {
    static Scanner sc = new Scanner(System.in);
    private AllSubject[] stu;
    private int counter;
    public Exam() {   //생성자
        stu = new AllSubject[2];
        counter = 0;
    }
    void input() {
        System.out.println("      -성적 입력-");
        int kor, eng, math;
        do {
            System.out.printf("국어: ");
            kor = sc.nextInt();
            if (kor < 0 || 100 < kor) {
                System.out.println("성적은 0~100까지의 범위만 입력이 가능합니다.");
            }
        } while (kor < 0 || 100 < kor);
 
        do {
            System.out.printf("영어: ");
            eng = sc.nextInt();
            if (eng < 0 || 100 < eng) {
                System.out.println("성적은 0~100까지의 범위만 입력이 가능합니다.");
            }
        } while (eng < 0 || 100 < eng);
 
        do {
            System.out.printf("수학: ");
            math = sc.nextInt();
            if (math < 0 || 100 < math) {
                System.out.println("성적은 0~100까지의 범위만 입력이 가능합니다.");
            }
        } while (math < 0 || 100 < math);
 
        AllSubject score = new AllSubject();
        score.setKor(kor);
        score.setEng(eng);
        score.setMath(math);
         
        //배열 크기 늘리기
        AllSubject[] stu = this.stu;  
        int size = this.counter;  
        if (stu.length == size) {   //실제 배열길이와 데이터 입력때마다 증가시킨 카운터를 비교, 같으면 배열이 값으로 꽉참.
            AllSubject[] tmp = new AllSubject[size + 1];    //기존배열보다 index가 하나 더있는 임시배열 생성
            for (int i=0; i<size; i++) {
                tmp[i] = stu[i];    //기존배열의 값들을 임시배열로 옮김
                this.stu = tmp;       //va객체의 stu배열이 tmp배열을 참조
            }
        }
        
        this.stu[this.counter] = score;
        this.counter++;
        System.out.println("────────────────────────");
 
    }
   
    void output() {
        int size = counter;
        AllSubject[] stu = this.stu;
        for (int i=0; i<size; i++) {
            AllSubject score = stu[i];
            int kor = score.getKor();
            int eng = score.getEng();
            int math = score.getMath();
            int total = score.total();
            float avg = score.avg();
            System.out.println("국어: " + kor);
            System.out.println("영어: " + eng);
            System.out.println("수학: " + math);
            System.out.println("총점: " + total);
            System.out.println("평균: " + avg);
            System.out.println("────────────────────────");
        }
        
    }
}
 
cs

입출력 메소드와 배열 객체를 생성하는 클래스

 

 

 

public class AllSubject {
    private int kor;
    private int eng;
    private 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;
    }
    public void setMath(int math) {
        this.math = math;
    }
    public int total() {
        return kor + eng + math;
    }
    public float avg() {
        return total() / 3.0f;
    }
}
 
cs

각 과목 변수들과 그 변수들을 제어할 getter, setter들이 선언된 클래스

 

 

- 캡슐화의 핵심

클래스간 침범 없이 독립적으로 구성할것

배열객체를 참조하는 입/출력 메소드들은 배열이 선언된 클래스(Exam)로 위치 이동

다른 클래스에서 참조하여 사용했던 변수들은 getter, setter메소드를 통해 간접적으로 접근

 

캡슐화 테스트: 한 클래스에서 변수명을 수정하였을때, 다른 클래스에서 오류가 발생하는지 check