프로그램을 '데이터'와 '절차'로 구성하는 방식의 프로그래밍 패러다임
특징
장점
단점
| 절차지향 | 객체지향 |
|---|---|
| 데이터와 해당데이터를 처리하는 함수(절차)가 분리 함수 호출의 흐름이 중요 | 데이터와 해당 데이터를 처리하는 메서드(메시지)를 하나의 객체로 묶음 객체간 상호작용과 메시지 전달이 중요 |
타입을 만든다클래스이다.name = 'Alice'
print(type(name)) # <class 'str'>인스턴스다.'hello', '파이썬' -> 문자열 타입(클래스)의 객체(인스턴스)[1, 2, 3], [1] -> 리스트 타입(클래스)의 객체(인스턴스)`hello`.upper()
문자열.대문자()
객체.행동()
인스턴스.메서드()[1, 2, 3].sort()
리스트.정렬해()
객체.행동()
인스턴스.메서드()**객체(Object) = 속성(Attribute) + 기능(Method)**
# 클래스 정의 _ 소괄호 생략 가능
class Person:
pass
# 인스턴스 생성
iu = Person()
# 메서드 호출
iu.메서드()
# 속성(변수) 접근
iu.attribute
# 클래스 정의
class Person:
# 속성(클래스 안에 속해있는 변수)
blood_color = 'red'
# __ __ : 개발자가 직접 호출하는 것이 아닌 자동 호출 되는 것
# 보통 객체를 생성할 때 자동으로 호출
# 초기화를 담당
def __init__(self, name):
self.name = name
def singing(self):
return f'{self.name}가 노래합니다.'
# 인스턴스 생성
singer1 = Person('BTS')
singer1 = Person('Blackpink')
# 메서드 호출
print(singer1.singing()) # BTS가 노래합니다.
print(singer1.singing()) # Blackpink가 노래합니다.
# 속성(변수) 접근
print(singer1.blood_color) # red
print(singer1.blood_color) # red
class Person:
def __init__(self, name):
self.name = name
singer1 = Person('BTS')
class Person:
def __init__(self, name):
# 인스턴스 변수
self.name = name
singer1 = Person('BTS')
class Person:
# 클래스 변수
blood_color = 'red'
def __init__(self, name):
# 인스턴스 변수
self.name = name
singer1 = Person('BTS')
class Person:
blood_color = 'red'
def __init__(self, name):
self.name = name
singer1 = Person('BTS')
class Person:
name = 'unknown'
def talk(self):
print(self.name)
p1 = Person()
p1.talk() # unknown
# p2 인스턴스 변수 설정 전/후
p2 = Person()
p2.talk() # unknown
p2.name = 'kim'
p2.talk() # kim
print(Person.name) # unknown
print(p1.name) # unknown
print(p2.name) # kim
가독성, 유지보수성, 재사용성을 높이는데 도움을 줌class Circle():
pi = 3.14
def __init__(self, r):
self.r = r
c1 = Circle(5)
c2 = Circle(10)
# c2 인스턴스 변수 pi를 할당
c2.pi = 5
print(Circle.pi) # 3.14 (클래스 변수)
print(c1.pi) # 3.14 (클래스 변수)
print(c2.pi) # 5 (새로운 인스턴스 변수)
# 클래스 변수 변경
Circle.pi = 5
print(Circle.pi) # 5 (클래스 변수)
print(c1.pi) # 5 (클래스 변수)
print(c2.pi) # 5 (새로운 인스턴스 변수)
class MyClass:
# 무조건 self를 사용해야 작동
def instance_methon(self,arg1,...):
pass
'hello'.upper()
str.upper('hello')
str 클래스가 upper 메서드를 호출했고, 그 첫번째 인자로 문자열 인스턴스가 들어간 것
'hello'.upper() 은 str.upper('hello')를 객체 지향 방식의 메서드로 호출하는 표현이다.
'hello'라는 문자열 객체가 단순히 어딘가의 함수로 들어가는 인자가 아닌 객체 스스로 메서드를 호출하여 코드를 동작하는 객체 지향적 표현
# 클래스 정의
class Person:
def __init__(self, name):
print(f'인스턴스가 생성되었습니다. {name}')
person1 = Person(' ') # 인스턴스가 생성되었습니다.
person2 = Person('지민') # 인스턴스가 생성되었습니다. 지민
class Myclass:
# @classmethod이 기호가 없으면 클래스 메서드가 아니다.
@classmethod
def class_method(cls, arg1, ....):
pass
class Person:
count = 0
def __init__(self, name):
self.name = name
Person.count += 1
@classmethod
def number_of_population(cls):
print(f'인구수는 {cls.count}입니다.')
person1 = Person('BTS')
person2 = Person('Blackpink')
Person.number_of_population() # 인구수는 2입니다.
class Myclass:
@staticmethod
def static_method(arg1, ...):
pass
class Stringut:
@staticmethod
def reverse_string(string):
return string[::-1]
@staticmethod
def capitalize_string(string):
return string.capitalize()
text = 'hello, world!'
reverse_text = Stringut.reverse_string(text)
print(reverse_text) # !dlrow ,olleh
capitalized_text = Stringut.capitalize_string(text)
print(capitalized_text) #hello, world!
인스턴스 메서드
-인스턴스의 상태를 변경하거나, 해당 인스턴스의 특정 동작을 수행
클래스 메서드
스태틱 메서드
클래스가 사용해야 할 것
인스턴스가 사용해야 할 것
But, 클래스는 클래스 메서드와 스태틱 메서드만 사용하도록 한다.But, 인스턴스는 인스턴스 메서드만 사용하도록 한다.절차 지향과 객체 지향은 대조되는 개념은 아니다.