[주말공부]객체 지향 프로그래밍

letsbehappychan·2023년 1월 1일
0

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

프로그램을 구성하는 객체를 서로 연관성있는 것 끼리 묶어서 모듈화하는 프로그래밍 접근법이다.

  • 객체 지향 프로그래밍으로 프로그램을 만드는 것은..
    • 프로그램에 어떤 객체들이 필요할지 정한다.
    • 객체들의 속성과 행동을 정한다.
    • 객체들이 서로 어떻게 소통할지 정한다.

객체(Instance)

속성(Attribute)과 행동(Method)으로 이루어진 존재
객체는 현실에 있든, 가상으로 존재하든 속성과 행동을 떠올릴 수 있는 모든 것이라 볼 수 있다.

class

class란 객체의 설계도, 틀이라고 생각하면 된다.

class 생성

# 클래스 구현( 클래스이름의 앞 글자는 대문자로 해준다)
class Person: 
	pass
# 객체(instance) 생성
p1 = Person()
p2 = Person()

Person이라는 class와 p1,p2라는 instance를 만들었다.

여기서 class는 Data type이고 instance는 값이다.

모두 같은 Person class로 만들었지만 서로 다른 instnace이다.

Instance Attribute(인스턴스 변수)

객체의 데이터, 객체가 가지는 값, 객체의 상태

# 인스턴스 변수 생성

p1.name = '김씨'
p1.age = 10
p1.address = '서울'

p2.name = '박씨'
p2.age = 20
p2.email = 'park@velog.com'

# 인스턴스 변수 조회
print(p1.name, p1.age, p1.address)
>>> 김씨 10 서울

# dict타입으로 조회
print(p1.__dict__)
>>>{'name': '김씨', 'age': 10, 'address': '서울'} 

# 정의 하지 않은 속성 조회시 error 발생
print(p2.address)
>>> AttributeError : 'Person' object has no attribute 'address'

메소드(Method)

instance method(인스턴스 메소드)

인스턴스 변수를 사용하거나 인스턴스 변수에 값을 설정하는 메소드

# 인스턴스 메소드 생성
class Person1:
	def say_hello(self):
    	print(f"안녕하세요! 저는 {self.name}입니다.") 
#       say_hello 함수는 name이라는 인스턴스 변수를 사용함으로 인스턴스 메소드이다.

# 클레스에서 메소드를 호출
Person.say_hello(p1)
Person.say_hello(p2)
>>> 안녕하세요! 저는 김씨입니다.
    안녕하세요! 저는 박씨입니다.
    
# 인스턴스의 메소드를 호출
p1.say_hello()
p2.say_hello()
>>> 안녕하세요! 저는 김씨입니다.
    안녕하세요! 저는 박씨입니다.
# 자동으로 p1,p2가 파라미터로 넘어간다. 

좀 더 알아보자.

class Person:

	def say_hello(self):
    	print(f"안녕하세요! {self.name}님.") 

	def login(self, email, pw):
    	if(self.email = email and self.pw = pw):
        	print('로그인 성공')
        else:
        	print('로그인 실패')
            
p1 = Person()

p1.name = '김씨'
p1.email = 'happykim@velog.com'
p1.pw = '12345'

p1.say_hello()
p1.login('happykim@velog.com','12345')
>>> 안녕하세요! 김씨님.
    로그인 성공
# self자리에 자동으로 인스턴스 자신(p1)이 위치하고, 나머지 파라미터 값만 자리에 맞게 입력해준다.
# p1.say_hello(p1)
  p1.login(p1,'happykim@velog.com','12345')
  이렇게 하면 error가 난다.

인스턴스 메소드를 정의할 때는 항상 첫 번째 파라미터로 인스턴스를 받기 위한 파라미터를 써줘야 한다.
파이썬에서는 인스턴스 메소드의 첫 번째 파라미터의 이름을 self로 쓰길 권장한다.

special method(특수 메소드)

특정 상황에서 자동으로 호출되는 메소드

  1. __init__ 메소드
  • 인스턴스가 생성될 때 자동으로 생성되는 메소드
class Person2:
	
    def __init__(self, name, email, pw):
    	self.name = name
        self.email = email
        self.pw = pw
        
p = Person2('강씨', 'kang@velog.com', '12345')

print(p.name, p.email, p.pw)
>>> 강씨 kang@velog.com 12345

# __init__메소드를 사용하면 인스턴스 변수 생성과 인스턴스 변수 초깃값 설정을 한 번에 할 수 있다.
  1. __str__메소드
  • 인스턴스를 출력(print)하면 자동으로 __str__의 return 값이 출력된다.
class Person3:
	
    def __init__(self, name, email, pw):
    	self.name = name
        self.email = email
        self.pw = pw
    
    def __str__(self):
    	return f"사용자: {slef.name}, 이메일: {self.email}, 비밀번호: *****"
        
    p = Person('이씨' , 'ec@velog.com', '12345')
    
    print(p)
    >>> 사용자: 이씨, 이메일: ec@velog.com, 비밀번호: *****
    
# 인스턴스를 출력할 때 원하는 정보를 나타내려면 __str__메소드를 class에 정의하면 된다.

class 변수

같은 class의 인스턴스들이 서로 공유하는 값.
class 자체의 데이터.
class당 하나가 생성된다.

class Person4:
	count = 0 # Person4 인스턴스의 총 계수를 나타내는 class 변수 

# Person4 인스턴스가 생성될 때 마다 실행되는 메소드    
    def __init__(self, name, email, pw):
    	self.name = name
        self.email = email
        self.pw = pw

        Person4.count += 1
        
p1 = Person4('김씨','kim@velog.com','12345')
p2 = Person4('이씨','lee@velog.com','34567')

# class변수 호출
print(Person4.count)
>>> 2

# class 변수 값 읽기
Person4.count
p1.count
*둘다 가능

# class 변수 값 설정
Person4.count = 값
p1.count = 값 -> class변수 count가 아닌 인스턴스 변수 count에 값을 부여한 것이 된다.
*class 변수에 값 설정은 꼭 class변수에만 해야 된다.

decorator(데코레이터)

함수를 어떤 함수로 꾸며서 새로운 기능을 주는 파이썬의 기능.

def print_hello():
	print('안녕하세요!')
   
def add_print_to(original):
	def wrapper():
   	print('함수 시작')
       original()
       print('함수 끝')
   return wrapper

# 함수 호출 방법1.
add_print_to(print_hello)()
>>>함수 시작
	안녕하세요
   함수 끝
   
# 함수 호출 방법2.
print_hello = add_print_to(print_hello)
print_hello()
>>>함수 시작
	안녕하세요
   함수 끝
   
# 데코레이터 사용
def add_print_to(original):
	def wrapper():
   	print('함수 시작')
       original()
       print('함수 끝')
   return wrapper

@add_print_to -> 'print_hello함수를 add_print_to로 꾸며줘라!'
def print_hello():
	print('안녕하세요!')

#함수 호출 방법3.
print_hello()

데코레이터를 사용하면 꾸며주고 싶은 함수가 있을 때마다 사용해 코드를 깔끔하게 사용할 수 있게 해준다.

class 메소드

class 변수의 값을 읽거나 설정하는 메소드
@classmethod 데코레이터를 붙인다.

class User:
	count = 0 

    
    def __init__(self, name, email, pw):
    	self.name = name
        self.email = email
        self.pw = pw

        Person4.count += 1
	
    def say_hello(self):
    	print(f'안녕하세요! 저는 {self.name}입니다.')
        
    def __str__(self):
    	return f"사용자: {self.name}, 이메일: {self.email}, 비밀번호: *****"
    
    
    @classmethod
    def number_of_users(cls):
    	print(f'총 유저 수는: {cls.count}입니다.')
#       class 메소드는 첫 번째 파라미터로 class 자신이 넘어온다. 이것을 cls로 적어준다.   
        
user1 = User('김씨','kim@velog.com','12345')
user2 = User('이씨','lee@velog.com','34567')

# class 메소드 
User.number_of_users()
user1.number_of_users()
>>> 총 유저 수는: 2입니다.   	

인스턴스 변수를 사용할 때는 인스턴스 메소드를
클래스 변수를 사용할 때와 인스턴스가 하나도 없을 때 사용할 가능성이 있다면 클래스 메소드를 사용해준다.

인스턴스 메소드는 인스턴스 변수, 클래스 변수 모두 사용 가능하나
클래스 메소드는 인스턴스 변수를 사용 못한다.

static 메소드(정적 메소드)

클래스 변수와 상관없는 단순기능을 정의한다.
파라미터에 대한 규칙은 없이 필요한 변수들만 선언한다.
인스턴스 변수나 클래스 변수 중 아무것도 사용하지 않을 메소드라면 정적 메소드로 만들면 된다.
@staticmethod 데코레이터를 붙인다.

profile
생각이 요동친다

0개의 댓글