[Python] Class

DongHyeon Jung·2022년 10월 12일
0

Python

목록 보기
8/8
post-thumbnail

Class

클래스(class)란?

클래스를 이용하면 할 객체에 동작과 상태를 묶을 수 있다
동작이란 코드 덩어리 즉 함수
상태란 클래스 내 값을 저장하는 변수이다
메서드로 클래스 동작을 정의하는데
oop에서는 클래스 안 정의도니 함수를 메서드라고한다

컨텍스트 관리자를 만들 때는 캡슐화를 사용한다

캡슐화(encapsulation)란?

캡슐화(영어: encapsulation)는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다:
객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고,
실제 구현 내용 일부를 외부에 감추어 은닉한다.

데이터와, 데이터를 처리하는 행위를 묶고, 외부에는 그 행위를 보여주지 않는 것.

코드의 중복을 피한다는 점과, 동작 방식을 외부에서 알 필요가 없다는 것..

클래스를 이용하면 객체 인스턴스화해야한다 = 객체를 만들기 위해 클래스를 호출함

예를 들어보자

class Rabbit:  
    def __init__(self):  
        self.num = int(input("enter a number: "))  
        self.name = input("enter a name: ")  
    def check(self):  
        print("{}번 {} 출석체크!".format(self.num, self.name))  
    def score(self, score):  
        if score <= 40:  
            self.grade = "C"  
        elif score < 80:  
            self.grade = "B"  
        else:  
            self.grade = "A"

# 인스턴스
a = Rabbit()  
b = Rabbit()

# 메서드 호출
a.check()  
b.check()  
  
a.score(55)  
b.score(89)

이때 클래스로 만든 객체는 클래스의 동작(클래스 내 정의된 메서드)은 공유하지만
상태(속성)는 공유하지 않는다

각 객체는 각자 자신의 상태를 유지한다


그렇다면 self를 사용하는 이유는??

def check(self):

언제나 객체를 받을 수 있도록 첫번째 인자는 self라는 특별한 이름을 붙인다
메서드에 첫 번째 인자가 없으면 인터프리터가 런타임 에러를 발생시키기 때문이다
(참고로, 다른 프로그래밍 언어에는 this라는 비슷한 개념이 존재한다)

객체의 메서드를 호출할 때 파이썬은 첫 번째 인자 self를 호출 객체 인스턴스로 설정한다
메서드의 스위트에서 속성에 접근할 때, self를 앞에 붙이지 않으면 메서드 코드가 종료될 때 그 속성값이 유지되지 않는 문제가 발생한다
이것이 바로 self가 모든 객체 메서드의 첫 번째 인자가 되어야 하는 중요한 이유이다

class Rabbit:
	def increase(self):
		self.value ++

속성 앞에 self를 붙인다
메서드는 객체의 속성값을 사용하므로 메서드가 종료되어도 소멸되지 않아야 한다
따라서 self.value 와 같이 메서드 코드에 self를 붙이는 것이다


그렇다면 init을 사용하는 이유는?

파이썬에서 변수를 시작값으로 초기화해야 한다
init을 이용하면 새 객체를 만들 때 속성의 초깃값을 지정할 수 있다
이때 생성자라는 개념을 사용한다
파이썬에서 인터프리터가 객체 인스턴스화 과정을 처리하므로 생성자로 인스턴스화를 관리할 필요가 없다 속성 초기화는 init 으로 처리한다

def __init__(self):

이를 활용하면 다음과 같다

class Rabbit:
	def __init__(self, v: int, i: int):
		self.val = v
		self.invr = i
	def increase(self):
		self.value  += self.incr

Reference

https://bperhaps.tistory.com/entry/%EC%BA%A1%EC%8A%90%ED%99%94%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EC%96%B4%EB%96%A4-%EC%9D%B4%EC%A0%90%EC%9D%B4-%EC%9E%88%EB%8A%94%EA%B0%80

0개의 댓글