파이썬의 class
지난 포스팅에서도 언급했다시피 class는 객체모델링의 수단입니다. 현실세계의 객체를 프로그래밍적으로 묘사하는 방법이죠.
이번 포스팅에선 학생이라는 현실 세계의 개체를 객체를 프로그래밍으로 표현해보겠습니다.
클래스를 만들 때, 두가지 관점에 유의하면 좋습니다.
- 상태 (인스턴스)
- 행위 (메서드)
좀 더 구체적으로 묘사하며 학생을 떠올려보겠습니다.
학생은 학년이 있을것이며, 학번이 있고, 전공, 학교, 키, 몸무게, 이름, 주소 등등 여러가지 상태를 갖고 있을 것입니다. 이러한 상태는 “변수”를 만들어줘서 저장을 하게 되는데 이것을 파이썬에서는 “instance variable (인스턴스)” 라고 부른다. (자바나 다른 언어에선 다른 방식으로 이런 상태를 부른다고 합니다)
그렇다면 행위엔 무엇이 있을까요? 학생이 할 수 있는 동작들입니다. 예를 들면, “수업을 듣다, 수강 신청을 하다, 등교를 하다” 등과 같은 학생들이 할 수 있는 동작들을 상상하면 됩니다. 이 행위들은 클래스 내 함수에 저장됩니다. 이런 객체만의 저장된 함수를 “메서드 (method)”라고 부릅니다.
파이썬으로 이제 학생을 한 번 만들어보겠습니다.
class Student:
def __init__(self, name, dept, num, grade):
self.name = name
self.dept = dept
self.num = num
self.grade = grade
# name: 이름
# dept: 학과
# num: 학번
# grade: 성적
[ class로 정의하고자하는 객체의 첫 letter는 무조건 대문자로 써야함을 기억합시다. 소문자로도 클래스 생성이 가능합니다만 통상적으로 소문자는 함수, 대문자는 클래스를 의미합니다. ]
처음 class 를 만들면 class안에 함수가 내재되어 있는 것을 심심치 않게 볼 수 있습니다. 위에서도 말했지만 함수는 객체의 행위를 위해 정의됩니다.
필자는 처음 class를 접했을 때 “뭐야 근데 함수 이름이 왜저래??? __init__????“ 이런 생각을 했었는데 __init__은 단순히 initializer라는 생성자를 의미하며 class 사용시 대부분의 경우 가장 먼저 등장하는 함수임을 인지하면 되겠습니다.
또한 __init__ 의 인자로 가장 먼저 self 가 나오는 것도 필히 알고 있어야한다.
사실 위 코드를 설명하려면 메모리 구조부터 stack, heap 등등 설명해야할 부분이 많기는 합니다만, 문맥상 생략하겠습니다. 지금 당장은 self.<variable name> 은 인스턴스 변수임을 인지하고 로컬 변수(local variable)와는 메모리 측면에서 다르다는 것만 어렴풋이 알아두고 넘어가겠습니다.
자 그럼 학생이라는 인스턴스를 만들어보겠습니다. 👨🎓
stu1 = Student('Gildong', 'CS', '12345', 3.5)
이름은 길동, 학과는 컴싸, 학번은 12345, 학점은 3.5인 학생을 한명 만들었습니다.
즉 학생이라는 instance 안에 4개의 정보가 들어있는것으로 볼 수 있습니다. 스트링 세 개, 실수 하나. 자료구조측면에선 새로운 자료 하나를 만들어내는 거라 볼 수 있습니다.
class는 자료형 또는 자료구조를 이용하여 새로운 자료형을 만들어내는 것이라고 표현할 수 있겠다. 이런걸 Abstract Data Type (ADT)라고 합니다.
이번에는 class를 조금 더 발전시켜보겠습니다.
class Student:
def __init__(self, name, dept, num, grade):
self.name = name # 이름
self.dept = dept # 학과
self.num = num # 학번
self.grade = grade # 성적
def get_student_info(self): # 마찬가지로 첫번째 인자엔 self 가 들어와야함
print(self.name, self.dept, self.num, self.grade)
def set_stu_name(self, name):
self.name = name
#### 아까와 같이 학생 객체를 만들어보자.
stu1 = Student("Gildong", "CS", "12345", 3.5)
print(stu1.name)
# '.' 을 이용해서 속성을 출력할수 있다.
# 출력물: Gildong
stu1.get_student_info() # class에서 정의한 함수를 호출하면 method를 사용하는 것임.
# 출력물: Gildong CS 12345 3.5
stu1.set_stu_name('AAA') # 객체의 이름이 AAA로 바뀐다.
stu1.get_student_info() # 다시 메서드를 호출
# 출력물: AAA CS 12345 3.5
이렇게 학생이라는 인스턴스를 class를 선언하여 만들 수 있었습니다.
아직은 복잡하고 헷갈리는 class라는 개념을 꾸준하게 활용해보면서 이해하는 것이 중요하다고 생각합니다.
'파이썬 > 클래스' 카테고리의 다른 글
[python] 파이썬 class의 __call__ 함수 (매직메소드) (0) | 2023.03.12 |
---|---|
[python] 클래스 메서드(class method)와 정적 메서드(static method) (0) | 2023.03.08 |
[python] 파이썬 Class 내 self.<variable name>에서 self 키워드는 어떤 역할을 할까? (0) | 2023.03.05 |
파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer) (0) | 2023.01.02 |
파이썬과 객체지향 (python and class) 1 (0) | 2023.01.02 |