객체지향 프로그래밍
객체지향 프로그래밍(Object-Oriented-Programming)은 우리가 살고 있는
실제 세계가 객체(object)들로 구성되어 있는 것과 비슷하게, 소프트웨어도
객체로 구성되는 방법이다.
예를 들어 '나'라는 객체는 '스마트폰'이라는 객체와 'TV'라는 객체가 상호작용하며,
구성되어있다. 이를 소프트웨어로 구성하는게 객체지향 프로그래밍이다.
객체
객체는 상태와 동작을 가지고 있다.
객체의 상태(state)는 객체의 속성이다.
객체의 동장(behavior)은 객체가 취할 수 있는 동작(기능)이다.
예를 들어 'TV'객체에는
'채널번호', '볼륨', '전원상태'라는 상태(state)가 있고,
'켜기', '끄기', '채널 변경하기', '볼륨 변경하기'라는 동장(behavior)이 있다.
인스턴스 변수와 메소드
객체의 상태와 동작은 소프트웨어에서는 각각 인스턴스 변수와 메소드로 표현 할
수 있다. 객체 안의 변수를 인스턴스 변수(instance variable)이라 하고 객체의 동작을
나타내는 부분을 메소드(method)라고 부른다. 즉 객체는 이 둘로 이루어진
소프트웨어의 묶음이라고 할 수 있겠다.
예를 들어 'TV'객체에는 인스턴스 변수와 메소드로 이루어져있고,
인스턴스 변수는 channel, volume, on
메소드는 turnOn(), turnOff(), changeChannel(), changeVolume()이 있다.
클래스
객체에 대한 설계도를 클래스(class)라고 한다.
클래스로부터 만들어지는 각각의 객체들을 그 클래스의 인스턴스(instance)라고 한다.
일종의 객체들을 만들어내는 형틀, 청사진이라고 생각할 수 있겠다.
클래스는 아래의 형식을 가진다.
클래스 안에는 인스턴스 변수(객체 안에 정의된 변수)와 메소드(클래스 안에 정의된 함수)를
정의한다. 이들은 클래스의 멤버(member)라고 한다.
변수는 객체의 상태를 나타내고 메소드는 객체의 동작을 나타낸다.
인스턴스 변수는 객체 안에 정의된 변수이다. 파이썬에서 인스턴스 변수를 생성하려면 베소드
안에서 self.를 붙인 변수에 값을 대입하면 된다.
클래스의 예
Counter 클래스
Counter 클래스는 기계식 계수기를 나타낸다. 경기장이나 콘서트에 입장하는 관객 수를
세기 위해 사용할 수 있을 것이다.
Counter 클래스는 카운터값을 저장하는 변수를 가지고 있어야 한다.
이것을 인스턴스 변수 또는 필드라고 한다.
메소드 안에서 변수 이름 앞에 self.을 붙이고 값을 저장하면 인스턴스 변수가 된다.
간단한 예를 보자.
실제 카운터에 있는 기능을 클래스로 구현해보았다.
def reset(self):에서 (self)는
객체 자기 자신을 의미한다.
def reset(self):
self.count = 0
과 같은 코드는 메소드 정의
self.count = 0
과 같은 코드는 인스턴스 변수 생성을 한다.
정리하자.
- 클래스를 정의할 때는 키워드 class로 시작하며, 클래스의 이름은 그 뒤에 붙인다.
여기서는 Counter가 클래스의 이름이다. - 클래스 안에는 메소드와 인스턴스 변수를 정의한다.
여기서는 reset(), increment(), get() 메소드를 정의하였다. - 모든 메소드의 첫 번째 매개 변수는 자기 자신을 가리키는 self변수이다.
self가 앞에 붙어 있으면 현재 객체라는 의미이다.
다시말해 메소드를 호출한 객체라는 의미이다. - self가 앞에 있는 변수는 모두 인스턴스 변수이다.
클래스가 정의되었으니, 객체를 생성해보자. 클래스 이름에 ()을 붙여서 함수처럼 호출하면 된다.
객체를 통해서 메소드도 호출해보았다. 단 객체를 사용하기 전 reset()을 먼저 호출해야 인스턴스
변수가 생성된다.
정리하자.
- Counter()라고 호출하면 객체가 생성되고, 객체의 참조값을 변수 a에 저장한다.
- a의 reset()을 호출하면 인스턴스 변수 count가 생성되고 0으로 초기화 한다.
- a의 increment()를 호출하면 count 값이 하나씩 증가된다.
- a의 get()을 이용하여 카운터의 현재값을 얻을 수 있다.
전체 코드를 보자.
객체 2개 생성하기
객체는 원하는 만큼 여러 개 생성할 수 있다.
클래스로 생성된 각각의 객체는 별도의 인스턴스 변수를 가진다.
Counter클래스로 객체 a와 b를 작성하였다면 객체 a와 b는 모두 자신만의 count 인스턴스
변수를 가지게 된다.
아래의 예를 보자.
메소드를 정의하는 다른 코드도 한번 보자.
생성자
생성자(constructor)는 객체가 생성될 때 객체를 기본값으로 초기화하는 특수한 메소드이다.
- __init__() 메소드: 객체 생성할 때 클래스 이름과 동일한 메소드(생성자)가 호출되면서
변수 정의 및 초기화됨. - 없어도 생성 가능하지만, 초기화가 없다.
생성자는 아래의 형식을 가진다.
간단한 예를 보자.
__init__()메소드가 reset()없이 실행시 초기화를 한다.
메소드 정의
메소드는 클래스 안에 정의된 함수이므로 함수를 정의하는 것과 유사하다.
하지만, 함수와는 달리 메소드의 첫 번째 매개변수는 항상 self이어야 한다.
아래의 예를 보자.
설명은 아래의 사진으로 대체하겠다.
메소드 호출
위에서 정의했던 메소드를 호출해보자.
정보 은닉
객체 지향 방법의 개념 중에 정보 은닉(information hiding)이 있다.
정보 은닉이란 구현의 세부 사항을 클래스 안에 감추는 것이다.
클래스 안의 데이터를 외부에서 마음대로 변경하지 못하게하기 위함이다.
변수는 안에 감추고 외부에서는 메소드들만 사용하도록 한다.
클래스 안에 변수를 선언할 때는 private로 만드는 것이 좋다. private변수로 만들면
외부로부터의 접근이 차단된다.
파이썬에서 인스턴스 변수를 private로 정의하려면 변수 이름 앞에 __을 붙이면 된다.
private가 붙은 인스턴스 변수는 클래스 내부에서만 접근할 수 있다.
아래의 예를 보자.
먼저 이건 정보은닉을 하기 전이다.
위 코드에서는 객체의 변수 age에 마음대로 접근하여서 값을 변경할 수 있다.
위 코드는 정보은닉을 한 코드이다.
__age는 private변수이므로 오류가 발생한다.
접근자와 설정자
private 변수와 메소드는 클래스 내부에서만 접근할 수 있다.
외부에서 이들 변수 값이 필요한 경우에는 아래의 특수 메소드를 사용하면 된다.
- 인스턴스 변수값을 반환하는 접근자(getters)
- 인스턴스 변수값을 설정하는 설정자(setters)
이러한 메소드는 대게 get이나 set이 메소드 이름 앞에 붙여진다.
아래의 예를 보자.
클래스 Student의 인스턴스 변수 name과 age는 모두 private로 정의되었다.
이들 인스턴스 변수와 연결된 설정자와 접근자도 정의하였다.
'공부 > python' 카테고리의 다른 글
(python) 클래스와 객체3 - 정적 변수, 특수 메소드, 벡터/복소수 덧셈과 뺄셈,(번외. 파이썬에서의 변수의 종류) (0) | 2019.12.15 |
---|---|
(python) 클래스와 객체2 - 관련예제들2 (0) | 2019.12.15 |
(python) 튜플, 세트, 딕셔너리, 문자열7 - 관련예제들3 (0) | 2019.12.14 |
(python) 튜플, 세트, 딕셔너리, 문자열6 - 문자열, 슬라이싱, 문자열 in연산자와 not in연산자, 문자열 비교하기, 문자열에서 단어 분리 (0) | 2019.12.14 |
(python) 튜플, 세트, 딕셔너리, 문자열5 - 관련예제들2 (0) | 2019.12.14 |