티스토리 뷰

Goal

 - 객체지향 프로그래밍에 대해 알아본다

 - 캡슐화에 대해 알아본다

1. 객체지향 프로그래밍 (Object Oriented Programming) 

 - 실 세계의 일들을 객체를 사용하여 모델링한 프로그래밍.

 

객체지향 프로그래밍을 알아보기 위해 먼저 그 이전의 프로그래밍 패러다임에 대해 알아보자.

 

1) 절차적인 프로그래밍 : 절차(순서)에 따라 프로그래밍을 제작. 절차가 길어지면 프로그램의 볼륨이 커지고 

코드를 관리하기 어려워 진다.

 

2) 구조적인 프로그래밍 : 절차를 함수 단위로 잘라서 프로그래밍을 제작. 함수 단위로 분류하기 때문에 절차지향 보다는 볼륨감이 줄어들지만 여전히 프로그램이 복잡함.

 

3) 객체지향 프로그래밍 (OOP) : 절차, 구조적 프로그래밍의 단점을 보완하기 위해 객체를 사용하여 모델링하는 프로그래밍. ex) 클라스 파일을 수납공간으로 다양한 종류 별로(데이터별, 기능별) 분류하는 프로그래밍.

 

2. 캡슐화

 - 객체지향의 초석

 - 데이터들(변수)과 그 데이터를 처리하는 코드(메서드)를 하나의 단위로 묶는 메커니즘

 - 캡슐화된 클래스의 변수들은 접근제어자를 통해 클래스 외부에서는 접근할 수 없음 (public, private)

 - 해당 클래스의 내부의 메서드를 통해 변수를 조작할 수 있음 (getter, setter)

*내부의 메서드인 getter, setter를 통해 외부에서 변수를 조작하는 이유는 외부에서 바로 변수에 접근할 경우

생각하지 않은 오류가 발생할 수 있기 때문에 캡슐화가 깨져버린다. 따라서 getter와 setter로 변수를 접근하고 getter, setter의 변경에 따른 오류는 하나의 데이터 파일에서 바로 파악할 수 있도록 하여 캡슐화가 깨지는 것을 방지한다. 

 - 데이터 구조에 따른 코드의 수정범위를 캠슐 범위로 한정할 수 있음.

 

2-1 캡슐화를 하는 이유|

 

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

하지만 구조화된 데이터를 함수가 사용하게 되면 외부의 영향에 따라 오류가 발생할 수 있다

class Ellipse { // 구조화된 데이터 Elipse
    int x, y, w, h;
    int color;
}

void draw(Ellipse ellipse) { // 함수가 구조화된 데이터 elipse를 사용함.
    printf("....", ellipse.x);
    ellipse.x + ellipse.y ....
}

// 함수 draw는 구조화된 데이터인 Ellipse의 변수가 변경되면 오류가 발생할 수 있음.

해결방법 

1. 절대 변수를 바꾸지 않는다 (하지만 바꿀 수 없는 상황은 거의 없다..)

2. 바꾼 후 변수를 수정한다 (바꿔도 어디를 바꿔야 하는지 모르기 때문에 또다른 문제가 발생한다)

 

둘 다 좋지 않다.

 

따라서 고쳤을 때 오류가 나는 함수들을 한곳에 모으고 수정이 필요할 때 바로 오류가 나는 부분을 알 수 있도록 하는게 최선이다. 

즉, 객체지향 프로그래밍에서는 클래스를 분류할 때 데이터를 기준으로 분류하는게 좋다.

이것을 캡슐화라고 한다.

 

class Ellipse { // 구조화된 데이터 Elipse
    int x, y, w, h;
    int color;
    
    void draw(Ellipse ellipse) { // 함수가 구조화된 데이터 elipse를 사용함.
	printf("....", ellipse.x);
    	ellipse.x + ellipse.y ....
    }
}

// draw함수를 구조화된 데이터 안에 담는다.

 

 

 

댓글