일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- level1
- 자바스크립트
- superstarjypnation
- 30daysdowoonchallenge
- React
- 회고
- html
- Til
- 자료구조
- 큐
- UX
- REST_API
- javascript
- 코드스테이츠
- 프로그래머스
- CSS
- UI
- Next.js
- vercel
- 스택
- web
- mysemester
- 생활코딩
- 카카오
- 백준
- 해시테이블
- 프로토타입
- 운영체제
- useState
- redux
- Today
- Total
데굴데굴
<Python> 클래스 Class 본문
자료구조 수업을 들으면서 클래스를 이용하여 자료구조를 직접 구현하는 과제를 자주 접했다.
큐나 스택까지는 괜찮았지만, 연결리스트나 해시테이블 과제에서는 막히는 부분이 많았다.
의사코드만 주어졌을 때 이걸 코드로 표현함에 있어서 부족함을 느꼈고, 클래스의 기본 개념이 부족해서 생긴 문제라고 판단했다. 따라서 클래스가 뭔지, 어떻게 쓰이는지 잘 파악하고 있어야 할 것 같았다.
동빈나님의 파이썬 강의를 참고했다.
클래스란?
반복되는 불필요한 코드를 최소화하면서 현실 세계의 사물을 컴퓨터 프로그래밍 상에서 쉽게 표현할 수 있도록 해주는 프로그래밍 기술.
클래스를 이용해 현실 세계 사물의 특성을 구현 가능.
자료형, 문자열처럼 우리만의 자료형을 정의할 수 있음.
객체지향프로그래밍이 가능하도록 하는 첫 번째 단계.
클래스의 구성 요소
멤버: 클래스 내부에 포함되는 변수
함수: 클래스 내부에 포함되는 함수 (=메소드 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 ]