※ 이 게시글은 <컴퓨터 사이언스 부트캠프 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) 숨기려는 멤버 앞에 언더바 두 개(__) 붙이기, 프로퍼티 기법 등

 

 

 

+ Recent posts