객체지향 프로그래밍이란?
- Python
- 2021. 10. 11. 22:54
코드잇의 객체지향 프로그래밍이란? 강의를 보고 정리한 내용입니다.
문제가 될 시 삭제하겠습니다.
객체 지향 프로그래밍이란?
1. 객체 지향 프로그래밍
객체 : 속성과 행동을 떠올릴 수 있는 모든 존재
객체지향 프로그래밍이란 : 프로그램을 여러 개의 독립된 객체들과 그 객체들 간의 상호작용으로 파악하는 프로그래밍 접근법
- 프로그램에 어떤 객체들이 필요할지 정한다.
- 객체들의 속성과 행동을 정한다.
- 객체들이 서로 어떻게 소통할지 정한다.
01. 클래스와 인스턴스
클래스(속성과 행동을 가진 틀)로 객체(인스턴스)를 만든다.
02. 인스턴스 변수
- 인스턴스 변수는 사용하기 전에 무조건 먼저 선언해야 함
class User: # 클래스
pass
user1 = User() # 객체 생성
user1.name = '김이름' # 인스턴스 변수
user1.email = '김이메일'
user1.password = '김비번'
03. 인스턴스 메소드
- 메소드의 종류
-
- 인스턴스 메소드
- 클래스 메소드
- 정적 메소드
-
class User:
def say_hello(some_user):
print('안녕하세요! 저는 {} 입니다.'format(some_user.name))
user1 = User()
user1.name = "김미니미"
User.say_hello(user1)
# 안녕하세요! 저는 김미니미 입니다.
04. 인스턴스 메소드의 특별한 규칙
- 인스턴스 메소드의 첫번째 파라미터를 self 로 쓰도록 함
class User:
def say_hello(self):
print("안녕하세요")
def login(self, my_email, my_password):
if (self.email == my_email and self.password == my_password):
print("로그인 성공")
else:
print("로그인 실패, 없는 아이디이거나 잘못된 비밀번호 입니다.")
user1 = User()
user1.name = "김대위"
user1.email = "captain@codeit.kr"
user1.password = "12345"
user1.login("captain@codeit.kr", "12345")
08. __init__ 메소드
- 객체 생성 시 처음으로 실행되는 메소드
class User:
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
user1 = User("young", "young@codeit.kr", "12345") # 인스턴스 변수 초깃값 설정
print(user1.name)
print(user1.email)
print(user1.password)
10. str 메소드
- __ 로 시작하는 메소드는 던더 메소드로 특정 상황일 때 자동으로 호출하는 메소드
class User:
def __init__(self, name, email, pw):
self.name = name
self.email = email
self.pw = pw
def __str__(self): # print 로 출력할 때 자동으로 호출됨
return "사용자 : {}, 이메일: {}".format(self.name, self.email)
user1 = User("김하이", "sldkfj@naver.com", "1234")
11. 클래스 변수 1
- 클래스 선언 아래에 선언한 변수
class User:
count = 0
def __init__(self, name, email, pw):
self.name = name
self.email = email
self.pw = pw
User.count += 1 # 클래스 변수가 생성될 때마다 count 1씩 늘리기
user1 = User("김하이", "sldkfj@naver.com", "1234")
print(User.count) # 1
12. 클래스 변수 2
- 클래스 변수 값 사용하기 : 클래스이름.클래스 변수 이름
class User:
count = 0
def __init__(self, name, email, pw):
self.name = name
self.email = email
self.pw = pw
User.count += 1
user1 = User("김하이", "sldkfj@naver.com", "1234")
user2 = User("김하이2", "sldkfj@naver.com", "1234")
user3 = User("김하이3", "sldkfj@naver.com", "1234")
User.count = 5
print(User.count) # 5
print(user1.count) # 5
print(user2.count) # 5
print(user3.count) # 5
13. 데코레이터 1
def print_hello():
print("안녕하세요")
def add_print_to(original): # 1
def wrapper():
print('함수시작') # 3
original() # 4
print('함수 끝') # 5
return wrapper # 2
add_print_to(print_hello)
#함수 시작
#안녕하세요!
#함수 끝
print_hello = add_print_to(print_hello)
print_hello()
14. 데코레이터 2
- 중복되는 동일한 기능을 함수 앞 뒤에 실행해야 될 때, 데코레이터 함수를 만들어서 편리하게 함수에 적용
def add_print_to(original): # 1
def wrapper():
print('함수시작') # 3
original() # 4
print('함수 끝') # 5
return wrapper # 1
@add_print_to
def print_hello():
print("안녕하세요")
print_hello()
#함수 시작
#안녕하세요!
#함수 끝
15. 클래스 메소드1
- @classmethod로 선언하고, 클래스 메소드의 첫번째 파라미터 이름은 꼭 cls 로 쓰기
class User:
count = 0
def __init__(self, name, email, pw):
self.name = name
self.email = email
self.pw = pw
User.count += 1
def say_hello(self):
print("안녕하세요 저는 {} 입니다".format(self.name))
def __str__(self):
print("이름 : {}, 이메일 : {}".format(self.name, self.email))
@classmethod
def number_of_users(cls):
print("총 유저수는 : {} 입니다.".format(cls.count))
user1 = User("김하이", "sldkfj@naver.com", "1234")
user2 = User("김하이", "sldkfj@naver.com", "1234")
user3 = User("김하이", "sldkfj@naver.com", "1234")
User.number_of_users()
- 인스턴스 메소드 사용
User.say_hello(user1) # 인스턴스 자신이 첫 번째 파라미터로 자동 전달
user1.say_hello()
- 클래스 메소드 사용
# 아래 두가지 방법 모두 첫번째 파라미터로 클래스 자동 전달
# @classmethod 가 사용되었기 때문
User.number_of_users()
user1.number_of_users()
16. 클래스 메소드 2
- 인스턴스 메소드 : 인스턴스 변수, 클래스 변수 모두 사용가능
- 클래스 메소드 : 인스턴스 변수 사용 불가
18. 정적 메소드
- 인스턴스 변수, 클래스 변수를 전혀 다루지 않는 메소드
- 정적 메소드는 메소드 정의 위에 @staticmethod 데코레이터를 표시해야 함
- 정적 메소드는 인스턴스 메소드의 self, 클래스 메소드의 cls 같은 자동으로 전달되는 메소드가 없음
@staticmethod
def is_valid_email(email_address):
return "@" in email_address
print(User.is_valid_email("taehosung"))
print(user1.is_valid_email("taehosung"))