파이썬
객체지향특징
#
Find similar titles
- (rev. 34)
- jhjeon
Structured data
- Category
- Computer science
Table of Contents
객체지향 (Object Orientetion) #
객체지향은 어떤 물제의 특징을 파악하고 고유의 특징을 뽑아내는 것(추상화)을 말한다. 객체라는 개념을 통해 프로그램이 사람이 생각하는 방식에 가깝게 프로그래밍 하는 것을 가능하게 하였다. 객체지향이라는 개념이 나타나기 전의 사용되었던 절차지향 프로그램은 어떤 일을 할 때마다 다음에 무엇을 해야 하는지 함수와 변수들을 새로 알려주는 방식으로, 컴퓨터가 해야 할 일을 알려주기 바빴다.
객체지향 프로그래밍은 프로그램을 작성할 대상이 되는 실제 세계의 사물(객체)을 그대로 표현하고, 그것들이 어떻게 작동하는지 정해주고 나서야 비로소 그 객체들을 작동시킨다. 그러므로 보다 빠르고 이해하기 쉬우며 수정하기 쉽게 프로그램을 만들 수 있다.
객체지향 프로그래밍 (Object Oriented Programming, OOP) #
객체지향 프로그래밍은 절차지행 프로그래밍(Functional Programming, FP)과 달리 프로그램을 절차 중심이 아닌 객체 중심으로 개발하는 것이다. 즉, 구현하고자 하는 프로그램 안에서 필요한 객체들이 무엇인지 정의하고 그 객체들이 서로 어떻게 상호작용하는지를 파악하여 프로그램을 개발하는 것이다. 다음은 객체지향과 절차지향 프로그래밍의 특징을 정리한 것이다.
출처 : https://blogs.sap.com/2017/02/26/functional-programming-simulate-curry-in-abap/
객체지향 5가지 원칙 #
구분 | 설명 |
---|---|
SRP (Single Responsibility Principle) | 단일 책임 원칙 |
OCP (Open-Closed Principle) | 개방 폐쇄 원칙 |
LSP (Liskov Substitution Principle) | 리스코프 치환 원칙 |
ISP (Interface Segragation Principle) | 인터페이스 분리 원칙 |
DIP (Dependency Inversion Principle) | 의존관계 역전 원칙 |
표1 객체지향 5가지 원칙 |
출처: * github.io
클래스(Class)와 인스턴스(Instance) 객체 생성 #
객체지향언어인 파이썬은 class를 통해 객체지향 프로그래밍을 한다. 클래스는 class 클래스이름(상속받을 클래스이름)
으로 정의할 수 있다. 클래스명은 일반적으로 대문자로 시작하며 CamelCase([카멜표기법])를 따른다. 그리고 정의한 클래스 안에 속성과 메소드를 정의한다.
# 기본적인 클래스 정의 방법
class Human():
age = 10
def eat(self):
...
def smile(self):
...
네이마르(Neymer), 메시, 손흥민을 클래스로 정의해보자. 이들 셋의 공통점은 축구선수이다. 여기서 축구선수라는 개념은 실체하는 것이라기 보다는 앞에 나열됐던 '축구하는 사람(Soccer Player)'을 지칭하는 말이며 이를 class로 예제와 같이 지정할 수 있다.
# 네이마르, 메시, 손홍민 클래스 정의
class SoccerPlayer: # 축구선수의 정의
technical_skills = 10
def shoot(self): # 슛하기 Method
return "GOAL!!"
>>> neymer = SoccorPlayer()# 네이마르를 축구선수라고 정의 (인스턴스 생성)
>>> neymer.shoot() # 네이마르가 슈팅
'GOAL!!'
>>> messi = SoccerPlayer() # 메시를 축구선수라고 정의
>>> messi.shoot() # 메시가 슈팅
'GOAL!!'
>>> son = SoccorPlayer() # 손흥민를 축구선수라고 정의
>>> son.shoot() # 손흥민이 슈팅
'GOAL!!'
여기서 Neymer
와 Son
은 인스턴스(instance)라고 지칭한다. Soccer_Player
라는 클래스에 shoot()
메소드를 정의하였기 때문에 네이마르도 손흥민도 골을 넣을 수 있다. Class의 성질(attribute)은 해당 클래스의 메소드와 변수들을 지칭한다고 볼 수 있다.
클래스 뿐만아니라 파이썬의 모든 데이터 유형은 객체이다. 아래와 같이 문자열도 속성과 메소드를 가지고 있는 객체라는 것을 알 수 있다.
>>> a = 'hello world'
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
이처럼 문자열 뿐만아니라 사전, 리스트 등 모든것이 객체임을 확인 할 수 있다.
상속 (Inheritance) #
상속이란 어떤 class가 다른 class의 속성(attribute)를 물려받는 것을 뜻한다. 즉, 어떤 class를 만들 때 핵심 속성을 지니고 있는 다른 class로 부터 그 속성을 만들고자하는 클래스에 상속할 수 있다. 예를 들면 아래와 같다.
class Apprentice(SoccerPlayer): #축구선수클래스를 상속받는 새 클래스 정의
technical_skills = 3 # 상속받은 속성 재정의
def practice(self):
print '연습, 연습, 연습'
>>> a_player = Apperentice() #a_player를 견습생으로 정의 (인스턴스 생성)
>>> a_player.practice()
'연습, 연습, 연습'
예제와 같이 새 클래스 Apprentice
는 기존에 정의했던 Soccer_player
를 상속받아 정의 되었다. 그러므로 Apprentice
클래스는 Soccer_player
가 가지고 있는 technical_skills
와 shoot()
을 가지게 된다. 이때, technical_skills = 3
으로 변수의 값을 재정의 하였다. 그리고 새로운 메소드 practice()
도 추가하였다.
이렇게 상속을 통해 기존 클래스의 핵심 속성을 상속받고 새로운 클래스의 특성에 맞도록 속성을 변경하거나 추가할 수 있다. 상속을 이용하면 불필요한 중복코드를 줄일 수 있다는 장점이 있다.