본문 바로가기
Python/객체지향

[ 객체 지향 프로그래밍 ] 1일차 ( 객체지향 정의 ~ 인스턴스 )

by 2CHAE._.EUN 2022. 1. 12.

[ 객체 지향 프로그래밍 ]

 

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

 

객체 : 속성과 행동으로 이루어진 존재 

        ex) SNS 유저 객체

             속성 : 이메일주소, 아이디, 비밀번호, 닉네임 등

             행동 : 팔로우, 좋아요 등

    

 

객체 지향 프로그래밍 : 프로그램을 여러개의 독립적인 객체들과 그 객체들의 상호작용을 작성하는

                              프로그래밍 접근법. → 프로그램을 객체들간의  상호작용으로 모델링

 


클래스와 인스턴스

 

# 클래스 생성하기
# * 클래스의 첫 글자는 항상 대문자
class User :
    pass

# 클래스로 인스턴스 만들기
# * 3개 모두 같은 User 클래스의 인스턴스이지만 서로 다른 인스턴스이다.
user1 = User()
user2 = User()
user3 = User()

 

* 같은 클래스로 인스턴스를 만들어도 인스턴스의 이름이 다르므로 모두 서로 다른 존재이다.

 


인스턴스 변수

 

ⓐ 인스턴스 변수 정의하기

 

인스턴스 변수 : 인스턴스가 개인적으로 가지고 있는 속성

 

[인스턴스 이름].속성이름(인스턴스 변수) = "속성에 넣을 값"

 

각 인스턴스는 같은 이름의 속성을 가지고 있더라도 서로 다른 값을 가지고 있음

즉 각 인스턴스들은 속성을 공유하는 것이 아니라 각자 개인적으로 가지고 있음

 

# 인스턴스 변수 정의하기
# 각 인스턴스는 같은 이름의 속성을 가지고 있더라도 서로 다른 값을 가지고 있음
# name, email, password는 모두 인스턴스 변수
user1.name = "2chaechae"
user1.email = "2chaechae@gamil.com"
user1.password = "1234"

user2.name = "2monmon"
user2.email = "2monmon@gamil.com"
user2.password = "0000"

user3.name = "2yamyam"
user3.email = "2yamyam@gamil.com"
user3.password = "1357"

 

ⓑ 인스턴스 변수 사용하기

 

[인스턴스 이름].인스턴스 변수 이름

 

선언하지 않은 인스턴스 변수를 사용할 경우는 에러가 난다.

 

# 인스턴스 변수 사용하기
# 선언하지 않은 인스턴스 변수를 사용할 경우 에러남
print(user1.name)

 


인스턴스 메소드

 

메소드 : 객체의 행동을 나타내는 변수

 

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

 

[클래스 이름].메소드 이름(인스턴스)

 

class User :
    # 인스턴스 메소드 선언하기
    # 인스턴스 변수를 사용하므로 인스턴스 메소드이다.
    def say_hi(using_user):
        print(f"안녕하세요! {using_user.name}님!")
        
# 인스턴스 메소드 사용하기
User.say_hi(user1)

 

* 인스턴스 메소드를 실행시키는 또 다른 방법

 

# 인스턴스 메소드 사용하기

# 클래스에서 메소드를 호출하는 방법
User.say_hi(user1)

# 인스턴스의 메소드를 호출하는 방법
user2.say_hi()

 

클래스를 통해 메소드를 호출하는 경우에는 첫번째 파라미터로 인스턴스가 자동으로 전달되지 않기 때문에

파라미터를 통해 인스턴스를 직접 넘겨줘야한다.

 

인스턴스의 메소드를 호출하는 경우에는 user2의 인스턴스가 함수의 첫번째 파라미터로 자동으로 전달이 되므로

파라미터를 따로 써줄 필요가 없다. 오히려 인스턴스의 메소드를 호출할 경우 파라미터를 넣어주면 에러남

 

class User :

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

    def login( using_user, user_email, user_password ):
        if ( using_user.email == user_email and using_user.password == user_password ) :
            print("로그인 성공!")
        else :
            print("로그인 실패!")

user1 = User()

user1.name = "2chaechae"
user1.email = "2chaechae@gamil.com"
user1.password = "1234"

 

인스턴스의 변수를 사용할 경우 user1 인스턴스가 자동으로 첫번째 파라미터로 전달이 된다.

그래서 첫번째 파라미터는 빼고 나머지 파라미터만 작성해줘야 정상적으로 프로그램이 실행된다.

 

# 오류
user1.login(user1, "2chaechae@gamil.com", "1234")

# user1 인스턴스가 자동으로 첫번째 파라미터로 전달이 되기 때문에
# 첫번째 파라미터는 빼고 나머지 파라미터만 작성하기! 
user1.login( "2chaechae@gamil.com", "1234")

 

 


self

 

인스턴스 메소드를 정의할 때는 항상 첫번째 파라미터로 인스턴스를 받기 위한 파라미터를 써줘야 한다.

 

class User :

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

	# 첫번째 파라미터로 인스턴스를 받기위한 파라미터를 작성해줘야함
    def login(using_user, user_email, user_password):
        if ( using_user.email == user_email and using_user.password == user_password ) :
            print("로그인 성공!")
        else :
            print("로그인 실패!")

 

파이썬에서는 인스턴스 메소드의 첫번째 파라미터 이름을 self로 쓰라고 권장한다

인스턴스 메소드를 호출하는 인스턴스 자신이 첫번째 파라미터로 들어가므로 self라는 단어를 사용하는 것임

( 다른 단어를 사용해도 지장은 없음 )

 

class User :

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

    def login(self, user_email, user_password):
        if ( self.email == user_email and self.password == user_password) :
            print("로그인 성공!")
        else :
            print("로그인 실패!")

.

 

* 인스턴스 변수와 같은 이름을 갖는 변수를 사용할 경우

 

class User :

    # 파라미터로 받는 name과 인스턴스의 name이 같은지 확인하는 함수
    def checking(self, name):
        return self.name == name
        # self.name과 name은 구분이 확실하게 되기 때문에 같은 이름의 변수를 사용해도 지장 없음


user1 = User()

user1.name = "2chaechae"
user1.email = "2chaechae@gamil.com"
user1.password = "1234"

# user1 인스턴스가 checking 함수의 첫번째 파라미터로 자동적으로 들어가기 때문에
# 나머지 파라미터에 해당하는 값만 써주기
print(user1.checking("2monmon"))