Real Late Starter
[Python] 객체지향(Object Oriented Programming)의 이해 본문
이미 만들어논 코드를 재사용할 수 있다면, 불필요한 작업을 축소하고 효율성을 향상할 수 있고 결과적으로 생산성을 높일 수 있습니다. 객체지향 프로그래밍은 이러한 장점들을 제공하여 대규모 프로그램을 효율적으로 코딩할 수 있습니다. 파이썬에서 제공하는 강력한 기능인 객체지향 프로그램 기법에 대해 알아봅니다.
1. 객체지향(Object Oriented Programming)의 이해
객체지향 프로그래밍이란?
효율적인 프로그램을 만들기 위한 기술이다. 프로그램의 로직을 상태와 행위로 이루어진 객체를 만든 다음 해당 객체들을 레고 블록 처럼 조립하여 하나의 프로그램을 만드는 것이다.
객체 형성 => 객체 조립 => 프로그램 형성
즉, 객체들을 만들고 그 객체를 이용해 문제를 해결하는 프로그래밍 방법이다.
객체란 무엇인가요?
객체는 변수와 메서드로 구성되있습니다. 변수는 값을 가지고 메서드는 실행코드로서 이루어집니다. 이러한 변수와 메서드가 서로 연관된 것들끼리 묶어 만든 것이 객체입니다. 객체지향에서는 서로 연관된 변수와 메서드를 잘 파악하고 묶어 객체를 형성하는 것이 중요합니다.
결국, 객체 지향은 객체들을 부품으로 잘 조립해 만든 레고 블록과 비슷하다고 볼 수 있습니다. 이러한 부품은 한 군데에서만 사용하는 것이 아니라 여러군데에서 재사용할 수 있습니다. 부품화와 재사용성은 객체지향의 가장 큰 특징입니다.
이러한 객체 부품을 만들기 위한 청사진, 설계도를 클래스라고 합니다.
클래스(Class) :
- 부품 객체를 만들기 위한 청사진, 설계도, 템플릿
- 추상화의 과정을 통해 형성
- 같은 문제 도메인에 속하는 속성(attribute)과 행위(behavior)를 정의
- 객체지향 프로그램의 기본적인 사용자 정의 데이터 타입
객체(Object, Instance) :
- 메모리에 로딩된 클래스를 통해 클래스를 템플릿으로 하여 메모리 상에 생성된 정보 => 인스턴스
- 자신 고유의 속성을 가지며 클래스에서 정의한 행위 수행
- 객체의 행위는 클래스에서 정의된 행위에 대한 정의를 공유함으로써 메모리를 효율적으로 사용
메서드(Method) :
- 메시지(Message)라고도 부름
- 클래스로부터 생성된 객체 사용 시 객체에 명령을 내리는 행위
- 객체가 가지고 있는 메서드를 호출한다.
- 객체에 메시지를 전달한다.
- 한 객체의 속성을 조작할 목적으로 사용
- 객체 간의 통신은 메시지 전달을 통해 이루어짐
객체지향 프로그램의 특징
1. 추상화
- 객체에서 공통된 속성과 행위를 추출하는 것
- 불필요한 정보는 숨기고, 중요한 정보만 표현해 프로그램을 간단하게 만드는 것
- 공통의 속성과 행위를 찾아서 타입을 정의하는 과정
■ 추상 데이터 타입
1) 데이터 타입의 표현과 연산을 캡슐화
2) 접근 제어를 통해 데이터의 정보를 은닉할 수 있음
추상 데이터 타입 | 추상 데이터 타입의 인스턴스 | 추상 데이터 타입에서 정의된 연산 |
클래스 | 객체 | 메서드 |
2. 상속
- 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것을 말합니다.
- 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능
기존의 클래스 | 부모 클래스 | 기반 클래스 | 상위 클래스 | 슈퍼 클래스 |
▼ | ▼ | ▼ | ▼ | |
새로운 클래스 | 자식 클래스 | 파생 클래스 | 하위 클래스 | 서브 클래스 |
- 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스 수정이 가능합니다.
- 클래스 간의 종속관계를 형성하여 객체를 조직화 할 수 있습니다.
상속을 하게되면 부모 클래스에서 많은 코드를 물려받음으로써
1) 재사용으로 인한 코드가 줄어든다.
2) 범용적인 사용이 가능하다.
3) 자료와 메서드의 자유로운 사용 및 추가 가능
3. 다형성
- 다양한 형태로 나타날 수 있는 특징
- 객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러개 정의하거나 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 바로 다형성이라는 특징을 갖게 됩니다.
- 어떤 한 요소에 여러 개념을 넣어 놓는 것
오버라이딩 | 오버로딩 |
같은 이름의 메서드가 여러 클래스에서 다른 기능을 하는 것 |
같은 이름의 메서드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것 |
■ 메서드 오버라이딩 :
- 상속으로 물려 받은 자료나 메서드를 그대로 사용하지 않고 하위 클래스에서 새로 정의해 사용하는 기법
- 상위 클래스의 메서드와 동일한 서명(매개변수의 타입, 개수, 리턴 타입)을 가져야 함
- 코드의 재사용성 향상
■ 메서드 오버로딩 :
- 클래스 내부에 동일한 이름의 행위를 여러 개 정의하는 것
- 매서드의 이름이 같고, 매개변수의 타입과 수는 서로 달라야 함
- 리턴 타입은 관게하지 않음
- 메서드 이름을 하나로 통일 가능하며, 같은 이름의 메서드에 여러 종류의 매개 변수를 받을 수 있음
2. 클래스 정의
클래스는 객체 생성을 위한 청사진 또는 템플릿이라고 하였습니다.
클래스 설계 -> 클래스 제작 -> 객체 생성
클래스 정의 및 객체 생성
# 클래스 정의
class 클래스명:
...
# 객체 생성
뱐수 = 클래스명() # 생성자 메서드 : 클래스 이름과 동일한 메서스
클래스의 코드 블록 안에 필드와 메서드를 정의해 사용할 수 있다.
class Club:
pass
Player = Club()
if isinstance(Player, Club):
print("Player Club 클래스의 인스턴스입니다.")
# 클래스 생성자 메서드 정의
class 클래스명:
def __init__(self, 매개변수목록):
...
# 클래스 소멸자 메서드 정의
class 클래스명:
...
def __del__(self):
...
- self : 객체 공간을 가리키는 식별자, 관습적으로 사용함
- 객체공간의 필드와 메서드에 접근할 경우 self.식별자 형식을 이용한다.
3. 클래스와 인스턴스의 특징
1) 인스턴스 메서드
- self가 가리키는 객체의 필드 정보에 접근해 특정 목적의 기능을 수행하도록 정의된 메서드
2) 인스턴스 변수
- 클래스 내에서 self.변수 형태를 가지는 변수
- 객체마다 가지고 있는 객체 고유의 정보
- 하지만 입력 데이터의 검증을 위해 적절한 멤버 필드의 접근 제한이 필요하다.
- 파이썬에서는 이를 위해서 외부에서 필드에 접근하는 것을 제한할 수 있는 기능을 제공한다.
# 인스턴스 변수의 접근 제한 기능
class Player:
self.__name = name # name 앞에 __를 붙여주면 프라이빗 필드를 생성할 수 있다.
프라이빗 필드를 만들게 되면 외부에서 접근할 수 있는 공개된 getter/setter 메서드를 제공할 것인지 고민을 해야한다.
※ getter : 멤버를 읽어오는 메서드
※ setter : 멤버를 변경하는 메서드
한편, 파이썬에서는 getter/setter를 대신할 수 있는 기능으로 데코레이터(decorator) 기능을 제공합니다.
class Player:
@property
def name(self):
3) 클래스 변수
- 클래스 변수는 인스턴스 변수와 다르게 클래스 내에서 self가 아닌 클래스명.변수 형식으로 선언된 변수
클래스 변수의 정의 및 접근
# 클래스 변수 정의
class 클래스명:
클래스변수 = 값
# 클래스 변수 접근
클래스명.클래스변수
클래스 변수의 count 활용법
4) 클래스 메서드
- 클래스가 소유한 메서드
클래스 메서드의 정의
class 클래스명:
# cls : 클래스 자신에 대한 참조 전달
@classmethod
def 클래스메서드(cls, 매개변수목록):
pass
# 클래스 메서드의 사용
클래스명.클래스메서드(매개변수목록)
5) 연산자 오버로딩
파이썬에서 연산자는 각 클래스에 미리 정의된 메서드와 맵핑되어있습니다. 우리가 제작하는 사용자 정의 클래스의 경우에는 연산자들에 대해 맵핑되어있는 메소드가 없으므로 연산자를 사용하려면 연산자를 중복해서 정의해야합니다.
이를 바로 연산자 오버로딩이라고 합니다.
4. 클래스 상속
클래스 상속을 정의하는 방법
# 클래스 상속
class 클래스명(부모클래스명):
1) 메서드 오버라이딩
- 메서드 오버라이딩은 상속관계에서 부모클래스에 있는 메서드와 동일한 서명을 가진 메서드를 자식 클래스에서 다시 정의해 사용하는 것입니다.
- 메서드를 오버라이딩하면 부모클래스에서 정의한 메서드가 아닌 자식클래스에서 정의한 메서드를 사용하게 된다.
이 포스트는 SW Expert Academy(https://swexpertacademy.com/)에서 파이썬 프로그래밍기초(2)을 들으며 정리한 내용입니다.
'Python' 카테고리의 다른 글
[Python] Dictionary 값 value 로 정렬하기 (0) | 2020.03.04 |
---|---|
[Python] 예외 처리 (0) | 2020.03.03 |
[Python] 내장함수 (0) | 2020.03.03 |