0. 객체란?
* 객체 지향 프로그램의 특징
프로그래밍 용어로 파이썬은 객체지향적(object-oriented)라고 표현합니다. 이는 파이썬 내에서 객체를 사용하는 것이 가능하다는 뜻입니다. 객체 지향 프로그래밍의 특징은 기본적으로 자료 추상화, 상속, 다형 개념, 동적 바인딩 등이 있으며 추가적으로 다중 상속 등의 특징이 존재합니다. 객체 지향 프로그래밍은 자료 추상화를 기초로 하여 상속, 다형 개념, 동적 바인딩이 시스템의 복잡성을 제어하기 위해 서로 맞물려 기능하는 것입니다.
1. 자료 추상화
자료 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것입니다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통해서 자료형의 정보를 은닉할 수 있습니다. 객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴스를 객체, 추상 자료형에서 정의된 연산을 메소드(함수), 메소드의 호출을 생성자라고 합니다. 추상 자료형은 접근 제어를 통해서 자료형의 정보를 은닉할 수 있습니다.
* 캡슐화란?
- 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고,
- 실제 구현 내용 일부를 외부에 감추어 은닉한다.
* 메서드로만 데이터를 획득하거나 변경할 수 있도록 객체의 데이터에 대한 접근을 제한하는 것을 프로그래밍 용어로 데이터 은닉(data hiding)이라고 합니다.
# 데이터 은닉의 예
위 두 방법모두 wizard의 skill_level을 2로 설정할 것입니다. 그렇지만 첫번째 예시는 메서드로만 데이터를 변경할 수 있도록 접근을 제한하였고, 두번째 예시는 메서드를 사용하지 않고 직접 속성을 변경하였습니다. 속성을 바로 수정하지 않고 수고롭게 메서드를 만든 데에는 두가지 이유가 있습니다.
- 속성에 직접 접근할 경우 level up을 시킬 최소한 두 가지 부분이 필요합니다. 즉, skill_level을 변경하는 부분과 skill_string을 변경하는 부분입니다. 메서드를 이용하면 한 번의 메서드 호출로 원하는 작업을 모두 할 수 있습니다.
- 또한 메서드를 사용하면 skill_level이 증가하기만 하고 감소하지는 않게끔 만들 수 있습니다.
2. 다형성(polymorphism) : 동일한 메서드이름, 다른 동작 방식
다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메서드가 여러 클래스에서 다른 기능을 하는 것)이나 오버로딩(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미합니다. 즉, 다형성은 서로 다른 클래스에 이름이 같은 두 개(또는 그 이상)의 메서드를 둘 수 있다는 뜻입니다. 다형 개념을 통해서 프로그램 안 객체 간의 관계를 조직적으로 나타낼 수 있습니다.
# 다형성 예
Wizard 클래스와 Archer 클래스 모두 levelUp( )이라는 메서드가 들어 있습니다. 두 직업에 대해 모두 levelUp( ) 메서드를 사용했지만 각 직업에 대해 서로 다른 동작을 수행했습니다. 이것이 바로 다형성의 예입니다.
3. 상속
객체지향 프로그래밍에서 클래스는 다른 클래스로부터 속성과 메서드를 물려받을 수 있습니다. 상속은 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능입니다. 상속을 받는 새로운 클래스를 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 합니다. 상속을 통해서 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있습니다.
클래스를 상속하는 코드는 다음과 같습니다.
>>> [ class 상위클래스이름 ]
>>> 코드
>>> [ class 하위클래스이름(상위클래스이름) ]
>>> 코드
하위 클래스를 만들때는 클래스 이름에 ( )를 붙이고 안에 상위 클래스 이름을 넣으면 됩니다.
# 클래스 상속 예시
-> Son 클래스에는 greeting 메서드가 없지만 Parents 클래스를 상속받았으므로 Parents의 메서드인 greeting 메서드를 호출할 수 있습니다.
** 오버라이딩의 예 **
-> 위 예시처럼 같은 이름의 메서드가 여러 클래스에서 다른 기능을 하는 것을 오버라이딩(overriding) 이라고 합니다.
오버라이딩의 사전적 의미는 '다른 무엇보다 더 중요한, 최우선시 되는' 으로 보통 상위 클래스에서 이름은 같으나 하위 클래스의 기능을 다르게 하여 더 우선시 하고 싶을 때 사용합니다.
** 다중 상속 **
다중 상속은 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능입니다. 클래스들의 기능이 동시에 필요할 때 용이하나 클래스의 상속 관계에 혼란을 줄 수 있고(예: 다이아몬드 상속) 프로그래밍 언어에 따라 사용 가능 유무가 다르므로 주의해서 사용해야 합니다. 참고로 JAVA는 지원하지 않습니다.
# 다중 상속의 예
-> Son(Mom, Dad) 와 같이
[ class 하위클래스이름( 상위클래스이름1, 상위클래스이름2, ... ) ]
로 코드를 작성하면 여러개의 클래스 기능을 모두 상속받을 수 있습니다.
4. 동적 바인딩
동적 바인딩은 실행 시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩으로 컴파일 시간에 완료되어 변화하지 않는 정적 바인딩과 대비되는 개념입니다. 동적 바인딩은 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현합니다.
참고문헌
[1] 위렌 산데/ 카터 산데, 헬로! 파이썬 프로그래밍, 위키북스, 2015
[2] 위키백과, 객체 지향 프로그래밍
'프로그래밍 > Python 프로그래밍 기초' 카테고리의 다른 글
7. 파이썬 기초 (객체 초기화, __itit__, initializing, 특수 메서드, __str()__ , self , class 예시) (2) | 2021.02.11 |
---|---|
6. 파이썬 기초 (객체 object, 클래스 class, 인스턴스 instance, 속성 attribute, 메서드 method) (0) | 2021.02.03 |
5. 파이썬 기초 (함수, function, def, return value) (0) | 2021.01.24 |
4. 파이썬 기초 (파이썬 반복문, for 반복문, range, while 반복문, break, continue) (0) | 2021.01.22 |
3. 파이썬 기초 (파이썬 조건문, condition, 연산자, if, elif, else) (0) | 2021.01.21 |