나 개발자 진짜 되냐?

5일차 파이썬 프로그래밍의 날개_클래스편2(생성자, 상속) 본문

파이썬을 시작했어요!

5일차 파이썬 프로그래밍의 날개_클래스편2(생성자, 상속)

Snow Rabbit 2022. 12. 17. 01:33

 

좀 길어져서 생성자는 여기에 따로 쓴다.

오구 친구들이 신나게 흔드는 모습을 보니 귀엽다..

 

아까 내용이 길어져서 사라진 

사칙연산 클래스를 가져와보자

 

class Fourule :

    def setdata ( self, fir, sec ) :

        self.first = fir

        self.second = sec   

def add ( self ) :

        result = self.first + self.second       

return result

...

...

a = Fourule()

a.setdata(2,8)

a.add()

 

생성자

클래스 안에는 생성자라는 친구를 써줄 수 있다. 

 

생성자는 __init__라고 쓰며

객체가 생성될 때 자동으로 호출되는 메서드이다. 

 

class Fourule :

    def __init__(self, fir, sec) :

        self.first = fir

        self.second = sec

    def setdata ( self, fir, sec ) :

       self.first = fir

       self.second = sec

    def add ( self ) :

        result = self.first + self.second

        return result

...

..

 

이 친구를 사용하는 이유는

객체에서 초기값을 설정해야 할때,

즉 

a.setdata(2,8)를 사용하지 않기 위해서 이다.

 

__init__ 메서드는 setdata 메서드와 이름만 다르고

다 똑같다. 대신 이름이 __init__이기 때문에

생성자로 인식해서 객체가 생성되는 시점에 자동으로 호출된다. 

 

우리가 생성자를 쓰지 않는다면..

a = Fourule()

a.setdata( 2, 8 )

 

이렇게 써줘야 하지만

 

생성자를 써준다면

a = Fourule( 2, 8 )  

이렇게 줄일 수 있다.

 

클래스 상속

 

복합한 친구가 나왔다.

클래스는 물려줄 수 있는 특징을 가지고 있다.

물려주고! 물려받고!

 

우리 위에 적었던 Fourule를 상속하는

MoreFourule클래스를 만들어보자

 

class MoreFourule(Fourule) :    pass

 

상속하기 위해서는

괄호 안에 상속할 클래스 이름을 넣어준다.

즉 MoreFourule가 Fourule를 물려받아서

Fourule 안에 있는 내용을

사용할 수 있는 것이다!

 

이렇게 상속을 하면

a.MoreFourule( 4, 6 )해주면

a.add()      →      10이 나오게 된다.

 

More에는 a의 b제곱을 계산하는 클래스를 만들어 보자

 

class MoreFourule(Fourule) :

    def jj ( self )

        result = self.first * self.second

        return = result

 

그 후

a.MoreFourule( 2,4 )

a.jj      →      16

 

로 나오게 된다.

 

메서드 오버라이딩

오버라이딩이 익숙하지 않을 텐데... 마찬가지요..

 

약간 덮어쓰기!로 생각하면 좋을 것 같다.

 

예를 들어보자

 

a = Fourule( 4, 0)

a.div()

 

이렇게 적으면 오류가 생긴다.

왜? 숫자 0이라는 것으로 나누는 것이 아예 안되기 때문이다.

 

하지만 부모를 건들지 않으면서

오류가 아니라 뭐 0이나 다른 값으로 내고 싶을 땐 어떻게 해야 할까?

 

class DivFourule(Fourule) :

    def div(self) :

    if self.second == 0 :        # 나누는 값이 0인 경우!

        return = 0

    else :

        return self.first / self.second

 

이렇게 Fourule에 있는 div 메서드를

동일한 이름으로 다시 적어는

덮어쓰기를 메서드 오버 라이딩이라고 한다.

 

이렇게 하면 덮어쓴 메서드가 출력되게 된다.

 

클래스 변수

클래스에도 변수가 있다는 사실!?!? wow!!

 

객체 변수와 또 다르다는데..

여기서 잠깐

객체 변수는 뭐였지?!

 

객체변수는 그 객체에서만 쓸 수 있던 변수였다.

그럼 클래스 변수는 뭘까?!

 

class Name :      lastname = "김"

 

여기서 lastname 이 클래스 변수이다.

말 그대로 클래스 안에 변수를 선언해주었다.

 

이 변수를 밖에서 출력할 땐 어떻게 해야 할까?!

print (Name.lastname)이라고 해주면 김이 출력된다. 

 

name 클래스를 만든 객체를 통해서도 사용 가능하다.

 

a = Name()b = Name()

                                 #여기서 a와 b는 객체! name이라는 클래스를 받는 친구

 

print (a.lastname)      →      김

print (b.lastname)      →      김

 

"최"로 바꾸고 싶다면 어떻게 해야 할까?

 

클래스 밖에서도 가능하다.

 

Name.lastname = "최"                                                      #Name 안에 있는 클래스 변수인 lastname을 바꾸겠다.

 

print (a.lastname)      →      최

print (b.lastname)      →      최

 

여기서 알 수 있듯

클래스 변수이기 때문에 클래스에서 바꿔줘서

모든 객체에 공유된 모습이다.

 

만약에 

Name.lastname = "최"가 아니라

a.lastname = "최"로 바꾸면

 

a = Name() 이여서 같은 뜻 같겠지만

 

여기서는

 

a 객체에 lastname이라는 객체 변수를

새롭게 생성한다는 뜻이기 때문에

 

b에게는 아무런 영향을 끼치지 않는다. 

 

그래서 a는 최가 된다고해도b는 여전히 김이 된다.

 

생각보다 어려운 결말이다...

....헷갈리는걸

..한번 더 읽으며 확실히 이해해야겠다

 

흐흐

끗!