Programming Language/Python
[Python] 객체지향 프로그래밍 1
Sergemeow
2023. 3. 15. 00:16
객체 지향 프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나.
객체 지향 프로그래밍은 컴퓨터 프로그래밍을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고 받고, 데이터를 저장할 수 있다.
- 객체지향의 장점
- 재사용이 가능하다.
- 그 자체로 데이터와 행동이 정의됨 - 독립적. 개발자가 내부 구조를 몰라도 호출하여 다른 객체와 조립하며 개발이 가능
- 객체 단위로 모듈화하여 개발할 수 있으므로 많은 인원이 참여하는 대규모 소프트웨어 개발 가능
- 개발 용이성, 유지보수 편의성, 신뢰성을 바탕으로 생산성 증가
- 객체지향의 단점
- 설계 시 많은 노력과 시간이 필요
- 다양한 객체들의 상호 작용 구조를 만들기 위해 많은 시간과 노력이 필요
- 실행 속도가 상대적으로 느림
- 절차지향 프로그래밍이 컴퓨터의 처리구조와 비슷하여 상대적으로 더 빠름
- 설계 시 많은 노력과 시간이 필요
객체
컴퓨터 과학에서 객체 또는 Object는 클래스에서 정의한 것을 토대로 메모리에 할당된 것으로, 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료구조, 함수 또는 메서드가 될 수 있다.
객체예시_ 가수)
- 속성(정보 - 변수): 직업, 생년월일, 국적 …
- 행동(동작 - 함수): 랩, 댄스, 호응유도 …
클래스로 만든 객체를 인스턴스라고도함.
예시) 이찬혁은 가수의 인스턴스이다.
name = 'Daeyhun'
print(type(name))
...
# <class 'str'>
...
# string 클래스에 대한 인스턴스로 name이 만들어진 것
- 객체의 특징
- 타입(type) : 어떤 연산자(operator)와 조작(method)이 가능한가
- 속성(attribute) : 어떤 상태(데이터)를 가지는가
- 조작법(method) : 어떤 행위(함수)를 할 수 있는가
문법
- 클래스 정의…
- class MyClass:
- 인스턴스 생성
- my_instance = MyClass()
- 메서드 호출
- my_instance.my_method()
- 속성 접근
class Person: pass print(type(Person)) #<class 'type'> person1 = Person() print(isinstance(person1, Person)) # True print(type(person1)) # <class ' __main__.Person'>
- my_instance.my_attribute
- 객체 비교하기
- ==
- 동등한.
- 변수가 참조하는 객체가 동등한(내용이 같은) 경우 True
- 두 객체가 같아 보이지만 실제로 동일한 대상을 가리키고 있다고 확인해 준 것은 아님
- is
- 동일한(identical)
- 두 변수가 동일한 객체를 가리키는 경우 True
a = [1, 2, 3] b = [1, 2, 3] print(a == b, a is b) # True False a = [1, 2, 3] b = a print(a == b, a is b) # True True
- ==
속성
- 특정 데이터 타입/클래스의 객체들이 가지게될 상태/데이터를 의미
- 클래스 변수/인스턴스 변수가 존재
class Person:
blood_color = 'red' #클래스 변수
population = 100 #클래스 변수
def __init__(self, name):
self.name = name #인스턴스 변수
인스턴스와 클래스 간의 이름 공간
- 클래스를 정의하면 클래스와 해당하는 이름 공간 생성
- 인스턴스를 만들면, 인스턴스 객체가 생성되고 이름 공간 생성
- 인스턴스에서 특정 속성에 접근하면, 인스턴스-클래스 순으로 탐색
인스턴스 변수
- 인스턴수 변수란?
- 인스턴스가 개인적으로 가지고 있는 속성(attribute)
- 각 인스턴스들의 고유한 변수
- 생성자 메서드(init)에서 self.<name>으로 정의
- 인스턴스가 생성된 이후 <instance>.<name>으로 접근 및 할당
class Person:
# 아래는 생성자!!(constructor)
def __init__(self, name): # instance variable declaration (Person을 생성할 때...)
self.name = name
john = Person('john') #인스턴스 변수 접근 및 할당
print(john.name) #john
john.name = 'John Kim' #인스턴스 변수 접근 및 할당
print(john.name) #John Kim
class Person: # count 변수를 써서 생성 시 마다 숫자 늘림 - 카운트됨
count = 0
#인스턴스 변수 설정
def __init__(self, name):
self.name = name
Person.count += 1
person1 = Person('IU')
person2 = Person('Lee')
self
- 인스턴스 자기자신
- 파이썬에서 인스턴스 메서드는 호출 시 첫번째 인자로 인스턴스 자신이 전달되게 설계
- 매개변수 이름으로 self를 첫번째 인자로 정의
- 다른 단어로 써도 동작하지만 암묵적인 규칙
메서드
- 특정 데이터 타입/클래스의 객체에 공통적으로 적용 가능한 행위(함수)
class Person:
def talk(self):
print('Hello')
def eat(self, food):
print(f'{food}를 냠냠')
person1 = Person()
person1.talk() # Hello
person1.eat('피자') # 피자를 냠냠
1. 인스턴스 메서드
인스턴스 변수를 사용하고 싶을 때.
2. 클래스 메서드
클래스가 사용. 클래스 변수를 사용할 때
3. 정적 메서드(static method)
1) 인스턴스 메서드
- 인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하는 메서드
- 클래스 내부에 정의되는 메서드의 기본
- 호출 시, 첫번째 인자로 인스턴스 자기자신(self)이 자동으로 전달됨
1-2) 매직 메서드
- Double underscore(__)가 있는 메서드는 특수한 동작을 하기 위해 만들어진 메서드로, 스페셜 메서드 또는 매직 메서드라고 불림
- 특정 상황에서 자동으로 불리는 메서드
- 예시
- __ str __(self), __ len __(self) __, etc…
class Person:
def __str__(self):
pass # Person 클래스를 출력하면. 하나의 문자열처럼 만들 때.
1-3) 생성자(constructor) 메서드
- 인스턴스 객체가 생성될 때 자동으로 호출되는 메서드
- 인스턴스 변수들의 초기값을 설정
- 인스턴스 생성
- __ init __ 메서드 자동 호출
2) 클래스 메서드
- 클래스가 사용할 메서드
- @classmethod 데코레이터를 사용하여 정의
- 함수를 어떤 함수로 꾸며서 새로운 기능을 부여
- @데코레이터(함수명) 형태로 함수 위에 작성
- 순서대로 적용 되기 때문에 작성 순서가 중요
- 호출 시, 첫번째 인자로 클래스가 전달됨
class Person:
count = 0
def __init__(self, name):
self.name = name
Person.count += 1
@classmethod
def number_of_popul(cls):
print(f'the popul is {cls.count}')
person1 = Person('IU')
person2 = Person('Elvis')
Person.number_of_popul() # the popul is 2
person1.number_of_popul()
person2.number_of_popul()
- 데코레이터 예시
# 1) 함수 + 함수
def ko_hello(name):
print(f'안녕하세요, {name}님')
def en_hello(name):
print(f'Hello, {name}')
def add_emoji(name, func):
func(name)
print('^~^//')
add_emoji('Andrew', ko_hello)
# 2) 함수 안에 함수
def emoji_decorator(func):
def wrapper(name):
func(name)
print('^~^//')
return wrapper
def ko_hello(name):
print(f'안녕하세요 {name}')
def en_hello(name):
print(f'Hello, {name}')
new_func = emoji_decorator(ko_hello)
en_func = emoji_decorator(en_hello)
# new_func 안에는 wrapper가 담김
new_func('An') # '안녕하세요 An'
en_func('An') # 'Hello An'
# 3) 데코레이터 사용
def emoji_decorator(func):
def wrapper(name):
func(name)
print('^~^//')
return wrapper
@emoji_decorator
def ko_hello(name):
print(f'안녕하세요, {name}님')
ko_hello('An')
- 함수 작성시 인스턴스 변수를 안쓴다면 클래스 메서드로 해도 좋음
스태틱 메서드
- 인스턴스 변수, 클래스 변수를 전혀 다루지 않는 메서드
- 속성을 다루지 않고 단지 기능만을 하는 메서드를 정의할 때 사용
- @staticmethod 데코레이터로 정의됨
- 예시
class Person:
count = 0
def __init__(self, name):
self.name = name
Person.count += 1
@staticmethod
def check_rich(money):
return money > 10000
person1 = Person('IU')
print(Person.check_rich(100000)) #True
print(person1.check_rich(100000)) #True
class MyClass:
def method(self):
return 'instance method', self
@classmethod
def classmethod(cls):
return 'class method', cls
@staticmethod
def staticmethod():
return 'static method'
my_class = MyClass()
print(my_class.method())
print(my_class.classmethod())
print(my_class.staticmethod())