
객체 지향 프로그래밍이란?
표현하고자 하는 대상을 객체로 지정하여 이들을 조합, 결합하는 방식으로 설계하는 프로그래밍 방법론입니다.
객체는 독립적이기 때문에 변화에 유연합니다. 코드 재사용으로 개발 비용을 줄일 수 있습니다. 또 직관적인 코드 분석이 가능해집니다.
객체 지향 프로그래밍의 특징 4가지
캡슐화(encapsulation)
객체의 속성(data fields)과 행위(methods)를 하나로 묶고, 실제 구현 내용 일부를 내부에 감추어 은닉합니다. 그렇게 직접적인 접근을 제어해 무분별하게 속성이 수정되는 것을 방지할 수 있습니다.
public, private, protected 같은 접근 제어자를 통해 객체의 데이터에 직접 접근을 제한하여 메소드를 통해서만 접근 가능하도록 설정합니다.
- public
- 모든 접근 허용
- private
- 자기 클래스 내부에서만 접근 허용
- protected
- 자기 클래스 내부 혹은 상속 받은 자식 클래스에서만 접근 허용
Python에서는 접근 제어자를 제공하지 않으므로 다음과 같이 “_” 접두사를 통해 약속합니다.
- public: variable
- private: __variable
- 기본적으로 Python에서도 __는 외부 접근을 제한합니다.
- 하지만 name mangling을 사용한다면 접근이 가능합니다.
- e.g. class A 인스턴스의 self.__num 변수 접근
- _A__num
- name mangling를 통해 외부에서도 접근이 가능하지만 private임을 “약속”합니다.
- protected: _variable
- 외부에서도 접근이 가능하지만 protected임을 “약속”합니다.
- getter와 setter 메소드를 사용하여 데이터 접근
- “_”를 통한 접근 제어자 약속과 property 데코레이터를 사용하면 간편하게 구현 가능합니다.
Class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, name):
if not isinstance(name, str):
raise
self._name = name
추상화(Abstraction)

일반화를 뜻합니다. 공통된 개념 또는 기능을 간추리는 것입니다.
인터페이스 혹은 추상 클래스를 통해 구현합니다.
- 인터페이스
- body가 없는 abstract method로만 이루어져 있어 모든 기능의 구현을 강제
- 파이썬에서는 인터페이스를 기능적으로 제공하지 않음
- 추상 클래스
- 해당 클래스를 상속받아 기능을 이용하고, 확장 시키기 위함.
- e.g. class MyBase(metaclass=ABCMeta)
상속(inheritance)

상위 클래스로부터 속성과 동작을 물려받습니다.
extends의 개념으로 생각하면 이해하기 쉽습니다. 상위 클래스의 속성과 동작을 물려받으면서 속성과 동작을 추가하여 확장합니다.
다형성(polymorphism)
한 요소에 여러 개념으로 해석될 수 있는 것을 의미합니다. 어떠한 요소가 맥락에 따라 다른 역할을 수행할 수 있다는 뜻입니다.
다형성을 나타내는 대표적인 예는 다음과 같습니다.
1. 기초 클래스 혹은 인터페이스로 구현한 상위 타입의 참조변수로 하위 타입들을 참조할 수 있도록 합니다.
class Parent: pass
class Child(Parent): pass
pa: Parent = Parent()
ch: Parent = Child()
Parent를 상속받은 Child 클래스는 Parent 타입을 참조 타입으로 사용할 수 있습니다.
2. 오버로딩: 같은 이름의 메소드가 인자의 개수 타입에 따라 다른 기능을 합니다.
파이썬에서 기능적으로 오버로딩을 지원하진 않지만 논리적으로 구현이 가능합니다. typing도 추가할 수 있습니다.
@typing.overload
def foo(bar: str) -> str: ...
@typing.overload
def foo(bar: int) -> int: ...
def foo(bar):
if isinstance(bar, str):
print("bar is str")
elif isinstance(bar, int):
print("bar is int")
return bar
3. 오버라이딩: 상위 클래스에서 정의한 메소드가 하위 클래스에 따라 다른 기능을 합니다.
class Parent:
def foo(self):
print("bar")
class Child:
def foo(self):
print("child bar")

객체 지향 프로그래밍이란?
표현하고자 하는 대상을 객체로 지정하여 이들을 조합, 결합하는 방식으로 설계하는 프로그래밍 방법론입니다.
객체는 독립적이기 때문에 변화에 유연합니다. 코드 재사용으로 개발 비용을 줄일 수 있습니다. 또 직관적인 코드 분석이 가능해집니다.
객체 지향 프로그래밍의 특징 4가지
캡슐화(encapsulation)
객체의 속성(data fields)과 행위(methods)를 하나로 묶고, 실제 구현 내용 일부를 내부에 감추어 은닉합니다. 그렇게 직접적인 접근을 제어해 무분별하게 속성이 수정되는 것을 방지할 수 있습니다.
public, private, protected 같은 접근 제어자를 통해 객체의 데이터에 직접 접근을 제한하여 메소드를 통해서만 접근 가능하도록 설정합니다.
- public
- 모든 접근 허용
- private
- 자기 클래스 내부에서만 접근 허용
- protected
- 자기 클래스 내부 혹은 상속 받은 자식 클래스에서만 접근 허용
Python에서는 접근 제어자를 제공하지 않으므로 다음과 같이 “_” 접두사를 통해 약속합니다.
- public: variable
- private: __variable
- 기본적으로 Python에서도 __는 외부 접근을 제한합니다.
- 하지만 name mangling을 사용한다면 접근이 가능합니다.
- e.g. class A 인스턴스의 self.__num 변수 접근
- _A__num
- name mangling를 통해 외부에서도 접근이 가능하지만 private임을 “약속”합니다.
- protected: _variable
- 외부에서도 접근이 가능하지만 protected임을 “약속”합니다.
- getter와 setter 메소드를 사용하여 데이터 접근
- “_”를 통한 접근 제어자 약속과 property 데코레이터를 사용하면 간편하게 구현 가능합니다.
Class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, name):
if not isinstance(name, str):
raise
self._name = name
추상화(Abstraction)

일반화를 뜻합니다. 공통된 개념 또는 기능을 간추리는 것입니다.
인터페이스 혹은 추상 클래스를 통해 구현합니다.
- 인터페이스
- body가 없는 abstract method로만 이루어져 있어 모든 기능의 구현을 강제
- 파이썬에서는 인터페이스를 기능적으로 제공하지 않음
- 추상 클래스
- 해당 클래스를 상속받아 기능을 이용하고, 확장 시키기 위함.
- e.g. class MyBase(metaclass=ABCMeta)
상속(inheritance)

상위 클래스로부터 속성과 동작을 물려받습니다.
extends의 개념으로 생각하면 이해하기 쉽습니다. 상위 클래스의 속성과 동작을 물려받으면서 속성과 동작을 추가하여 확장합니다.
다형성(polymorphism)
한 요소에 여러 개념으로 해석될 수 있는 것을 의미합니다. 어떠한 요소가 맥락에 따라 다른 역할을 수행할 수 있다는 뜻입니다.
다형성을 나타내는 대표적인 예는 다음과 같습니다.
1. 기초 클래스 혹은 인터페이스로 구현한 상위 타입의 참조변수로 하위 타입들을 참조할 수 있도록 합니다.
class Parent: pass
class Child(Parent): pass
pa: Parent = Parent()
ch: Parent = Child()
Parent를 상속받은 Child 클래스는 Parent 타입을 참조 타입으로 사용할 수 있습니다.
2. 오버로딩: 같은 이름의 메소드가 인자의 개수 타입에 따라 다른 기능을 합니다.
파이썬에서 기능적으로 오버로딩을 지원하진 않지만 논리적으로 구현이 가능합니다. typing도 추가할 수 있습니다.
@typing.overload
def foo(bar: str) -> str: ...
@typing.overload
def foo(bar: int) -> int: ...
def foo(bar):
if isinstance(bar, str):
print("bar is str")
elif isinstance(bar, int):
print("bar is int")
return bar
3. 오버라이딩: 상위 클래스에서 정의한 메소드가 하위 클래스에 따라 다른 기능을 합니다.
class Parent:
def foo(self):
print("bar")
class Child:
def foo(self):
print("child bar")