Tiny Finger Point Hand With Heart
본문 바로가기
Python

[Python] 객체 지향 프로그래밍(Object-Oriented Programming, OOP)

by yoondii 2023. 3. 6.
728x90
반응형

객체(object) 

사전적인 정의로 실제 존재하는 것을 말한다.

객체지향 이론에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다.

프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장 할 변수와 작업을 수행 할 메소드를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다.


객체 지향 프로그래밍 (Object-Oriented Programming, OOP)

프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법.

 

객체지향 프로그래밍 만들기

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

클래스와 객체

#객체는 속성과 행동으로 나타낼 수 있다.
class User:
	pass
    
user1 = User()
user2 = User()
user3 = User()

#인스턴스 변수 정의
#인스턴스이름.속성이름(인스턴스변수) = "속성에 넣을 값"
user1.name = "융디"
user1.email = "yoondii@gg.com"
user1.password = "1234"

user2.name = "지웅"
user2.email = "jiiiww@gg.com"
user2.password = "1245"

user3.name = "디두"
user3.email = "ditto@gg.com"
user3.password = "1894"


#인스턴스 변수 사용하기
#인스턴스이름.인스턴스변수이름
print(user1.name) #융디

 

클래스 변수

인스턴스 변수와 달리 모든 인스턴스 사이에 공유된 값을 가진 변수이다. 클래스 변수는 인스턴스를 생성하는 것이 아닌 참고하는 것이 가능하다.

class User:
	#클래스변수 = 값
    	#인스턴스 변수와 달리 self를 붙이지 않고 클래스 내에 선언.
	count = 0  
    
	def__init__(self,name,email,password):
            self.name = name
            self.email = email
            self.password = password
#클래스.클래스변수        
User.count = 1 #클래스변수
print(User.count) # 1

클래스 변수를 설정할때는 꼭 클래스이름으로 써야 설정이 된다.

클래스이름.클래스변수 = 설정값

 

데코레이터

: 기존의 함수에 새로운 기능을 추가하는 것. 주로 함수위에 @(함수명)을 써서 나타낸다.

#함수에 부가기능을 추가하는 데코레이터

def print_name():
	print("융디입니다.")
    
def add_print_to(original):
	def wrapper():
            print("안녕하세요.")
            original()
            print("잘부탁드립니다.")
        return wrapper
    
print_name = add_print_to(print_name)
print_name() 
#안녕하세요.
#융디입니다.
#잘부탁드립니다.

#주로 @을 사용해서 나타낸다.
@classmethod
def function():
	함수내용

print_name함수를 받아서 앞뒤로 출력문을 더해 새로운 함수 wrapper로 리턴한다.

여기서 데코레이터함수는 add_print_to 함수이다.


메소드의 종류

1. 인스턴스 메소드

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

#위의 코드를 사용해서 설명진행
#방법1
class User:
	def hello(some_user):
        	print("하이방가룽! 저는 {}입니다!".format(some_user.name))
    
#동작방식
#some_user을 파라미터로 받아 클래스 User를 실행한다.
#인스턴스 user1을 파라미터에 넣어보자
#클래스이름.메소드이름(인스턴스)
User.hello(user1) # 하이방가룽! 저는 융디입니다!

#방법2
#인스턴스의 메소드 호출
user1.hello() # 하이방가룽! 저는 융디입니다!

----------------------------------------------
#첫번째 파라미터의 이름을 self로 쓰는 것이 읽기 더 쉬움!
class User:
	def hello(self):
        	print("하이방가룽! 저는 {}입니다!".format(self.name))

 

2. 특수 메소드

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

#__init__메소드: 인스턴스가 생성될 때 자동으로 호출
class User:
	def__init__(self,name,email,password):
    	self.name = name
        self.email = email
        self.password = password

user1 = User("융디","yoondii@gg.com","1234")
user2 = User("지웅","jiiiww@gg.com","1245")
user3 = User("디두","ditto@gg.com","1894")

print(user1.name) #융디
print(user2.name) #지웅
print(user3.email) #ditto@gg.com

#동작방식
#User인스턴스 생성
#__init__메소드 자동 호출
#인스턴스 변수 초깃값을 설정

------------------------------------------------
#__str__메소드 : print함수를 호출할때 자동으로 호출
class User:
	def__init__(self,name,email,password):
    	self.name = name
        self.email = email
        self.password = password
        
        def hello(self):
        	print("하이방가룽! 저는 {}입니다!".format(self.name))
        
        def__str__(self):
        	return "유저:{}, 이메일:{},비밀번호: ****".format(self.name,self.email)

user1 = User("융디","yoondii@gg.com","1234")
user2 = User("지웅","jiiiww@gg.com","1245")
user3 = User("디두","ditto@gg.com","1894")

print(user1) #유저:융디, 이메일:yoondii@gg.com, 비밀번호: ****
print(user2) #유저:지웅, 이메일:jiiiww@gg.com, 비밀번호: ****

 

3. 클래스 메소드

      :  클래스 변수의 값을 읽거나 설정하는 메소드. 인스턴스 변수 사용불가

class User:
	count = 0
    
	def__init__(self,name,email,password):
    	self.name = name
        self.email = email
        self.password = password
        
        User.count += 1
        
        def hello(self):
        	print("하이방가룽! 저는 {}입니다!".format(self.name))
        
        def__str__(self):
        	return "유저:{}, 이메일:{},비밀번호: ****".format(self.name,self.email)
            
        @classmethod   #첫번째 파라미터의 이름은 cls로 쓰기
        def number_of_users(cls):
        	#cls.count == User.count
        	print('총 유저의 수는 : {}입니다.'.format(cls.count)) 
            
user1 = User("융디","yoondii@gg.com","1234")
user2 = User("지웅","jiiiww@gg.com","1245")
user3 = User("디두","ditto@gg.com","1894")

User.number_of_users()
# 총 유저의 수는 : 3입니다.

인스턴스가 없는데 사용해야 한다면 클래스메소드를 사용해야한다.

 

4. 정적 메소드

      : 인스턴스 변수, 클래스 변수를 전혀 다루지 않는 메소드

#위의 코드 사용
.
.
	@staticmethod
    	def is_valid_email(email_address):
        	return "@" in email_address

print(User.is_valid_email("yoondii")) #False
print(User.is_valid_email("yoondii@gg.com")) #True
    
print(user1.is_valid_email("ditto")) #False
print(user1.is_valid_email("ditto@gg.com")) #True

인스턴스 변수나 클래스 변수 중 아무것도 사용하지 않을 메소드라면 정적 메소드로 만들면 된다. 

어떤 속성을 다루지 않고, 단지 기능(행동)적인 역할만 하는 메소드를 정의할 때 정적 메소드로 정의하면 된다.

 

 

 

 

 

 

728x90
반응형

댓글