객체지향 :실세계 일들을 객체를 사용해서 모델링

캡슐화가 객체지향의 가장 초석이다. 프로그래밍은 절차이다.

  • 함수의 개체수가 많아지는 문제와 수납 방법의 모색
  • 데이터를 기준으로 수납해야한다 -> 구조화된 데이터를 사용하는 함수모듈의 독립성을 침해하는 문제를 해결 할수있기때문에

  • 함수는 외부의 수정에 절대 영향을 받아서는 안된다 (함수는 독립된것이다.)

  • 구조화된 객체를 사용하는 함수는 객체의 구조 변경에 아주 취약하다.

  • 캡슐화를 하면 데이터 구조에 따른 코드의 수정범위를 캡슐 범위로 한정할 수 있다.

  • 캡슐화 : 데이터 구조와 함수를 하나의 영역에 함께 정의하는 것. (캡슐로 만들어짐)

실제 예제를 통해서 성적관리프로그램을 캡슐화해보자.!

예제) 메인

import java.util.Scanner;

public class Program {

	public static void main(String[] args) {

		ExamList list = new ExamList();
		                 //두개가 하나로 묶인것
		ExamList.init(list);
		
		int menu;
		boolean keepLoop = true;
		
		while(keepLoop)
		{
			 menu =inputMenu();
			switch(menu)
			{
			case 1:
				ExamList.inputList(list);
				break;
			case 2:
				ExamList.printList(list);
				break;
			case 3:
				System.out.println("Bye~~");
				keepLoop = false;
				break;
				
			default:
				System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
			}
		}
		
	}
	
		static int inputMenu() {
			Scanner scan = new Scanner(System.in);
			System.out.println("┌──────────────────┐");
			System.out.println("│     메인 메뉴             │");
			System.out.println("└──────────────────┘");
			System.out.println("\t1. 성적입력 ");
			System.out.println("\t2. 성적출력 ");
			System.out.println("\t3. 종료 ");
			System.out.print("\t선택> ");
			int menu = scan.nextInt();
			
			return menu;
		}
	}

캡슐화한 ExamList 클래스.


import java.util.Scanner;

public class ExamList {
	Exam[] exams;
	int current;
	

	static void printList(ExamList list,int size) {
		System.out.println("┌──────────────────┐");
		System.out.println("│     성적 출력             │");
		System.out.println("└──────────────────┘");
		System.out.println();
			
		//int size = list.current;
		Exam[] exams = list.exams;
			
		for(int i= 0; i<size; i++ ) {
			Exam exam = exams[i];
			int kor = exam.kor;
			int eng = exam.eng;
			int math = exam.math;
				
			int total = kor+eng+math; 
			float avg= total/3.0f;
				
			System.out.printf("국어 :%d\n", kor);
			System.out.printf("영어 :%d\n", eng);
			System.out.printf("수학 :%d\n", math);
			
			System.out.printf("총점 : %3d\n", total);
			System.out.printf("평균 : %6.2f\n", avg);
			System.out.println("────────────────────────");
			}
	}
	
		static void printList(ExamList list) {
			printList(list,list.current);
		}	
		
		static void inputList(ExamList list) {
			Scanner scan = new Scanner(System.in);
			System.out.println("┌──────────────────┐");
			System.out.println("│     성적 입력             │");
			System.out.println("└──────────────────┘");
			System.out.println();
			
				int kor, eng, math;
				
					do {
						System.out.printf("국어 :");
						kor = scan.nextInt();
						
						if(kor < 0 || 100 < kor)
						{
							System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
						}
					}while(kor<0 || 100 < kor);
					
					do {
						System.out.printf("영어 :");
						eng = scan.nextInt();
						
						if(eng < 0 || 100 < eng)
						{
							System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
						}
					}while(eng<0 || 100 < eng);
					
					do {
						System.out.printf("수학 :");
						math = scan.nextInt();
						
						if(math < 0 || 100 < math)
						{
							System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
						}
					}while(math<0 || 100 < math);
					Exam exam = new Exam();
					exam.kor=kor;
					exam.eng=eng;
					exam.math=math;
					
					Exam[] exams = list.exams;
					int size = list.current;
					
					if(exams.length == size) {
						//1. 크기가 5개 정도 더큰 새 배열을 생성하시오
						Exam [] temp = new Exam[exams.length +5];
						//2. 값을 이주시키기
						for(int i=0; i<size;i++)
							temp[i] = exams[i];
						//3. list.exams가 새로만든 temp 배열을 참조하도록 한다.
						list.exams = temp;
						
						
					}
					list.exams[list.current] = exam;   // 꼭해줘야하는 작업
					list.current++;
		
			
			System.out.println("────────────────────────");
	}

		public static void init(ExamList list) {
			list.exams = new Exam[3];
			list.current=0; 
		} 

}

외부 클래스에 있는 클래스를 쓰겠다고 밝히고 써야한다. 오류가 캡슐화한 안쪽에서만 발생해야한다. (만약에 외부에서 오류가 발생하면 캡슐이깨진것이다. ) -> 나중에 이걸해결하기위한 은닉화 배울것.


드디어 객체지향 ! 내가 입문한 강의이다. 한 3편까지 듣다가 너무 설명을 잘하셔서 완강해야겠다는 맘을 먹고 달렸다. 진짜진짜 설명 너무잘하신다. 한번만 듣는게아니고 여러번 들어서 완전 이해할때까지 복습할예정이다. 이해가잘되니까 너무 재밌다 ㅠㅠ 강 의가 재밋기는 첨이다.

참고 : https://youtu.be/yGBmRdgc1Ic

댓글남기기