[개념] Chapter06-1 : 파이썬 클래스

Date:     Updated:

카테고리:

태그:

인프런 강의 프로그래밍 시작하기 : 파이썬 입문을 듣고 정리한 내용입니다✏️

예제1

# 모든 Class는 object 상속를 받기 때문에
# class Dog(object): 라고도 쓸 수 있다. (object) 생략가능
class Dog: 
    # 클래스 속성
    species = 'firstdog' # 클래스 변수

    # 초기화/인스턴스 속성
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 클래스 정보
print(Dog) # <class '__main__.Dog'>

# 인스턴스화
a = Dog("mikky", 2)
b = Dog("baby", 3)

# 비교
print(a == b, id(a), id(b)) # False 140152368562288 140152368575344
#인스턴스화 된것은 다 다른 객체

# 네임스페이스 :객체를 인스턴스화 할 때 저장된 공간
print('dog1', a.__dict__) # dog1 {'name': 'mikky', 'age': 2}
print('dog2', b.__dict__) # dog2 {'name': 'baby', 'age': 3}


# 인스턴스 속성 확인
print('{} is {} and {} is {}'.format(a.name, a.age, b.name, b.age)) # mikky is 2 and baby is 3
# 각각 자신의 인스턴스에 속해있는 속성값들을 출력 

if a.species == 'firstdog':
    print('{0} is a {1}'.format(a.name, a.species)) # mikky is a firstdog

print(Dog.species) #firstdog
print(a.species) #firstdog
print(b.species) #firstdog
#클래스로도 바로 접근이 가능하과 인스턴스화 된 변수로도 접근이 가능하다.
  • 클래스를 하나 만들어놓고 붕어빵을 찍어내듯이 사용이 가능하고 각각의 클래스는 공유하는 공간, 공유하는 속성, 나만의 공간을 보유하고 있다.

  • 클래스 활용 장점

    • 코드 재사용성 증가
    • 불필요한 중복 방지 -> 깔끔한 코드
    • 생산성 향상
    • 성능 향상

클래스 활용을 통해 다음과 같은 장점들이 있다는 것이 객체지향의 핵심이다.

예제2

  • self의 이해 : 인스턴스화된 대상
class SelfTest:
    # 클래스 메소드
    def func1():
        print('Func1 called')

    # 인스턴스 메소드
    def func2(self):
        print(id(self)) # id(f) 값과 같다.
        print('Func2 called')

# __init__ 이 없어도 파이썬 내부적으로 알아서 실행
# 필요한 속성이 없기 때문에 안만듬

f = SelfTest()

print(id(f))

# f.func1() # f가 넘어가는데 func1에서 받질 않아서 에러 발생
f.func2()

SelfTest.func1() # 클래스 메소드 직접 호출
# SelfTest.func2() # self값을 받아야하는데 안 넣어줘서 에러
SelfTest.func2(f) # 인스턴스화 된 변수를 넣어 호출
  • self가 없음 : 클래스 메소드 -> 클래스로 직접 호출 해야한다.
  • self가 있음 : 인스턴스 메소드 -> 인스턴스를 넘겨주던가, 인스턴스로 호출을 해야한다.

예제3

  • 클래스 변수, 인스턴스 변수
class Warehouse:
    # 클래스 변수
    stock_num = 0 

    def __init__(self, name):
        # 인스턴스 변수
        self.name = name
        Warehouse.stock_num += 1

    def __del__(self):
        Warehouse.stock_num -= 1

user1 = Warehouse('Lee')
user2 = Warehouse('Cho')

print(Warehouse.stock_num) #2번 인스턴스화 시켰으니까 2가 나옴

print(user1.name) #Lee
print(user2.name) #Cho
print(user1.__dict__) # {'name': 'Lee'}
print(user2.__dict__) # {'name': 'Cho'}
print('before', Warehouse.__dict__)
print('>>>', user1.stock_num) # 2

del user1 # 인스턴스를 메모리에서 삭제
  • user1의 네임스페이스를 봤을 때 stock_num이라는 것은 없음.
  • 파이썬 내부적으로 인스턴스의 네임스페이스에 없으면 클래스의 네임스페이스를 알아서 확인해서 출력해준다. (클래스 네임스페이스에도 없으면 오류 발생)

예제4

class Dog:
    # 클래스 속성
    species = 'firstdog'

    # 초기화/인스턴스 속성
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def info(self):
        return '{} is {} years old'.format(self.name, self.age)

    def speak(self, sound):
        return "{} says {}!".format(self.name, sound)

# 인스턴스 생성
c = Dog('july', 4)
d = Dog('marry', 10)

#메소드 호출
print(c.info()) #july is 4 years old

#메소드 호출
print(c.speak('Wal Wal')) # july says Wal Wal!
print(d.speak("Mung Mung")) # marry says Mung Mung! 
  • 클래스를 하나 만들었을 뿐인데 수 백 마리의 개를 여러 가지 종류로 인스턴스화 시켜서 각각 자기만의 정보를 가지고 있는 것을 구현
  • speak 메소드 하나로 여러가지 말하는 방식을 출력 가능하다. (메소드 하나로 재사용이 가능하다.)

맨 위로 이동하기

Python 카테고리 내 다른 글 보러가기

댓글남기기