[python study note] 객체

[python study note] 객체

Object

·

6 min read

1. 객체란?

객체는 속성과 행동으로 이루어진 존재이다. 우리가 살아가면서 보는 모든 존재

ex) 인스타그램 유저 객체

  • 속성 : 이메일주소, 비밀번호, 친구목록

  • 행동 : 좋아요, 친구추가


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

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

-> 프로그램을 객체들과 객체들 간의 소통으로 바라보는 것

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

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

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

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


3. 클래스

객체의 틀이 있으면 이 틀을 이용해 객체를 계속 만들 수 있다.

이런 객체의 틀을 클래스라고 하고, 틀로 만든 결과물을 객체라고 한다.

클래스로 인스턴스를 만든다.

클래스 선언

class 클래스이름:
    내용 (속성, 행동)

변수명 = 클래스명()

클래스이름의 첫글자는 대문자 사용

ex)

class User:
    pass

user1 = User()
user2 = User()
user3 = User()


뒷부분을 통해서 User인스턴스가 만들어지고
변수 user1이 인스턴스를 가리키게 된다.
위에서 정의한 User클래스를 이용해서 User 인스턴스를 생성한것

4. 인스턴스 변수

각 인스턴스는 같은 이름의 속성을 갖고 있어도 서로 다른 값을 가지고 있다.

인스턴스가 개인적으로 가지고 있는 속성을 인스턴스 변수라고 한다.

인스턴스 변수 정의하기

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

ex)

class User():
    pass

user1 = User()
user2 = User()
user3 = User()

user1.name = "토토로"
user1.email = "helloworld@gmail.com"
user1.password = "12345"

user2.name = "신짱구"
user2.email = "jjanggu@gmail.com"
user2.password = "12345"

user3.name = "포카칩"
user3.email = "potato@gmail.com"
user3.password = "12345"

#각 User 인스턴스는 같은 이름의 속성을 갖고 있어도 서로 다른 값을 가지고 있다.

인스턴스 변수 사용하기

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

ex)

user1.email

5. 인스턴스 메서드

객체는 속성과 행동으로 이루어져 있다.

속성을 인스턴스 변수로 나타내고, 행동을 함수로 나타낸다.

객체의 행동을 나타내는 함수를 메서드라고 부른다.

메서드의 종류로는 인스턴스 메서드, 클래스 메서드, 정적 메서드가 있다.

인스턴스 메서드는 인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하는 메서드이다.

class User():
    def hello(some_user):
        print('안녕하세요. 저는 {}입니다.'.format(some_user.name))

#이 메서드는 some_user라는 파라미터를 받는데 some_user에는 
#user1, user2, user3와 같은 User인스턴스를 넣어준다.
#hello메서드는 name이라는 인스턴스 변수를 사용하므로 hello는 인스턴스 메서드 이다.

인스턴스 메서드 사용

클래스 이름.메서드 이름(파라미터)

ex)

class User():
    def hello(some_user):
        print('안녕하세요. 저는 {}입니다.'.format(some_user.name))

user1 = User()
user2 = User()
user3 = User()

user1.name = "토토로"
user1.email = "helloworld@gmail.com"
user1.password = "12345"

user2.name = "신짱구"
user2.email = "jjanggu@gmail.com"
user2.password = "12345"

user3.name = "포카칩"
user3.email = "potato@gmail.com"
user3.password = "12345"

#hello메서드 사용 
#클래스 이름.인스턴스 메서드 이름(파라미터)
User.hello(user1)

6. 인스턴스 메서드의 특별한 규칙

User.hello(user1)
user1.hello()

두가지 방법으로 선언이 가능한데 같은 출력값이 나온다.

첫번째 줄은 클래스에서 메서드를 호출했고, 두번째 줄은 인스턴스의 메서드를 호출했다.

아랫줄 처럼 인스턴스의 메서드를 호출하면 user1 인스턴스가 hello의 첫번째 파라마티로 자동으로 전달된다.

그러므로 파라미터를 따로 써줄 필요가 없다.

인스턴스 메서드의 첫번째 파라미터의 이름은 self로 쓰기

class User():
    def hello(self):
        print('안녕하세요. 저는 {}입니다.'.format(self.name))

특수 메서드 : 특정 상황에서 자동으로 호출되는 메서드. magic method (매직 메서드)라고도 한다.

7. __init_ _

인스턴스가 생성될 때 자동으로 호출된다.

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

user1 = User("Young", "young@gmail.com", "12345")
user2 = User("Han", "han@gmail.com", "23456")
user3 = User("Taeho", "taeho@gmail.com", "34567")

print(user1.email)
print(user2.name)
print(user3.password)

User를 생성하는 한줄 동작하는 방법

user1 = User("Young", "young@gmail.com", "12345")

이 줄이 실행되면
1. User 인스턴스 생성
2. __init__메서드 자동 호출
def __init__(self, name, email, password):
        self.name = name
        self.email = email
        self.password = password
3. 괄호 안에 있는 값들이 순서대로 들어감
4. init메서드는 인스턴스 변수들의 초기값 설정

init메서드를 사용하면 인스턴스 생성과 인스턴스 변수 초깃값 설정을 한줄로 할 수 있다.

def example(self, name, email, password):
    self.name = name
    self.email = email
    self.password = password

user1 = User()
user.example("Young", "young@gmail.com", "12345")

init을 사용하면 두줄을 한줄로 사용 가능
def __init__(self, name, email, password):
        self.name = name
        self.email = email
        self.password = password

user1 = User("Young", "young@gmail.com", "12345")

8. __str_ _

print함수를 호출할 때 자동으로 호출된다.

어떤 인스턴스를 출력하면 str메서드의 리턴값이 출력

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

    def __str__(self):
        return "사용자 : {}, 이메일 : {}, 비밀번호 : ********".format(self.name, self.email)

user1 = User("가나다", "hello@gmail.com", 12345678)
user2 = User("라마바", "world@gmail.com", 87654321)

print(user1)
print(user2)

9. 클래스 변수

인스턴스 변수란? 인스턴스 자신만의 속성

클래스 변수는 같은 클래스의 인스턴스들이 서로 공유하는 값을 말한다.

한 클래스의 모든 인스턴스가 공유하는 속성 -> 클래스 변수

클래스 변수 사용법

클래스 이름.클래스 변수 이름
인스턴스 이름.클래스 변수 이름

클래스 변수의 값 설정

클래스 이름.클래스 변수 이름

같은 이름의 클래스 변수와 인스턴스 변수가 있으면 인스턴스 변수가 읽어진다.

class User:
    count = 0

    def __init__(self, name, email, password):
        #유저 인스턴스의 모든 변수를 지정해주는 메서드
        self.name = name
        self.email = email
        self.password = password

        User.count += 1

user1 = User("김영영", "young@gmail.com", 1233)
user2 = User("이이이", "leelee@gmail.com", 3445)
user3 = User("박삼삼", "sam@gmail.com", 5634)

user1.count = 5

print(User.count) #3
print(user1.count) #5
print(user2.count) #3
print(user3.count) #3

user1에만 5가 출력된 것은 user1.count = 5가 인스턴스 변수를 설정할 때 사용하던 문법이다.
user1인스턴스에 count라는 인스턴스 변수가 생기고 그 값이 5로 설정되어 5가 출력된다.
user1.count = 5 코드는 클래스 변수의 값을 설정하는 것이 아닌 같은 이름의 인스턴스 변수를 추가하는 것이다.

클래스 변수에 값을 설정할 때는 클래스 이름으로만 해야한다.

User.count = 5

print(User.count) #5
print(user1.count) #5
print(user2.count) #5
print(user3.count) #5

10. 데코레이터

다른 함수를 꾸며서 새로운 함수를 만들어주는 것

함수가 실행되기 전과 후에 문자열을 출력하고 싶으면 모든 함수에 같은 기능을 추가해야 한다.

def a():
    print('시작')
    기존함수1내용
    print('끝')

def b():
    print('시작')
    기존함수2내용
    print('끝')

def c():
    print('시작')
    기존함수3내용
    print('끝')

일일이 하면 중복이 많은데 이럴때 데코레이터를 사용하면 훨씬 깔끔하게 가능하다.

중복되는 부분을 데코레이터 함수에 넣고 사용하면 깔끔하게 사용이 가능하다.

def add_print(original):
    def wrapper():
        print('함수시작')
        original
        print('함수끝')
    return wrapper

@add_print
def a():
    기존함수1내용

@add_print
def b():
    기존함수2내용

@add_print
def c():
    기존함수3내용

11. 클래스 메서드

클래스 변수의 값을 읽거나 설정하는 메서드

클래스 메서드는 @classmethod를 적어줘야 한다.

인스턴스 메서드는 첫번째 파라미터인 self로 인스턴스 자신이 자동 전달되는 규칙이 있는데 클래스 메서드는 첫번째 파라미터로 클래스가 자동 전달된다. 그리고 클래스를 cls라는 파라미터로 전달받는다.

첫번째 파라미터의 이름은 꼭 cls로 쓰기

class User:
    count = 0

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

        User.count += 1

    def say_hello(self):
        print('안녕하세요. 저는 {}입니다.'.format(self.name))

    def __str__(self):
        return '사용자 : {}, 이메일 : {}, 비밀번호 : ******'.format(self.name, self.email)

    @classmethod
    def number_of_users(cls): #cls.count = User.count
        print('총 유저 수는 : {} 입니다.'.format(cls.count))

user1 = User("첫번째", "one@gmail.com", 123455)
user2 = User("두번째", "two@gmail.com", 345678)
user3 = User("세번째", "three@gmail.com", 678900)

#클래스로 클래스 메서드 호출
User.number_of_users()
#인스턴스로 클래스 메서드 호출
user1.number_of_users()

클래스 메서드를 사용하면 위의 두 방법 모두 첫번째 파라밑로 클래스가 자동 전달 된다.
두가지 방법 모두 파라미터 부분을 비워뒀는데 클래스가 자동 전달되는 이유는
클래스 메서드 데코레이터(@classmethod)로 number_of_users를 클래스 메서드로 만들어줬기 때문

언제 클래스 메서드를 사용하는가?

  • 인스턴스 변수 사용하면 인스턴스 메서드

  • 클래스 변수 사용하면 클래스 메서드

클래스 변수와 인스턴스 변수 둘 다 쓴다면?

  • 인스턴스 메서드 -> 인스턴스 변수, 클래스 변수 모두 사용 가능

인스턴스 없이도 필요한 정보가 있다면?

  • 클래스 메서드