Java에서 Exception 클래스를 상속받아 사용자 정의 예외 클래스를 만들었듯, Python에서도 Exception 클래스를 상속받아 직접 에러를 만들 수 있습니다. Number라는 클래스를 인스턴스화할 때, 음수를 전달하면 에러를 발생시키도록 하겠습니다.

Exception 클래스를 상속받아 NegativeNumberError라는 클래스를 생성했고, __str__이라는 매직 메소드를 정의하여 객체가 print 함수에 전달될 경우 객체 내부의 메시지를 리턴하도록 했습니다. Number 클래스의 생성자에서는 인자 n이 음수이면 raise라는 구문을 사용하여 메시지와 함께 에러를 발생시켰습니다. try에서 객체 생성 시, except에서 NegativeNumberError의 e 객체를 그대로 출력하여 '음수는 담을 수 없습니다'가 출력되었습니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 패키지  (0) 2018.07.07
[Python] 모듈  (0) 2018.07.06
[Python] 에러 처리  (0) 2018.07.04
[Python] 연산자 오버로딩  (0) 2018.07.02
[Python] 언더스코어와 magic method  (0) 2018.07.01

프로그래밍 과정에선 수많은 에러를 마주칩니다. 숫자를 0으로 나누거나, 문자열과 정수를 더하거나, Iterable 자료형의 인덱스에 잘못 접근하는 경우 등이 있습니다. Java의 try-catch-finally처럼 Python도 try-except-else-finally 문법을 통해 에러 처리 구문을 만들 수 있습니다.

try-except

다음은 에러 처리를 위한 try-except문의 기본 구조입니다.

try 내부에서 에러의 종류에 상관없이 에러가 발생하면 except 블럭을 수행합니다. except 블럭에는 처리하고자 하는 에러를 지정할 수 있으며, Iterable 자료형의 인덱스에 잘못 접근하는 경우 발생하는 IndexError를 처리해 보도록 하겠습니다.

에러가 발생했을 경우 except에서 해당 에러에 대한 객체를 생성할 수 있습니다. as라는 키워드를 사용합니다.

IndexError는 __str__이라는 매직 메소드를 구현하고 있기 때문에, print에 그대로 넣으면 에러 메시지를 출력할 수 있습니다.

Python에서 기본적으로 다루는 에러는 IndexError, ZeroDivisionError, TypeError 등 매우 많습니다. Python 공식 레퍼런스에서 확인해볼 수 있습니다.

try-except-else-finally

완전한 에러 처리 구문은 try-except-else-finally입니다. except는 try에서 에러가 발생했을 경우 실행되고, else는 에러가 발생하지 않았을 경우 실행되며, finally는 에러 발생 여부에 상관 없이 실행되는 블럭입니다.


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 모듈  (0) 2018.07.06
[Python] 사용자 정의 에러  (0) 2018.07.05
[Python] 연산자 오버로딩  (0) 2018.07.02
[Python] 언더스코어와 magic method  (0) 2018.07.01
[Python] 클래스의 상속  (0) 2018.06.30

직접 정의한 클래스에 의해 생성된 객체는 기본적으로 연산이 불가능합니다.

연산자 오버로딩

직접 정의한 클래스의 객체에 +, -, *와 같은 일반 연산을 적용하려면, 객체를 연산 가능한(operable) 상태로 만들어야 합니다. 연산자 오버로딩을 통해 이를 구현하며, 이전에 언급했던 매직 메소드를 클래스에 정의하여 연산자 오버로딩을 구현할 수 있습니다.

여기서는 __add__라는 매직 메소드를 구현했습니다. 이는 해당 객체에 대한 + 연산을 오버로딩합니다. 이렇게 되면, 객체에 + 연산이 이루어질 경우 Python 인터프리터가 __add__ 메소드를 호출합니다. 함수 내부에서는 self(객체 자신)other(더하고자 하는 값)을 명시하였습니다.

  • other가 Number 클래스의 객체라면 self.n과 other.n을 더해 Number 객체를 만들어 반환하고
  • other가 int 클래스의 객체(정수)라면 self.n과 other를 더해 Number 객체를 만들어 반환합니다.

연산자 오버로딩 메소드의 종류

Python에서 사용되는 모든 연산자들은 매직 메소드로 정의하여 오버로딩 가능합니다.

  • __add__(self, other) : 이항 + 연산자(A + B, A += B)
  • __sub__(self, other) : 이항 - 연산자(A - B, A -= B)
  • __mul__(self, other) : 이항 * 연산자(A * B, A *= B)
  • __truediv__(self, other) : 이항 / 연산자(A / B, A /= B)
  • __floordiv__(self, other) : 이항 // 연산자(A // B, A //= B)
  • __mod__(self, other) : 이항 % 연산자(A % B, A %= B)
  • __pow__(self, other) : 이항 연산자(A B, pow(A, B))
  • __lshift__(self, other) : 이항 << 연산자(A << B, A <<= B)
  • __rshift__(self, other) : 이항 >> 연산자(A >> B, A >>= B)
  • __and__(self, other) : 이항 & 연산자(A & B, A &= B)
  • __xor__(self, other) : 이항 ^ 연산자(A ^ B, A ^= B)
  • __or__(self, other) : 이항 | 연산자(A | B, A |= B)
  • __not__(self) : 단항 ~ 연산자(~A)
  • __abs__(self) : 단항 절대값 연산자(abs(A))

비교 연산자 오버로딩

비교 연산자들도 오버로딩 가능합니다.

비교 연산자 오버로딩 메소드의 종류

  • __lt__(self, other) : < 연산자 - Less than(self가 other 미만인지)
  • __le__(self, other) : <= 연산자 - Less than or equal to(self가 other 이하인지)
  • __gt__(self, other) : > 연산자 - Greater than(self가 other 초과인지)
  • __ge__(self, other) : >= 연산자 - Greater than or equal to(self가 other 이상인지)
  • __eq__(self, other) : == 연산자 - Equal to(self와 other가 같은지)
  • __ne__(self, other) : != 연산자 - Not equal to(self와 other가 다른지)


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 사용자 정의 에러  (0) 2018.07.05
[Python] 에러 처리  (0) 2018.07.04
[Python] 언더스코어와 magic method  (0) 2018.07.01
[Python] 클래스의 상속  (0) 2018.06.30
[Python] 객체지향  (0) 2018.06.29

+ Recent posts