코딩일기

[PYTHON 1] 객체지향 프로그래밍 {객체, 클래스, init}(feat. Codestates _AI_BootCamp, 부트캠프) 본문

Code/기타

[PYTHON 1] 객체지향 프로그래밍 {객체, 클래스, init}(feat. Codestates _AI_BootCamp, 부트캠프)

daje 2021. 3. 12. 00:00
728x90
반응형

 

 

출처 : 이미지 링크 참조

 

 

안녕하십니까 다제입니다. 

 

오늘부터는 python 웹 개발 코스로 들어가게 됩니다. 

 

이에, python에 대해서 알아보는 시간을 갖도록 하겠습니다. 

python은 객체지향 프로그래밍이라고 합니다.

 

그럼 과연 객체는 무엇이고,

객체 지향프로그래밍은 무엇인지 개념을 확인 한 후 코드로 확인해보는 시간을 갖도록 하겠습니다. 

 

 

 

 


 

 

1. 객체지향프로그래밍 정의 

객체란 ? 현실에 존재하든 가상으로 존대하든 "속성"과 "행동"을 떠올릴 수 있다면 객체라고 말할 수 있습니다.

 

예를 들어 LOL 게임을 예로 들어보겠습니다. 

암살자 캐릭터(제드)가 하나 있다고 가정해보겠습니다.  

  -. 행동 : 미니언을 만나면 죽인다. 

  -. 속성 : 캐릭터는 미니언을 죽이면 경험치가 오른다. 

 

 

파이썬에서는 위와 같은 속성을 변수(x =x+10 / x : 죽인 미니언의 경험치)로 나타내며, 이 속성들이 하는 행동들을 함수로 나타냅니다. 즉, 객체지향프로그래밍이란 프로그램 내에 여러 개의 독립된 객체들과 그 객체들 간의 상호작용으로 프로그래밍하는 방법을 의미합니다. 

 

 

2. 객체지향프로그래밍 만드는 방법 

객체 지향 프로그래밍으로 프로그램을 만들려면

  1) 프로그램에 어떤 객체들이 필요할지 정한다. 

  2) 객체들의 속성과 행동을 정한다. 

  3) 객체들이 서로 어떻게 소통할지 정한다. 

 

 

3. 객체지향프로그래밍 구성 ( 클래스 & 인스턴스 ) 

  -. 인스턴스(객체)  : 클래스를 통해 만들어진 결과물

    * ex) 붕어빵 

  -. 클래스 : 인스턴스(객체)의 틀 

    * ex) 붕어빵을 만드는 철판 틀 

1. 인스턴스 만들기
user1.name = "홍길동"
user1.phone_number = "010-1234-5678"

# 속성 출력하기 
print(user1.name) -> 결과값 : "홍길동"

# 그냥 user1만 출력하명 어떻게 될까요?
print(user1) -> 결과값 : <__main__.User object at 0x7fd6045598e0>
위와 같이 메모리 값이 출력이 됩니다. user1이 저장되어 있는 메모리를 출력해줍니다. 

변수를 생성하기 위해 지금까지 user1 = "홍길동" 방법으로 변수를 설정해주었습니다. 

그런데, 이렇게 설정을 하게 되면 user1의 이름, 연락처, 이메일 등을 다 따로따로 변수를 지정하게되어 변수의 숫자가 너무 많이 만들어지게 됩니다. 홈페이지를 제작하는데 유저의 개인정보를 각각 다 다른 변수에 넣는다면 홈페이지 관리 시, 너무 어렵겠죠?

 

그래서 인스턴스(객체)라는 개념이 나오게 됩니다. 

인스턴스 뒤에는 내가 원하는 어떤 것이든 .(dot)을 찍고 설정해줄 수 있습니다. 

 

2. 클래스 만들기 
# 클래스명의 첫글자는 무조건 대문자로 작성!
class User:
	pass

# 클래스로 인스턴스 만들기 
user1 = User()
user2 = User()
# 같은 클래스로 만들었어도 다른 인스턴스가 된다! 당연한거지만..!

우리가 만드는 객체를 클래스에 연결(user1 = User)하는 이유는 추후 클래스에 다양한 기능을 가지는 함수를 만들어서 넣어줄 것인데 그때 "인스턴스.함수이름(변수)" 라는 형태로 적어주면 클래스에 있는 다양한 기능을 한번에 불어올 수 있게 됩니다. 

3. 메소드(행동) 2가지 
 -. 인스턴스 메소드 : 인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하는 메소드


class User:
    def hi(user) :
        # 인사를 하는 메소드 
    	print(f"안녕하세요, 저는 {user.name}입니다.!")

    def login(user, email, pd):
        if (user.email == email and user.pd == dp):
            print("로그인 완료")
        else:
            print("로그인 실패")
                
                
user1 = User()
user2 = User()

user1.name = "홍길동"
user1.phone_number = "010-1234-5678"


# 출력하는 방법1
User.hi(user1)
-> 결과값 : "안녕하세요 저는 홍길동입니다."
# 출력하는 방법2
user1.hi()
-> 결과값 : "안녕하세요 저는 홍길동입니다."

위와 같이 작동이 될 수 있는 이유는 인스턴스 메소드를 호출할때(user1.hi라고 코드를 작성할때) 인스턴스가 메소드의 첫번째 인자로 자동출력 됩니다. 즉, user1이 login함수의 1번째 인자인 user로 자동으로 넘어가게 된다라는 의미입니다.  

 

그런데, 파이썬에서는 위와 같이 인스턴스가 메소드의 첫번째 인자로 사용이 될때는 쉽게 코드를 읽을 수 있도록 self라고 지칭하기로 사전에 약속을 해두었습니다. 그래서 코드를 아래와 같이 수정을 해야합니다. 

class User:
    def hi(self) :
    	print(f"안녕하세요, 저는 {self.name}입니다.!")

	def login(self, email, pd):
		if (self.email == email and self.pd == dp):
			print("로그인 완료")
		else:
			print("로그인 실패")

 

 

4. Magtic method(특수 메소드)

이제 특수메소드에 대해서 배워보도록 하겠습니다. 

특수메소드란, 파이썬에 사전에 정의되어 있는 메소드를 의미합니다. 

그중 오늘은 __init__에 대해서 배워보도록 하겠습니다. 

 

1. __init__ : User()라는 클래스를 이용하여 user1이라는 인스턴스를 만들고자 합니다. 그렇다면 당연히 User()를 호출해야되겠지만, 그 호출하는 코드가 user1=User()입니다. 이때, User() 클래스를 자동으로 호출하고 메소드를 생성할 때 간편하게 만들 수 있도록 도와주는 명령어가 __init__입니다. 

class User:
    def initialize(self, name, email, password) :
        self.name = name
        self.email = email
        self.password = password
        

user1 = User()
user1.initialize("홍길동", "123@gmail.com", "123456")


print(user1.name, user1.email, user1.password)

class User:
    def __init__(self, name, email, password) :
        self.name = name
        self.email = email
        self.password = password
        

user1 = User("홍길동", "123@gmail.com", "123456")


print(user1.name, user1.email, user1.password)

 

잘 이해가 되셨나요? 이제 퀴즈를 통해 개념을 확인해보는 시간을 갖도록 하겠습니다. 

 

퀴즈 - 아래 코드 중 옳은 코드는 무엇이며, 틀른 코드는 어떻게 수정해야할까요?

###수정하지 마세요###
class User:
    def __init__(self, name, email, password) :
        self.name = name
        self.email = email
        self.password = password

    def hi(user) :
        # 인사를 하는 메소드 
    	print(f"안녕하세요, 저는 {user.name}입니다.!")

    def login(user, email, password):
        if (user.email == email and user.password == password):
            print("로그인 완료")
        else:
            print("로그인 실패")
                

user1 = User("홍길동", "ghdrlfehd@gmail.com", "123456")
user2 = User("심청이", "tlacjddl@gmail.com", "1213456")

####################

1번과 2번 코드 내에서만 수정해보세요

1번 코드 : user1.login(user1, "123@gmail.com", "123")
2번 코드 : user1.login("123@gmail.com", "123")

----------------------------------------------------------------
 
정답은 2번 코드 입니다. 
1번코드는 User.login(user1, "123@gmail.com", "123")으로 수정해줘야 합니다. 

 

 

위의 개념을 모두 숙지하셨다면, sns follow 시스템을 만들 수 있습니다.

 

물론 현업에서 사용하고 있는 clean처럼 작성은 할 수 없지만, 구현은 해볼 수 있습니다. 

 

위 링크를 참조하시면 바로 SNS Follow 시스템 예제로 가실 수 있습니다. 꼭 직접 만들어보시는걸 추천드릴게요

 

공감부탁드립니다.

감사합니다. 

728x90
반응형
Comments