ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체지향 - 캡슐화
    언어/JAVA 2023. 6. 12. 21:14

     

    캡슐화: 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것

     

    캡슐화의 기능 

    데이터 보호 - 외부로부터 클래스에 정의된 속성과 기능들을 보호

    데이터 은닉 - 내부의 동작을 감추고 외부에는 필요한 부분만 노출 

     

    1. 캡슐화는 왜 하는걸까?

     

    구조체,함수들을 이용한 구조적인 프로그래밍을하면, 기존의 절차지향적인 프로그래밍보다 좀 더 구조화된 프로그램을 만들 수 있었다.

    하지만, 구조적 프로그래밍은 함수의 개체수가 많아지게 되고 

    이때 함수를 어떤 기준으로 수납할 것인가?하는 문제가 발생하게 된다.

    함수는 크게 1. 기능 2. 데이터 두개의 기준으로 나눌 수 있을 것이다. 

    이때 데이터에 따라 함수를 분리하면 구조화된 데이터를 사용하는 함수 모듈의 독립성을 침해하는 문제를 해결할 수 있게 된다.

    *함수 모듈의 독립성이란 함수가 외부 수정에 영향을 받아서는 안되는 것을 말한다.

    class Circle{
    	int r,x,y; 
        int color; // color를 Col이라던지, color1이라던지 함수명 변경시 
    
    }
    
    void changeColor(Circle circle){
    
    	circle.color = ..;  // 함수 외부 수정에 의해 이를 쓰는 모든 함수에서 에러발생 
    }
    
    void drawCircle(Circle circle){
    	if(circle.color == ..){} // color부분 찾아서 모두 수정해야함 
    }

    Circle라는 구조체가 정의되어 있고, 함수는 기능 단위로 쪼개져 있다고 가정해보자 

    색을 바꾸는 함수는 색과 관련된 함수들이 모여있고, 원을 그리는 함수들은 그리는 것과 관련된 함수들끼리 모여있는 것이다. 

    이때 Circle구조체가 변수의 명을 바꿔버리면, 이를 사용하는 모든 함수를 찾아서 이름을 변경해줘야한다. 

    이렇듯 구조화된 데이터를 사용하는 함수들은 객체 구조 변경에 매우 취약하다.

     

    데이터를 기준으로 함수를 모으면 아래와 같다.

    class Circle{
    	int r,x,y; 
        int color; // color를 Col이라던지, color1이라던지 함수명 변경시 
    
    
    	void changeColor(Circle circle){ // Circle 내부에서만 에러 발생 여기서만 수정하면됨
    
    	circle.color = ..;  
    	}
    
    	void drawCircle(Circle circle){
    	if(circle.color == ..){}  
    	}
    }

    이제 객체의 변경에 대한 에러사항은 객체 내에서만 발생하므로, 오류의 범위를 줄일 수 있다. 

    외부에서 위 함수를 호출해서 사용하는 부분에서는 에러가 발생하지 않을 것이다.

     

    이렇게 데이터 구조와 함수를 하나의 영역에 함께 정의하여,

    데이터 구조 변화에 따른 에러를 내부에서만 발생하게 하는 것이

    캡슐화이고 캡슐화의 핵심이라고 할 수 있다.

    함수 모듈의 독립성을 보장하고 에러를 내부화 하여 데이터를 보호하는 기능을 수행할 수 있게 되었다.

     

     

    2. 함수에서 메서드로의 변화 (캡슐화를 통한 객체의 의인화)

    class EaxmList{
    
    	....// 여러 변수들
     public static void inputList(ExamList list){...}
      public static void printList(ExamList list){...}
       public static void saveList(ExamList list){...}
    
    }
    
    //어떤 클래스 내부에 main 메서드
    void main(){
    	
        list = new ExamList(); // ExamList 를 호출하여 사용
       ExamList.inputList(list);
        ExamList.printList(list);
        ExamList.savaList(list); 
    
    }

    이제 데이터를 기준으로 함수를 묶어두고 ExamList라는 클래스 호출하여 사용하면서 

    관련 메서드를 사용하게되는데, main의 내부에서는 객체안에 함수들을 불러와서 사용하는 것일 뿐 

    ExamList클래스에 영향을 줄 수 있는 어떠한 로직을 만들어 낼 수 없다.

    따라서 함수에 내부 로직을 담당하고 main의 내부에서 서비스를 하는 list라는 객체를 더 중심으로 함수를 표기해보자

    //어떤 클래스 내부에 main 메서드
    void main(){
    	
      list = new ExamList(); // ExamList 를 호출하여 사용
      list.inputList();
      list.printList();
      list.saveList();
    
    }

    파라미터로 주체를 전달받는 것이 아니라, 함수를 서비스하는 주체를 더 적극적으로 표현이 된다.

    list를 이용하는 함수에서 list에게 시키는 명령이 된 것이다.

     - 함수의 관련 알고리즘 처리는 모두 ExamList안에서 이루어져야함

     - 따라서 main은 함수를 호출에서 사용할 뿐 함수 내부 로직에 대한 책임이 없다.

     - 이제 하나의 객체는 함수의 도구 혹은 대상을 넘어서 하나의 책임의 의미를 가지게 됨

     - 구조화된 데이터의 캡슐화 -> 데이터 사용 + 책임 -> 주체화,의인화 

     

    이와 같은 의미에서 list가 가진 함수들은 list가 제공하는 하나의 서비스이자 list를 사용하는 방법이라는 의미로

    method라는 의미를 가지게 된다.

     

    이에 고전적 함수와 메서드를 구분할 필요가 있음으로 

    자바에서는 고전적 함수는 static메서드로 나타내고, 메서드는 인스턴스 메서드로 표현한다.

    이제 인스턴스 메서드는 반드시 객체를 통해서 호출되고, 묵시적으로 객체를 통해 값을 넘겨받게 된다.

     

    3. 캡슐 지키기

     

    캡슐화가 가진 이점을 잘 살리기 위해서는 외부로부터 내부의 기능과 속성을 잘 숨길필요가 있을 것이다.

    외부 호출에 의해 로직이 변경되는 것도 캡슐화를 깨는 것이고,

    속성을 직접 호출해서 사용했다가 내부 로직이 바뀌어 외부 호출에 에러가 발생한다면 캡슐화의 의미가 없다.

    따라서 데이터를 은닉하여 필요한 부분만 노출하기 위한 장치가 필요한데

    자바에서는 접근 제어 지시자가 이를 담당한다.

    출처: 뉴렉처 - 자바강의 (유튜브) : 속성에 직접 접근하여 캡슐화가 깨진 모습
    출처: 뉴렉처 - 자바강의 (유튜브)

    속성 혹은 메서드에 대해 private 접근 제어자를 붙여서 데이터를 은닉할 수 있다. 

     

     

    참고자료: 

    뉴렉처 유튜브 강의 

    https://www.youtube.com/@newlec1

     

    뉴렉처

    "유료" 온라인 강의 사이트 뉴렉처에서 제공하는 프로그래밍 강의 채널입니다. 교육서비스 : (10월 새롭게 오픈될 예정입니다.) https://www.newlecture.com 교재: https://javaweb.tistory.com https://answeris.tistory.

    www.youtube.com

     

    '언어 > JAVA' 카테고리의 다른 글

    상속,동적생성  (0) 2023.07.06
    람다식  (0) 2023.07.05
    자바 - 입출력(I/O) (1) 바이트기반 스트림/ 문자기반 스트림  (0) 2023.05.14
    자바 - 열거형(enums)  (0) 2023.03.26
    자바 - Arrays 클래스와 Comparator  (0) 2023.03.23
Designed by Tistory.