[TIL] 코드 재사용, 객체지향, 캡슐화

1) 코드 재사용

1-1) 개념

  • 소스코드를 다시 쓰는 것은 재생산에 가깝고, 배포코드를 다시 쓰는 것이 재사용이다.

2) 예제


public class KorExamScore {
	
	public static int count() throws IOException {
	        int result = 0;

	           File srcFile = new File("res/data.txt");
	           FileInputStream srcFis = new FileInputStream(srcFile);
	           Scanner fscan = new Scanner(srcFis);

	           while (fscan.hasNext()) {
	              fscan.next();
	              result++;
	           }

	           fscan.close();
	           srcFis.close();

			return result ;
		}

		
		
	public static int total() throws IOException {
	        int total =0;
	        {
	           File srcFile = new File("res/data.txt");
	           FileInputStream srcFis = new FileInputStream(srcFile);
	           Scanner fscan1 = new Scanner(srcFis);

	           while (fscan1.hasNext()) {
	              String x_ = fscan1.next();
	              // fout.print(x_);

	              int x = Integer.parseInt(x_);
	              total += x;
	           }

	           fscan1.close();
	           srcFis.close();

	        }
	        return total;
		}
		

	 		
}

  • KorExamScore 라는 클래스를 만든다.

2-1-1) 직접하기

1) 명령 프롬프트를 열어 경로를 해당 클래스가 있는 곳으로 지정해준다.

2) dir을 통해 해당 경로에 있는 파일들을 확인한다.

3) javac KorExamScore.java를 통해 해당 클래스를 컴파일한다.

4) dir을 통해 해당 경로에 class 파일이 추가 된 것을 확인한다.

5) 해당 클래스를 압축파일로 만들어 준 후 확장자를 jar로 바꿔준다.

2-1-2) 이클립스 이용하기

1) jar파일로 만들고자 하는 클래스가 있는 프로젝트를 마우스 우클릭한다.

2) Export를 클릭한다.

3) 항목들 중 Java - JAR file을 선택한다.

4) 경로를 선택해 원하는 파일을 선택해준다.

2-2) 불러오기

새로운 TestJavaPrj라는 프로젝트에 앞에 저장했던 jar 파일을 적용해보도록 하자.

2-2-1) 자바 버전 변경해주기

1) TestJavaPrj를 우클릭 - Build Path -Configure Build Path를 선택한다.

2) 여러 항목들 중 Libraries -Edit를 클릭한다.

3) JavaSE-1.8로 변경해준다.

  • 자바의 버전을 변경하는 이유는 많은 라이브러리들이 8버젼으로 만들어졌기 때문이다.

2-2-2) 라이브러리 불러오기

1) TestJavaPrj를 우클릭 - Build Path -Configure Build Path를 선택한다.

2) 2) 여러 항목들 중 Libraries - Add External JARs를 클릭한다.

3) 해당 jar 파일을 선택한다.

3) 객체 지향 프로그래밍의 시작

3-1) 객체지향 프로그래밍이란 ?

3-2) 캡슐화

  • 캡슐은 수납공간이다.

  • 함수의 개체수가 너무 많아지면서 문제가 발생했다.

→ 데이터를 위주로 수납한 방식이 바람직하다.

  • Ellipse 클래스를 수정할 경우 이를 가져다 쓴 다른 함수에서 문제가 발생할 수 있다.

  • 해당 변수들을 쓰는 함수들을 묶어 Ellipse 클래스 안으로 캡슐화한다.
  • 오류가 나도 해당 클래스 안에서만 수정하면 된다.

  • 함수들을 전부 포함하고 있는 각 파일들로 구성되어 있는데 이것을 캡슐이라고 한다.

3-3) 예제


package part3.ex1.capsule;

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 Program {

   public static void main(String[] args) throws IOException {
      
	   Exam exam = null;
	   
      EXIT: 
      while(true) {
    	  
         int menu = inputMenu();
         
         // 1. 성적입력
         
         // 2. 성적출력
         
         // 3. 성적읽어오기
         
         // 4. 성적저장하기
         
         // 5. 끝내기
                  
         
         switch(menu) {
         case 1:
            exam = inputExam();
            break;      
         case 2:
            printExam(exam);
            break;
         case 3:
            exam = loadExam();
            break;
         case 4:
            saveExam(exam);
            break;
         case 5:
            exitProgram();
            break EXIT;
         }
      }
      
      
   }
   //--------------Menu 선택--------------------------------------
   private static int inputMenu() {
	   
	      Scanner scan = new Scanner(System.in);
	      
	      int menu;
	      
	      do {
			   
			   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();
			   
			   if (menu >=6 && menu<=0)
				   System.out.println("메뉴를 잘못 입력하셨습니다.");
			   
		   } while (menu >=6 && menu<=0);
		   
		   return menu;
	   }
//------------성적 입력---------------------------------
   private static Exam inputExam() {
	   
	   System.out.print("성적을 입력하시오 (국어 영어 수학) : ");
	   
	   Scanner scan = new Scanner(System.in);
	   
	   int kor = 0;
	   int eng = 0;
	   int math =0;
	   
	   Exam exam = new Exam();
	   	   
	   
	   kor = scan.nextInt();
	   if(kor>=0 && kor<=100)
		   exam.kor = kor;
	   else
		   System.out.println("국어 성적을 잘못 입력하였습니다.");
	   
	   eng = scan.nextInt();
	   if(eng>=0 && eng<=100)
		   exam.eng = eng;
	   else
		   System.out.println("영어 성적을 잘못 입력하였습니다.");
	   
	   math = scan.nextInt();
	   if(math>=0 && math<=100 )
		   exam.math = math;
	   else
		   System.out.println("수학 성적을 잘못 입력하였습니다.");

      return exam;
   }
 //-----------성적 출력 ----------------------------------------  
   
   private static void printExam(Exam exam) {
	   
		  System.out.println("┌────────────┐");
		  System.out.println("│           Score	   	 	     │");
		  System.out.println("└────────────┘");
	      
	      System.out.printf("국어 : %d \n", exam.kor);
	      System.out.printf("영어 : %d \n", exam.eng);
	      System.out.printf("수학 : %d \n", exam.math);
	      System.out.printf("총점 : %d \n", exam.kor+exam.eng+exam.math);
	      System.out.printf("평균 : %f \n", (double)(exam.kor+exam.eng+exam.math)/3);

	   }
   
   //-------------성적 불러오기----------------------------------
   private static Exam loadExam() throws IOException  {
	   

	   
	   File file = new File("res/exam.txt");
	   FileInputStream fis = new FileInputStream(file);
	   Scanner scan = new Scanner(fis);
	   
	   Exam exam = new Exam();

	   if(scan.hasNext()) {
	    
	   exam.kor = scan.nextInt();
	   exam.eng = scan.nextInt(); 
	   exam.math = scan.nextInt(); 
	   

	   }
	   else
	   { 
		   System.out.println("저장된 값이 없습니다."); 
		   
	   }
	   
	    return exam;
	    
}
   //------------------성적 저장하기--------------------------------------
   
   private static void saveExam(Exam exam) throws IOException {
	   
	 File file = new File("res/exam.txt");
	 FileOutputStream fos = new FileOutputStream(file);
	 PrintStream fout = new PrintStream(fos);
	 
	 
	 
	  fout.print(exam.kor + " ");
	  fout.print(exam.eng + " ");
	  fout.print(exam.math + " ");
	  
	   
	  
	  fos.close();
	  fout.close();
	   

	      
	   }

//----------------EXIT --------------------
   
   private static void exitProgram() {
	   
	   System.out.println("작업 끝 !");
	   

   }
  
}

좋은 웹페이지 즐겨찾기