일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리눅스 명령어
- sql
- 코딩테스트
- Oracle
- Python 라이브러리
- 오라클
- tibero
- python algorithm
- 파이썬 알고리즘
- csharp
- linux
- MariaDB
- RFP
- 파이썬 데이터프레임
- Oracle VM VirtualBox
- 파이썬
- it용어
- Algorithm
- VirtualBox
- it 용어
- PYTHON
- Python DataFrame
- 알고리즘
- dbeaver
- 리눅스
- 데이터베이스
- putty
- 파이썬 전처리
- HTML
- C#
- Today
- Total
오경석의 개발노트
Python_클래스 정의 본문
파이썬에서 필수적으로 알아야 할 개념이 있다. 라이브러리, 패키지, 모듈, 클래스, 함수 등이 파이썬을 다루기 위해서는 한 번쯤은 개념 정리를 하고 넘어가야 하는 용어다. 용어 순서대로 하위 항목들을 포함하고 있다.
이번 포스팅에서는 클래스의 개념을 알아보자. 파이썬 공식 문서에서 작성된 개념은 입문자들에게 어려움이 존재하니 국내에서 잘 작성된 페이지에서 정리하였다. 출처는 포스팅 제일 하단에 적어두었다.
클래스(class, 어원 : classification, 분류·범주)의 개념
객체 지향 프로그래맹(OOP)에서 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 일종의 틀(template).
객체를 정의하기 위한 메서드와 변수로 구성된다. 템플릿을 사용하면 객체를 분류할 때 멤버의 자료형을 미리 정하지 않고 객체를 사용할 때 결정할 수 있다. 이를 통해 클래스나 변수의 중복 정의를 하지 않아도 되므로 효율적으로 코딩이 가능하다.
클래스는 객체의 구조와 행동을 결정한다. 복잡하거나 반복되는 문제를 다루기 쉽게 도와준다. 클래스로 만든 각 객체들은 고유한 성격을 가진다. 동일한 클래스로 만든 객체는 서로 영향을 주지 않는다. 인스턴스는 "어떤 클래스 A의 객체 a가 있을 때, a는 클래스 A의 인스턴스이다."라고 말할 때 사용된다. 즉, a가 어떤 클래스인지 관계 위주로 설명할 때 사용한다. 객체는 클래스로 규정된 인스턴스로서, 변수 대신 실제값을 가진다.
클래스는 OOP를 정의하는 개념 중 하나인데, 클래스에 대한 중요한 몇 가지의 개념들은 다음과 같다.
- 클래스는 전부 혹은 일부를 그 클래스 특성으로부터 상속받는 서브클래스를 가질 수 있으며, 클래스는 각 서브클래스에 대해 슈퍼클래스가 된다.
- 서브클래스는 자신만의 메서드와 변수를 정의할 수도 있다.
- 이러한 클래스와 그 서브클래스 간의 구조를 '클래스 계층(hierarchy)'라고 한다.
클래스 예제
계산기 프로그램을 만들면서 함수만 사용한 것과 클래스를 사용한 것 이 두 가지를 직접 비교해보자. 먼저 함수만 사용한 경우는 다음과 같다.
함수만 사용하는 경우
result = 0
def add(num):
global result
result += num
return result
def sub(num):
global result
result -= num
return result
def mul(num):
global result
result *= num
return result
def div(num):
global result
result /= num
return result
클래스를 사용한 경우
class Calculator: # 파이썬 스타일 가이드에 따라 첫 문자는 대문자(함수는 소문자)
def __init__(self): # 생성자, 클래스가 객체를 생성할 때 가장 먼저 도달하는 곳
self.result = 0
def add(self, num):
self.result += num
return self.result
def sub(self, num):
self.result -= num
return self.result
def mul(self, num):
self.result *= num
return self.result
def div(self, num):
self.result /= num
return self.result
cal = Calculator() # 생성자에 self를 제외하고 추가적인 인수가 있으면 괄호안에 해당 값 넣기
cal2 = Calculator() # cal, cal2를 객체라 부르고 이 둘은 독립적인 값을 유지한다.
두 스크립트의 차이점이 무엇일까? 첫 번째 함수만 사용한 코드를 보면 전역변수를 함수마다 넣어줘야 하고 클래스를 사용한 경우는 함수에 한 번만 적용하면 된다. 코드가 길어지면 차이가 확연히 날것이다.
또한 클래스를 사용하지 않으면 계산기가 추가로 필요할 때마다 다른 계산기와 결괏값을 독립적으로 유지하기 위해 전역 변수와 함수를 추가로 작성해야 한다. 한마디로 코드가 배로 늘어난다. 하지만 클래스를 사용하면 그럴 필요 없이 계산기 대수가 늘어나더라도 객체를 생성만 하면 되기 때문에 함수를 사용하는 경우와 달리 매우 간단해진다.
계산기가 10개가 필요하면 위의 함수만 사용한 코드는 10배로 늘어날 것이고, 클래스를 사용한다면 새로운 변수 9줄만 추가로 작성하면 된다. 이는 어마어마한 차이가 발생해서 가독성에서 큰 차이가 날것이다.
※ 클래스 안에 구현된 함수는 다른 말로 메서드(Method)라고 부른다.
생성자(Constructor)
클래스를 호출할 때 자동으로 어떤 함수를 실행하거나 값을 호출하고 싶다면 생성자(Constructor)라는 걸 정의하면 된다.
메서드 이름으로 __init__을 사용하고 나머지는 같다. 초기 변수 생성, 문자열 출력 등에 사용된다. 만약 생성자 메서드 인수에 self 말고도 추가적인 인수를 받는다면 객체를 생성할 때 괄호 안에 인수를 넣어줘야 한다.
메서드의 매개변수 self
클래스를 사용한 스크립트를 보면 함수에 self 매개변수가 들어가 있는 게 보인다. 일반 함수와는 달리 메서드의 첫 번째 매개변수 self는 특별한 의미를 가진다. 위 스크립트와 같이 cal 객체를 만들고 cal 객체를 통해 add 메서드를 호출해 보자.
cal = Calculator()
cal.add(1)
여기서 주의 깊게 봐야 할 부분이 있다. add 메서드에는 self, num 총 2개의 매개변수가 필요한데 실제로는 cal.add(1)처럼 1개 값만 전달했다. 그 이유는 첫 번째 매개변수 self에는 add 메서드를 호출한 객체 cal가 자동으로 전달되기 때문이다.
다음 그림을 보면 객체를 호출할 때 입력한 값이 메서드에 어떻게 전달되는지 쉽게 이해할 수 있을 것이다.
파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다.
객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한 것이다. 물론 self 말고 다른 이름을 사용해도 상관없다.
※ 메서드의 첫 번째 매개변수 self를 명시적으로 구현한 것은 파이썬만의 독특한 특징이다. 예를 들어 자바 같은 언어는 첫 번째 매개변수 self가 필요 없다.
파이썬 클래스의 가장 간단한 예
class Paladin:
pass # pass는 아무것도 수행하지 않는 문법으로 임시로 코드를 작성할 때 주로 사용
메이플스토리 게임에서 전사계열인 팔라딘이라는 클래스를 만들어보았다. 위의 클래스는 아무 기능도 갖고 있지 않은 껍질뿐인 클래스이다. 하지만 이렇게 껍질뿐인 클래스도 객체를 생성하는 기능이 있다. 왜냐하면 클래스는 말 그대로 일종의 설계도, 틀(template)이기 때문이다.
객체는 클래스로 만들며 1개의 클래스는 무수히 많은 객체를 만들어 낼 수 있다. 위에서 만든 Paladin 클래스의 객체를 만드는 방법은 다음과 같다.
uesr_a = Paladin()
user_b = Paladin()
Paladin()의 결괏값을 돌려받은 user_a와 user_b가 바로 객체이다. 메이플스토리에서 팔라딘이라는 직업(클래스)을 선택하면 각각의 유저(객체)들은 서로의 영향 없이 캐릭터를 육성할 수 있다. 마치 함수를 사용해서 그 결괏값을 돌려받는 모습과 비슷하다.
객체와 인스턴스의 차이
클래스로 만든 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? user_a = Paladin() 이렇게 만든 user_a는 객체이다. 그리고 user_a 객체는 Paladin의 인스턴스이다.
즉, 인스턴스라는 말은 특정 객체(user_a)가 어떤 클래스(Paladin)의 객체인지를 관계 위주로 설명할 때 사용한다. "uesr_a는 인스턴스"보다는 "user_a는 객체"라는 표현이 어울리며 "user_a는 Paladin의 객체"보다는 "user_a는 Paladin의 인스턴스"라는 표현이 맞다.
클래스의 상속
상속(Inheritance)이란 "물려받다"라는 뜻으로, 클래스에서도 이 개념을 적용할 수 있다. 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다. 보통 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.
또한 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 한다. 이번에는 상속 개념을 사용하여 이전에 만든 Calculator 클래스에 a^a(a의 a제곱)을 구할 수 있는 기능을 추가해보자. 앞에서 Calculator 클래스는 이미 만들어 놓았으므로 Calculator 클래스를 상속하는 MoreCalculator 클래스는 다음과 같이 간단하게 만들 수 있다.
class MoreCalculator(Calculator):
pass
클래스를 상속하기 위해서는 위처럼 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다. 이제 a^a(a의 a제곱)을 구할 수 있는 기능을 추가해보자.
class MoreCalculator(Calculator):
def pow(self, num):
self.result = num ** num
return self.result
pass 문장은 삭제하고 위와 같이 num의 거듭제곱을 구할 수 있는 pow 메서드를 추가했다. 그리고 다음과 같이 수행해보자.
MCal = MoreCalculator()
MCal.pow(3)
>>> 27
MoreCalculator 클래스로 만든 MCal 객체에 값 3을 설정한 후 pow 메서드를 호출하면 3의 3 제곱인 27을 돌려준다. 상속은 MoreCalculator 클래스처럼 기존 클래스(Calculator)는 그대로 놔둔 채 클래스의 기능을 확장시킬 때 주로 사용한다.
메서드 오버라이딩
이번에는 Calculator 클래스를 다음과 같이 실행해보자.
MCal = MoreCalculator()
MCal.div(0)
>>> ZeroDivisionError Traceback (most recent call last)
<ipython-input-44-2bc297314631> in <module>
1 MCal = MoreCalculator()
----> 2 MCal.div(0)
<ipython-input-26-e291ffa355f8> in div(self, num)
19
20 def div(self, num):
---> 21 self.result /= num
22 return self.result
23
ZeroDivisionError: division by zero
Calculator 클래스의 div 메서드에서 0으로 나누려고 하면 ZeroDivisionError 오류가 발생한다. 하지만 0으로 나눌 때 오류가 아닌 0을 돌려주려면 다음과 같이 오버라이딩해야한다.
class SafeCalculator(Calculator):
def div(self, num):
if num == 0:
return 0
else:
return num / num
SafeCalculator 클래스는 Calculator 클래스에 있는 div 메서드를 동일한 이름으로 다시 작성하였다. 이렇게 부모 클래스(상속한 크래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(Overriding, 덮어쓰기)이라고 한다.
이렇게 메서드를 오버라이딩하면 부모클래스의 메서드 대신 오버라이딩한 메서드가 호출된다. SafeCalculator 클래스에 오버라이딩한 div 메서드는 나누는 값이 0인 경우에는 0을 돌려주도록 수정했다. 이제 다시 위에서 수행한 예제를 Calculator 클래스 대신 SafeCalculator 클래스를 사용하여 수행해보자.
SCal = SafeCalculator()
SCal.div(0)
>>> 0
Calculator 클래스와 달리 SafeCalculator는 0을 돌려주는 것을 확인할 수 있을 것이다.
클래스와 객체의 관계 모형
클래스 (컴퓨터 프로그래밍) - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전.
ko.wikipedia.org
[Python] 클래스 class 연습문제
저는 초보자를 위한 파이썬 300제라는 온라인 교재📕로 학습하고 정리합니다. 문제 출처를 미리 밝힙니다.초보자를 위한 웅앵웅이래서 쉬운 줄 알았더니... 착각은 자유.클래스, 객체, 인스턴스
velog.io
05-1 클래스
초보 개발자들에게 클래스(class)는 넘기 힘든 장벽과도 같은 존재이다. 독자들 중에도 클래스라는 단어를 처음 접하는 이들도 있을 것이다. 그러면 도대체 클래스가 무엇인지 ...
wikidocs.net
파이썬 클래스(class) 객체 인스턴스 이해하기
파이썬 class 포스팅을 시작합니다 이번 파이썬 포스팅에서는 파이썬을 공부할 때 꼭 알아야 할, 클래스(class)·객체·인스턴스에 대해서 알아보겠습니다. 포스팅의 초반이지만 클래스(class)와 객
www.itple.co.kr
'프로그래밍 언어 > Python' 카테고리의 다른 글
Python_변수의 개념과 생성, 작명법 (0) | 2022.09.05 |
---|---|
Python_스타일 가이드 (0) | 2022.09.02 |
Python_라이브러리 정의 (0) | 2022.08.29 |
Python_패키지 정의 (0) | 2022.08.29 |
Python_모듈 정의 (0) | 2022.08.24 |