Today I Learned 26 - Python / 객체 지향 프로그래밍

angie·2022년 7월 30일
0

Python

목록 보기
6/11
post-thumbnail

**TIL at 220727

객체 지향 프로그래밍

클래스와 객체, 인스턴스

클래스와 객체

img

  • 과자 틀 = 클래스 (Class)
  • 과자 틀로 만든 과자 = 객체 (Object)

클래스란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면이고, 객체란 클래스로 만든 피조물(실제 사례)를 뜻한다.

객체와 인스턴스의 차이점?

  • 인스턴스 : 클래스로 만든 객체

그렇다면 객체와 인스턴스는 같은 개념이 아닌가...하며 헷갈리기 시작한다. 그렇다면 둘의 차이는 무엇일까?

위의 예시에서 과자 틀로 만든 과자를 객체라고 했다. 그렇다면 과자는 인스턴스일까? 정답은 맞기도 하고 틀리기도 하다. 왜냐하면 무엇이 '인스턴스다'라고 하려면 그 목적어가 필요하기 때문이다!

  • '과자'는 객체다 (O)
  • '과자'는 인스턴스다 (X) -> '과자'는 과자 틀의 인스턴스다 (O)

객체와 클래스 문법

기본 문법

  • 클래스의 정의

    class MyClass:
        def my_method():
            ...
  • 인스턴스 생성

    my_instance = MyClass()

    클래스를 호출하여 인스턴스를 만든다.

  • 메서드 호출

    my_instance.my_method()
  • 속성

    my_instance.my_attribute

인스턴스 변수

  • 인스턴스 변수란?
    • 인스턴스가 개인적으로 가지고 있는 속성
    • 각 인스턴스들의 고유한 변수
  • 생성자 메서드에서 self.<name>으로 정의 (만든다)
  • 인스턴스가 생성된 이유 <instance>.<name> (사용한다)

클래스 변수

  • 클래스변수란
    • 한 클래스의 모든 인스턴스가 공유하는 값을 의미
    • 같은 클래스의 인스턴스들은 같은 값을 갖게 됨
  • 클래스 선언 내부에서 정의
  • <classname>.<name> 으로 접근 및 할당

인스턴스 변수, 클래스 변수 예시

class Circle():
	pi = 3.14  # 클래스 변수 정의
	
	def __init__(self,r):
		self.r = r  # 인스턴스 변수
        
c1 = Circle(5)  # 인스턴스 생성, 인스턴스 변수 할당 (c1.r = 5)
c2 = Circle(10) # 인스턴스 생성, 인스턴스 변수 할당(c1.r = 10)

print(Circle.pi) # 3.14
print(c1.pi) # 3.14
print(c2.pi) # 3.14

Circle.pi = 5  # 클래스 변수 수정 -> 공용의 변수가 바뀌므로 다같이 바뀜
print(Circle.pi)  # 5
print(c1.pi)  # 5
print(c2.pi)  # 5

클래스 변수 활용 (사용자 수 계산하기)

  • 인스턴스가 생성될 때마다 클래스 변수가 늘어나도록 설정
    • 인스턴스가 생성되면 def이하 구문 무조건 1번은 실행됨
class Person:
    count = 0
    # 인스턴스 변수 설정
    def __init__(self, name):
        self.name = name
        Person.count += 1
        
person1 = Person('아이유')  # 인스턴스 생성
person2 = Person('이찬혁')  # 인스턴스 생성

print(Person.count)  # 2

OOP 메서드

  • 메서드 : 클래스 안에 있는 함수

인스턴스 메서드

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

  • 클래스 내부에 정의되는 메서드의 기본

  • 호출 시, 첫번째 인자로 인스턴스 자기자신(self)이 전달됨

클래스 메서드

  • 클래스가 사용할 메서드
  • @classmethod 데코레이터를 사용하여 정의
  • 호출 시, 첫번째 인자로 클래스(cls)가 전달됨

클래스 메서드 생성 방법

class MyClass:
    
    @classmethod
    def class_method(cls, arg1, ...)
    
MyClass.class_method(...)

클래스 메서드 활용 예시

class Person:
    count = 0  # 클래스 변수
    def __init__(self, name):
        self.name = name   # 인스턴스 변수(self.<name>)
        Person.count += 1  # 인스턴스가 생성될 때마다 클래스 변수를 변경
         
    @classmethod
    def number_of_population(cls):  # 클래스 변수를 사용하는 클래스 메서드
        print(f'인구수는 {cls.count}입니다.')  # 클래스 변수(cls.<name>)
        
person1 = Person('아이유')
person2 = Person('이찬혁')
print(Person.count)  # 2

정리

  • 클래스 메서드 → 클래스 변수 사용 cls
  • 인스턴스 메서드 → 인스턴스 변수 사용 self
  • 인스턴스, 클래스 변수 모두 사용하고 싶다면?
    • 클래스는 인스턴스 변수 사용이 불가능
    • 인스턴스 메서드는 클래스 변수, 인스턴스 변수 둘 다 사용이 가능 ( 둘다 고치고 싶다면 인스턴스 메서드를 사용하면 됨 )
profile
better than more

0개의 댓글