Skip to content

Latest commit

 

History

History
136 lines (98 loc) · 5.93 KB

Object-Oriented-Programming.md

File metadata and controls

136 lines (98 loc) · 5.93 KB

Object Oriented Programming

해당 내용은 Python에 국한되는 내용이 아니지만 앞으로 Class와 Object를 배움에 있어 기본적으로 알고 있으면 좋은 개념들입니다.

프로그래밍을 하는 이유는 "문제를 풀기 위함"인 것은 누구나 알고 있습니다. 수학 문제를 풀 때도 여러가지 접근 방식이 있듯이 프로그래밍 문제를 해결하는데도 여러가지 접근 방법이 있습니다. 그 중 Object Oriented Programming(이하 OOP)은 객체를 만들어 문제를 해결하는 방법입니다.

Tip👀

문제를 해결하는데 있어서 다양한 접근법이 존재합니다.

Programming paradigm ex*
Procedual Programming C
Object Oriented Programming Python, C++
Functional Programming Haskell, Scheme

여기 예시들에 있는 언어를 사용하면 무조건 해당 접근법으로 문제를 풀어야하는게 아닙니다. 예시로 나온 언어들이 해당 paradigm을 지원하는 언어로 자주 쓰인다는 의미로 받아드리면 될 것 같습니다.

Python 같은 경우, multi-paradigm programming language라고 합니다. 즉 여러 paradigm으로 문제를 해결 할 수 있습니다.

그렇다면 객체를 통해 문제를 해결한다는 말에서 객체는 무엇일까요? 객체라고 하는 것은 본연의 특성과 행동을 지니고 있는 대상이라고 보시면 될 것 같습니다. 디냥이🐈라는 객체를 예를 들어 봅시다.

디냥이🐈에게는 이름, 나이, 성별이 객체의 특성이라고 할 수 있겠죠. 또한 디냥이는 잠자기, 밥먹기등 여러 가지 행동들을 할 수 있습니다. 이러한 행동과 특성에 대한 집합체를 프로그래밍에서는 객체(Object)라고 합니다.

만약 Python으로 디냥이라는 객체(Object)를 만든다고 하면 위와 같은 특성과 행동을 각각 변수와 함수로 구현할 수 있겠죠?

이처럼 OOP는 어떠한 객체를 구상할 때, 추상적으로 구현하는 것을 전제로 만들게 됩니다. 이와 같은 특성을 추상화(abstraction)이라고 합니다.

추상화(abstraction)을 포함하여 OOP에서는 중요한 개념 4가지가 있습니다.

해당 개념을 전부 숙지하신 뒤에 다음의 글을 읽으시면 좋습니다.

Everything is an Object in Python

Python의 모든 것들은 Object로 구성되어 있습니다. Type conversion(Typecasting) - type() function의 예시에서 이미 한 번 경험하셨을 것입니다. 해당 예시를 재활용 하자면 다음과 같습니다.

print(type(10))
print(type(1.2))
print(type(1+2j))
print(type("hello"))
# 출력 결과
<class 'int'>
<class 'float'>
<class 'complex'>
<class 'str'>

당시에는 언급하지 않았지만 type()이라는 함수는 type()의 argument를 받으면 해당 parameter가 어떤 class로 만들어진 object인지 알려주는 함수입니다. 이러한 함수가 동작할 수 있는 이유는 모든 data들이 class를 통해 만들어진 Object이기 때문에 가능합니다.

물론 Python에서 제공하는 Built-in data sturcture들도 Object입니다.

print(type([]))
print(type(()))
print(type({}))
print(type(set()))
# 출력 결과
<class 'list'>
<class 'tuple'>
<class 'dict'>
<class 'set'>

여기서 그치지 않고 function또한 Object임을 type()을 통해 알 수 있습니다.

def func():
    """this is a fucntion"""
    pass

print(type(func))
# 출력 결과
<class 'function'>

당연히 여러분들이 만든 User-defined Class으로 만들어낸 객체 또한 Object입니다.

혼란스러울 수도 있습니다만 그럴 수록 정의에 입각한 사고로 바라보시면 됩니다. 앞서 말씀드렸다 시피 Objectattributebehavior들의 집합체라고 하였습니다.

정의에 따라 모든것이 Object인지를 확인해 보도록 합시다.

Litaral values

int, float, complex, str의 경우 이미 어떠한 method들이 있는지 알고 있습니다. 당장에 Operators만 하더라도 다양한 method들이 있음을 확인 할 수 있습니다. Polymorphism - Special method overriding에서 다뤘다시피 operators도 special method를 호출하여 계산되어 집니다.

Built-in Data structure

list, tuple, set, dict 또한 각각의 문서에서 어떠한 method들이 있는지 Built-in Data structure를 통하여 잠시 언급하였습니다.

Function

Functions - docstring에서 깊게 설명하지 않은 부분이 바로 docstring 부분이었는데요. 이부분에 대해 다시 한 번 보자면 다음과 같습니다.

def func():
    """this is a function"""
    pass
print(func.__doc__)
# 출력 결과
this is a function

위와 같이 """ """로 적은 함수의 설명이 __doc__라는 instance variable에 저장되어 있는 것을 확인 할 수 있습니다.

Tip👀

사실 위와 같이 확인할 필요 없이 다음의 명령어를 치면 어떻게 Object가 어떻게 구현되어 있는지 자세하게 확인할 수 있습니다.

help(Object)

드디어 python의 끝이 보이기 시작하는 것 같습니다. 다음 문서에서는 여태 나왔었던 error들이 어떻게 출력되는지, error에는 어떠한 종류가 있는지, 사용자 정의 error를 만드는 방법에 대해 소개해 드리도록 하겠습니다.


Go - Errors & Exceptions