TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 기초>

[파이썬] 파이썬 기초: 클래스 - 2

by 기록자_Recordian 2024. 10. 15.
728x90
반응형
이전 내용
 

[파이썬] 파이썬기초: 클래스 - 1

클래스(Class) 와 객체(object) 클래스: 똑같은 무언가를 계속 만들어 낼 수 있는 설계 도면객체: 클래스로 만든 피조물. 클래스로 만든 객체는 객체 마다 고유한 성격을 가진다. ◆ 파이썬 클래스의

puppy-foot-it.tistory.com


생성자(Constructor)

 

FourCal 클래스의 인스턴스 a에 setdata 메서드를 수행하지 않고 add 메서드를 수행하면

setdata 메서드를 수행해야 객체 a의 객체변수가 first와 second가 생성되는데, setdata 메서드가 없기 때문에 오류가 발생한다.

a = FourCal()
a.add()
AttributeError: 'FourCal' object has no attribute 'first'

 

이렇게 객체에 초깃값을 설정해야 할 필요가 있을 때는 생성자를 구현하는 것이 안전한 방법인데, 생성자란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.

파이선 메서드 이름으로 __init__ 를 사용하면 이 메서드는 생성자가 된다.

# 사칙 연산 클래스 만들기
class FourCal:
    # 생성자 추가
    def __init__(self, first, second):
        self.first = first
        self.second = second
        
    # setdata 함수 지정
    def setdata(self, first, second):
        self.first = first
        self.second = second

    # 더하기 기능 추가
    def add(self):
        result = self.first + self.second
        return result

    # 곱하기 기능 추가
    def mul(self):
        result = self.first * self.second
        return result

    # 빼기 기능 추가
    def sub(self):
        result = self.first - self.second
        return result

    # 나누기 기능 추가
    def div(self):
        result = self.first / self.second
        return result

 

__init__ 메서드는 setdata 메서드와 이름만 다르고 모든 게 동일하나, 메서드 이름을 __init__ 으로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출되는 차이가 있다.

a = FourCal()

TypeError: FourCal.__init__() missing 2 required positional arguments: 'first' and 'second'

a = FourCal() 을 수행할 때 생성사 __init__이 호출되어 위와 같은 오류가 발생했는데, 이는 생성자의 매개변수 first와 second에 해당되는 값이 전달되지 않았기 때문이다. 

위 오류를 해결하려면 first와 second에 해당되는 값을 전달하여 객체를 생성하면 되며,값을 전달하면 __init__ 메서드에 매개변수에는 각각의 값이 대입된다.

매개변수
self 생성되는 객체
first 첫 번째 값
second 두 번째 값

 

결론적으로, __init__ 메서드가 호출되면 setdata 메서드를 호출했을 때와 마찬가지로 first와 second라는 객체변수가 생성된다. 따라서, a.setdata(4, 2) 등의 코드를 입력하여 setdata 메서드를 호출하는 게 아닌,

a = FourCal(4, 2)로 객체변수를 생성하면 된다.

# 사칙 연산 클래스 만들기
class FourCal:
    # 생성자 추가
    def __init__(self, first, second):
        self.first = first
        self.second = second
        
    # setdata 함수 지정
    def setdata(self, first, second):
        self.first = first
        self.second = second

    # 더하기 기능 추가
    def add(self):
        result = self.first + self.second
        return result

    # 곱하기 기능 추가
    def mul(self):
        result = self.first * self.second
        return result

    # 빼기 기능 추가
    def sub(self):
        result = self.first - self.second
        return result

    # 나누기 기능 추가
    def div(self):
        result = self.first / self.second
        return result

# 기능 시연
a = FourCal(4, 2)
print('더하기:', a.add())
print('곱하기:', a.mul())
print('빼기:', a.sub())
print('나누기:', a.div())


클래스의 상속

 

- 상속(Inheritance): '물려받다' 라는 뜻으로, 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.

상속을 하는 이유는, 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다. 특히, 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 한다.

class 클래스 이름(상속할 클래스 이름)

 

[상속 개념을 사용하여 FourCal 클래스에 제곱 기능 추가하기]

 

1) FourCal 클래스 상속하기

FourCal 클래스를 상속하는 MoreFourCal 클래스를 만들어 제곱 기능을 추가한다.

# 클래스 상속
class MoreFourCal(FourCal):
    pass

 

MoreFourCal 클래스는 FourCal 클래스를 상속했으므로, FourCal 클래스의 모든 기능을 사용할 수 있어야 한다.

# 클래스 상속
class MoreFourCal(FourCal):
    pass

# 기능 시연
a = MoreFourCal(8, 2)
print('더하기:', a.add())
print('곱하기:', a.mul())
print('빼기:', a.sub())
print('나누기:', a.div())


2) MoreFourCal 클래스에 제곱 기능 추가하기

# 클래스 상속
class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result        

# 기능 시연
a = MoreFourCal(8, 2)
print('더하기:', a.add())
print('곱하기:', a.mul())
print('빼기:', a.sub())
print('나누기:', a.div())
print('재곱:', a.pow())


메서드 오버라이딩

 

- 메서드 오버라이딩(Overriding, 덮어쓰기): 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것.

메서드를 오버라이딩하면 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.

# 메서드 오버라이딩
a = FourCal(4, 0)
print('나누기:', a.div())

 

4를 0으로 나눌 경우 아래와 같은 ZeroDivisionError 가 발생하는데,

ZeroDivisionError: division by zero

0으로 나눌 때 오류가 아닌 0을 돌려주도록 만들고 싶다면

 

1) FourCal 클래스를 상속하는 SafeFourCal 클래스 만들기

# 메서드 오버라이딩
class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second

▶ 나누는 값이 0인 경우 숫자 0을 돌려주도록 수정

 

# 메서드 오버라이딩
class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second

# 기능 시연
a = SafeFourCal(4, 0)
b = SafeFourCal(8, 2)
print('나누기1:', a.div())
print('나누기2:', b.div())

 

SafeFourCal 클래스를 사용하면 FourCal 클래스와는 달리 ZeroDivisionError가 발생하지 않고 의도한 대로 0을 돌려주는 것을 확인할 수 있다.


클래스 변수

 

클래스 변수는 클래스 안에 함수를 선언하는 것과 마찬가지로 클래스 안에 변수를 선언하여 생성한다.

또한, 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있어 다른 객체들에 영향받지 않고 독립적으로 그 값을 유지하는 객체변수와는 차이가 있다.

# 클래스 변수
class Family:
    lastname = "김"

print(Family.lastname)

클래스 변수는 위와 같이 클래스 이름. 클래스 변수로 사용할 수 있고,

아래와 같이 Family 클래스로 만든 객체를 통해서도 사용할 수 있다.

# 클래스 변수
class Family:
    lastname = "김"

a = Family()
b = Family()

print(a.lastname)
print(b.lastname)

만약 Family 클래스의 lastname을 다른 문자열로 바꾸게 되면 클래스로 만든 객체의 값도 모두 변경된다.

# 클래스 변수
class Family:
    lastname = "박"

a = Family()
b = Family()

print(a.lastname)
print(b.lastname)


다음 내용

 


[참고]

점프 투 파이썬, 이지스퍼블리싱, 박응용

728x90
반응형