[TIL] 캡슐화 예제, 인스턴스 메소드

1) 캡슐화 추가내용

1-1) 캡슐을 깨뜨리는 행위

  • 어느 데이터를 다른 클래스 or 캡슐에서 사용하는 경우가 있다.

1-2) 접근 제어 지시자

  • 접근 제어 지시자를 통해 다른 클래스에서의 접근을 허용하거나 차단할 수 있다.

1-3) 예제


package part3.ex1.capsule2;

import java.io.IOException;
import java.util.Scanner;

public class Program1 {

   public static void main(String[] args) throws IOException {

      while (true) {

         int menu = inputMenu();

         Exam exam = new Exam();

         switch (menu) {
         case 1:
            Exam.input(exam);
            break;
         case 2:
        	 Exam.print(exam);
            break;
         case 3:
        	 Exam.load(exam);
            break;
         case 4:
        	 Exam.save(exam);
            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;
   }

}


package part3.ex1.capsule2;

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 static void save(Exam exam) 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", exam.kor, exam.eng, exam.math);

			      ps.close();
			      fos.close();
			   }
		   
		   public static Exam load(Exam exam) 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();

			      exam.kor = Integer.parseInt(tmps[0]);
			      exam.eng = Integer.parseInt(tmps[1]);
			      exam.math = Integer.parseInt(tmps[2]);

			      return exam;
			   }
		   
		   public static void print(Exam exam) {
			      
			      Scanner scan = new Scanner(System.in);
			      
			      if (exam == null) {
			         System.out.println("성적이 입력되지 않았습니다. (Exam 객체가 존재하지 않음)");
			         return;
			      }

			      System.out.println("┌───────────────────────────────────┐");
			      System.out.println("│              성적 출력              │");
			      System.out.println("└───────────────────────────────────┘");
			      System.out.println("국어 : " + exam.kor);
			      System.out.println("영어 : " + exam.eng);
			      System.out.println("수학 : " + exam.math);

			      int total = exam.kor + exam.eng + exam.math;
			      System.out.println("총점 :" + total);
			      System.out.printf("평균 : %.2f\n", (total / 3.0));
			   }
		   
		   public static void input(Exam exam) {
			      
			      Scanner scan = new Scanner(System.in);
			      
			      System.out.println("┌───────────────────────────────────┐");
			      System.out.println("│              성적 출력              │");
			      System.out.println("└───────────────────────────────────┘");
			      
			      System.out.println("국어 >");
			      exam.kor = scan.nextInt();
			      System.out.println("영어 >");
			      exam.eng = scan.nextInt();
			      System.out.println("수학 >");
			      exam.math = scan.nextInt();
			      
			   }
	
		   


}

2) 인스턴스 메소드

2-1) 객체지향을 위한 표현

  • exam을 입출력 수행할 때 왼쪽의 코드보다 오른쪽의 코드가 더 직관적이다.

  • 왼쪽은 객체 위주가 아닌 고전적인 것으로 Function이라고 부른다.

  • 오른쪽은 객체 위주로 표현할 수 있도록 해주는 것으로 Method라고 부른다.

2-2) 표현의 방식을 변화시킨 함수의 모양

  • 기존의 함수의 인스턴스 전달

    1) static을 통해 객체지향을 지원하지 않음을 나타냈다.

    2) 부가적인 녀석으로만 객체를 전달한다.

    3) 매개변수로만 넘겨받는다.

    4) this를 쓸 수 없다.

    5) 스태틱 메소드라도고 부른다.

  • 새로운 함수의 인스턴스 전달

    1) 객체를 통해서 호출한다.

    2) 객체를 넘겨 받을 수 있다.

    3) 객체를 넘겨 받는 녀석을 인스턴스 함수라고 한다.

    4) 예약되어 있는 이름 this를 통해 exam을 넘겨받는다.

    5) 메소드 or 인스턴스 메소드라고 부른다.

좋은 웹페이지 즐겨찾기