데굴데굴

<Python> 클래스 Class 본문

Programming/Python

<Python> 클래스 Class

aemaaeng 2022. 7. 6. 11:52

자료구조 수업을 들으면서 클래스를 이용하여 자료구조를 직접 구현하는 과제를 자주 접했다.

큐나 스택까지는 괜찮았지만, 연결리스트나 해시테이블 과제에서는 막히는 부분이 많았다. 

의사코드만 주어졌을 때 이걸 코드로 표현함에 있어서 부족함을 느꼈고, 클래스의 기본 개념이 부족해서 생긴 문제라고 판단했다. 따라서 클래스가 뭔지, 어떻게 쓰이는지 잘 파악하고 있어야 할 것 같았다. 

 

동빈나님의 파이썬 강의를 참고했다.

 

클래스란?

반복되는 불필요한 코드를 최소화하면서 현실 세계의 사물을 컴퓨터 프로그래밍 상에서 쉽게 표현할 수 있도록 해주는 프로그래밍 기술.

클래스를 이용해 현실 세계 사물의 특성을 구현 가능.

자료형, 문자열처럼 우리만의 자료형을 정의할 수 있음.

객체지향프로그래밍이 가능하도록 하는 첫 번째 단계.

 

클래스의 구성 요소

멤버: 클래스 내부에 포함되는 변수

함수: 클래스 내부에 포함되는 함수 (=메소드 method)

 

기본적으로 생성자를 가져야 함. 생성자의 형태는 정해져 있음

__init__(self)

 

학생의 특성을 담은 클래스 Student을 새롭게 정의해보자.

Student 클래스의 멤버로 학생의 이름, 학생의 학년이 있다고 쳐보자.

그렇다면 아래처럼 정의할 수 있을 것이다.

class School:
    # 클래스의 생성자
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
    # 클래스의 메소드
    def show_info(self):
        print("{}학년 {}".format(self.grade, self.name))

 

정의한 Student 클래스를 활용해보자.

S라는 변수에 Student 클래스를 이용하여 김코딩이라는 학생의 정보를 저장했다.

이처럼 클래스를 이용하 저장한 정보를 '인스턴스'라고 한다.

Student 클래스에 정의한 메소드인 show_info()를 출력하면 아래와 같은 결과가 나온다.

S = School("김코딩", 3)
S.show_info()
# 출력 결과
3학년 김코딩

 

파이썬의 클래스 메소드는 기본적으로 모두 self를 매개변수로 받는다.

 

Setter 메소드

setter 메소드는 인스턴스의 값을 수정해주는 메소드이다.

예를 들어, '김고딩'이라는 학생의 정보가 오타가 나 S라는 변수에 '김코딩'으로 잘못 저장된 상황이라고 가정해보자.

S라는 변수 자체에서 수정해줄 수도 있겠지만, setter 메소드를 활용할 수도 있다.

class Student:
    # 클래스의 생성자
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
    def show_info(self):
        print("{}학년 {}".format(self.grade, self.name))
    # Setter 메소드
    def set_name(self, name):
        self.name = name
S.set_name('김고딩')

다시 show_info() 함수를 실행하면 '3학년 김고딩'으로 나온다.

 

소멸자 메소드

소멸자 매소드는 인스턴스를 삭제해준다.

파이썬은 메모리를 유동적으로 사용하기 때문에 정보가 많이 쌓이면 프로그램이 잘 실행되지 않는 경우가 생길 수도 있다.

메모리 관리를 위해 쓰이지 않는 인스턴스는 삭제해주면 좋은데, 이럴 때 쓰이는 것이 소멸자 메소드이다. 

 

S에 담긴 '김고딩'의 정보를 지우고 싶다고 가정해보자.

class Studnet:
    # 클래스의 생성자
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
    def show_info(self):
        print("{}학년 {}".format(self.grade, self.name))
    # Setter 메소드
    def set_name(self, name):
        self.name = name
    # 소멸자: 인스턴스를 지울 때
    def __del__(self):
        print("인스턴스를 소멸시킵니다.")

del S를 입력하고 실행하면 "인스턴스를 소멸시킵니다."라는 문구가 출력되며 변수 S와 S에 담겼던 정보가 모두 삭제된다. 

이 다음에 S.show_into()를 실행하면 S가 정의되지 않았다는 NameError 오류가 뜬다. 

 

상속

다른 클래스의 멤버 변수와 메소드를 물려받아 사용하는 기법

부모 클래스에 정의된 메소드를 자식 클래스에서 그대로 사용할 수 있다.

하지만 반대로 자식 클래스에만 있는 메소드는 부모 클래스에 가져와 쓸 수 없다.

 

궁금한 점

소멸자가 있는 상태로 상속을 하면 명령어를 실행하지 않았는데도 소멸자에 설정한 문구가 출력된다.

왜지?

 

개체의 정보를 담은 Unit 클래스가 있다.

Unit 클래스의 속성을 그대로 물려받아 Monster라는 새로운 클래스를 정의한다.

class Unit:
    def __init__(self, name, power):
        self.name = name
        self.power = power
    def attack(self):
        print(self.name, "이(가) 공격을 수행합니다. [전투력: ", self.power,"]")

class Monster(Unit):
    def __init__(self, name, power, type):
        self.name = name
        self.power = power
        self.type = type
    def show_info(self):
        print("몬스터 이름ㅣ ", self.name, "/ 몬스터 종류: ", self.type)

Monster 클래스는 Unit을 그대로 물려받았기 떄문에 Monster 클래스에 직접적으로 정의되지 않은 attack 메소드도 쓸 수있다.

monster1 = Monster("슬라임", 35, "초급")
monster1.attack()
# 출력 결과
슬라임 이(가) 공격을 수행합니다. [전투력:  35 ]

 

Comments