Coding/Jump to Python

Python - 클래스 / 메서드 /생성자 / 상속 / 클래스 변수

빈그레 2023. 9. 22. 17:21

 

 

 

 

 


05-1 클래스

 

 

 

 

 

 

 

 

 

 

 

 

 

클래스 선언

 

 =를 사용하여 cal1,cal2라는 Calculator 객체를 만든다.

 

 

 class 객체를 만들면 동일한 동작에 대해서 여러개의 함수를 만들어 return값을 따로 저장하지 않아도

 하나의 class 만으로 각각 연산해낼 수 있다.

 

 

다른 예시를 살펴보자.

만약 Cookie라는 class가 이전에 정의되었을 때

위와 같이 Cookie()의 결과값을 돌려받도록 a,b라는 객체를 만들어줄 수 있다. 마치 함수를 사용해서 그 결과값을 돌려받는 모습과 비슷하다.

 

class로 만든 객체를 인스턴스라고도 하나 a자체는 객체라 표현하고, Cookie의 인스턴스로서 a를 설명할 때에만 인스턴스라는 단어로 표현하는 것이 자연스럽다.

 

 

객체에 숫자 지정 (사칙연산 예시)

 

a객체에 대해서 사칙연산을 하려면 먼저 2개의 operand를 지정해주어야 한다. 그러기 위해서는 setdatat함수를 FourCal class 내에 정의해주어야 한다.

 

클래스 안에 정의된 위 setdata와 같은 함수를 메서드라고도 한다. 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. class 내부 함수인 메서드를 호출함으로써, 객체 자기 자신도 메서드에 전달되어야 하기 때문이다.

 

인자의 전달과정은 다음과 같다. 메서드 호출하면 자동으로 객체가 함수의 첫 인자로서 들어가므로, 사용자는 객체 외의 다른 파라미터만 입력해주면 된다. 이것이 메서드 정의에서는 parameter가 3개이나, 실제 사용에서는 하나를 뺀 개수만큼의 입력값이 들어가는 이유이다.

 

위와 같이 입력되면 self.first는 4가 되고, self.second는 2가 된다.

self는 결국 객체a이므로 a.first도 4가 되고, a.second도 2가 된다.

 

setdata이후에 위와 같이 새롭게 정의되는 사칙연산 메서드에 대하여 객체에 적용시킬 수 있다.

 

setdata를 통해 이미 operrand가 지정된 상태이므로, add와 같은 사칙연산 메서드의 parameter에는 아무것도 들어가지 않아도 된다.

 

 

 

생성자(Constructor)

 

setdata 메서드를 수행하지 않고, 다른 연산 메서드를 사용하면 다음과 같이 오류가 뜬다. 객체에 초기값이 필요할 때에는 setdata와 같은 메서드를 이용하는 것보다 생성자를 구현하는 것이 안전한 방법이다.

 

위와 같이 __init__으로 생성자를 추가하면 setdata로 값을 넣어주지 않아도 

 

class 객체 생성과 동시에 값을 파라미터로 바로 넣어줄 수 있다.

 

 

클래스의 상속

: 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다. 

이전에 다루었던 FourCal 클래스에서 제곱을 구할 수 있는 기능을 추가해보자.

클래스를 상속하기 위해서는 클래스를 정의할 때 클래스 이름 옆 괄호에 상속할 클래스의 이름을 넣어주면 된다.

 

 

FourCal의 기능을 모두 상속받은 MoreFourCal  클래스는 FourCal의 기능을 모두 사용할 수 있다.

 

 

 

클래스 변수

 

객체 변수는 다른 객체들에 영향을 받지 않고 독립적으로 그 값을 유지한다.

하지만 클래스 변수는 클래스의 변수를 직접 바꾸면 해당 클래스를 가진 모든 객체들의 클래스 변수가 변경된다.

 

위와 같이 클래스 변수를 김이라 하고 a,b 객체를 만든 뒤

 

클래스의 변수를 다음과 같이 박으로 바꾸면

 

해당 클래스를 가진 모든 객체들의 클래스 변수들의 lastname이 박으로 변한다.

즉, 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있다.

 

id 함수를 사용하여 각 lastname이 가리키는 곳의 주소를 확인하면 모두 같은 메모리를 가리키고 있다는 것을 확인할 수 있다.