객체지향 프로그래밍이란?

코드잇의 객체지향 프로그래밍이란? 강의를 보고 정리한 내용입니다.
문제가 될 시 삭제하겠습니다.

객체 지향 프로그래밍이란?

1. 객체 지향 프로그래밍

객체 : 속성과 행동을 떠올릴 수 있는 모든 존재

객체지향 프로그래밍이란 : 프로그램을 여러 개의 독립된 객체들과 그 객체들 간의 상호작용으로 파악하는 프로그래밍 접근법

  1. 프로그램에 어떤 객체들이 필요할지 정한다.
  2. 객체들의 속성과 행동을 정한다.
  3. 객체들이 서로 어떻게 소통할지 정한다.

01. 클래스와 인스턴스

클래스(속성과 행동을 가진 틀)로 객체(인스턴스)를 만든다.

02. 인스턴스 변수

  • 인스턴스 변수는 사용하기 전에 무조건 먼저 선언해야 함
class User: # 클래스
    pass

user1 = User() # 객체 생성

user1.name = '김이름' # 인스턴스 변수 
user1.email = '김이메일'
user1.password = '김비번'

03. 인스턴스 메소드

  • 메소드의 종류
      1. 인스턴스 메소드  
      1. 클래스 메소드 
      1. 정적 메소드
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"))

댓글

Designed by JB FACTORY