-
[컴퓨터 사이언스] 6장. 객체 지향 프로그래밍CS 2019. 10. 15. 01:10
※ 이 게시글은 <컴퓨터 사이언스 부트캠프 with 파이썬> 저자 양태환, 출판사 길벗
을 보고 공부하면서
중요하거나 이해가 어려운 부분을 개인적으로 정리해둔 글입니다. 공부하는 학생이 쓴 글이므로 부정확한 정보가 있을 수 있으며,
상세한 설명이나 예제는 책 원본을 참고하세요.
프로그래밍 패러다임 : 프로그래밍을 어떻게 바라볼 것인지, 어떻게 프로그래밍할 것인지에 대한 인식이나 체계.
(프로그래밍을 바라보는 다양한 시각과 통찰)
절차 지향 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍 등이 있음.
1. 절차 지향 프로그래밍(procedural programming)
: 함수(절차, 서브루틴)를 사용해 프로그래밍하는 것.
"이 프로그램이 무슨 일을 하는가?"
함수 : 입력을 받아 일련의 연산과정을 거쳐 출력을 내보내는 것.
함수 사용의 장점
1) 인터페이스와 구현의 분리
: 함수를 만든 사람과 사용하는 사람이 다른 경우, 사용하는 사람은 함수의 내부가 어떻게 구현되어있는지 알 필요 없이 사용법(인터페이스)만 알면 됨.
2) 긴 코드를 기능별로 나누어 함수로 정의해두면,
이름만 봐도 함수가 어떤 일을 하는지 알 수 있고/ 어디서든 호출할 수 있어서
→ 코드를 직접 작성하지 않은 사람도 쉽게 프로그램을 이해하고 유지•보수할 수 있다.+코드의 재사용성이 높아진다.
...더보기*수학적 상식
분산(variance) : 각 점수에서 평균 값을 뺀 값의 제곱의 평균(산포도, dispersion 분석에 사용됨)
표준편차(standard deviation) : 분산의 제곱근.
2. 객체 지향 프로그래밍(object-oriented programming, OOP)
: 현실세계를 모델링하는 데 변수, 함수를 가진 객체를 이용하는 패러다임.
객체 = 현실 세계의 사물을 모델링한 것.
객체 지향의 모델링 과정
"현실 세계에 존재하는 객체(object)를 어떻게 모델링할 것인가?"
→ 사물의 '특성'을 기준으로 객체들을 분류하거나 계층(클래스)을 만든다.
ex) 사람 객체
모든 사람이 같은 특성을 가지고 있지만, 그 값은 다름. +사람은 '잠자기', '먹기' 같은 행동(기능)을 할 수 있음.
→ 현실세계의 객체는 특성(속성)과 행동(기능)으로 표현할 수 있다.
→ 현실세계의 객체를 프로그래밍으로 가져오려면(모델링), 특성 = 변수(데이터), 행동 = 함수로 나타내면 된다.
1) 캡슐화
: 변수와 함수를 클래스와 같은 하나의 단위로 묶는 것.
...더보기★ 메세지 패싱 : 서로 다른 객체가 함수 호출을 통해 상호작용하여 객체의 상태가 변하는 것.
def give_money(self, other, money):
self['money'] -= money other['get_money'](other, money)
def get_money(self, money):
self['money'] += money
2) 클래스와 객체
클래스 : 객체를 생성해내는 템플릿
객체(≒인스턴스) : 클래스를 이용해 만들어진 변수, 함수를 가진 메모리 공간
멤버/프로퍼티 : 클래스로 묶이는 변수
행동/메서드/멤버함수 : 클래스로 묶이는 함수
멤버+메서드 = 속성(attribute)
생성자 : 객체 생성 시 인스턴스 멤버를 초기화하는 함수
-
인스턴스 멤버 : 객체가 가진 멤버
(객체 생성 시 생성자에 의해 초기화됨)
인스턴스 메서드 : 객체가 가진 메서드
(메서드 내부에 클래스 함수와 객체자신의 참조를 가지고 있음.)
→ 인스턴스 멤버와 인스턴스 메소드는 객체 생성 후 객체를 통해 접근/호출 해야 한다.
*파이썬에서 인스턴스 메서드의 함수의 차이 :
인스턴스 메소드는 객체가 없으면 호출할 수 없음.(첫 번째 인자로 전달할 객체가 없기 때문)
/ 함수는 클래스를 사용해서도 호출할 수 있지만 첫 번째 인자 self에 객체를 직접 넘겨주어야함.
-
클래스 멤버 : 클래스가 가진 멤버.
(클래스 선언 바로 아래 선언됨.)
모든 객체가 같은 데이터를 가지는 경우, 클래스 멤버로 만들어, 모든 객체가 공유하도록 할 수 있다.
클래스 메서드 : 클래스가 가진 메서드
(메서드 위의 데코레이터 @classmethod로 구분)
→ 클래스 멤버와 클래스 메서드는
객체를 생성하지 않고도 클래스를 통해 접근하거나 호출할 수 있다. (객체에서도 접근/호출이 가능하다)
객체지향 패러다임에서 꺼리는 전역 변수, 전역 함수를 대체 가능.
*파이썬의 정적 메서드(static method) :
정적 메서드는 인자로 클래스/객체를 받지 않는다. 함수의 정의만 클래스 안에 선언되어있을 뿐, 일반 함수와 같기 때문에 전역 함수를 대체하기에 가장 알맞음.
*클래스 메서드는 대체 생성자로도 쓰인다.
(클래스 메서드 호출 → 클래스 메서드가 일정한 프로세스를 거친 뒤 일반적인 생성자를 다시 호출해 객체 생성)
3) 정보 은닉
: 캡슐화할 때 어떤 멤버와 메서드를 숨겨서 유저 프로그래머가 접근할 수 없도록 하는 것.
ex) C++의 접근 제어 지시자(access modifier)
public : 객체를 만들어 사용하는 유저 프로그래머가 접근/호출 가능한 멤버나 메서드
private : 클래스 안에서만 사용할 수 있고 객체를 통해서는 접근/호출할 수 없는 멤버나 메서드.
멤버에 접근하거나 변경해야 할 때는 액세스 함수(access function. getter 혹은 setter 메서드를 말함)을 사용하여 접근하거나 변경해야 함.
정보 은닉의 필요성 :
setter 메서드를 통해서만 멤버에 접근이 가능하도록 해서,
유저 프로그래머가 직접 멤버를 건드려서 잘못된 값으로 변경하는 등 실수할 확률을 낮출 수 있음.
OOP에서 잘된 정보 은닉은 필요한 메서드만 공개하고 나머지는 모두 숨기는 것.
파이썬에서의 정보 은닉 :
파이썬은 기본적으로 정보 은닉을 지원하지 않음. 따라서 완벽한 정보 은닉이 불가능하지만, 유저 프로그래머의 실수를 막을 수 있는 방법은 제공함.
ex) 숨기려는 멤버 앞에 언더바 두 개(__) 붙이기, 프로퍼티 기법 등
'CS' 카테고리의 다른 글
[UML] 시퀀스 다이어그램 (0) 2021.12.24