블로그 이미지
김고노

calendar

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

Notice

2018. 4. 19. 17:45 파이썬 복습

'박씨네 집' 클래스 만들기



박씨네 집 이라는 클래스를 만든다고 생각을 해보고


무엇을 할 지 임의대로 설정을 해보자.


일단... 뭐 간단하게


박씨 가족 사람의 이름을 설정하고


박씨 가족중 한 사람이 여행가는 곳을 설정해보자.




그다음 대충 출력되고 싶은 것들을 설정을 해본다고 하자.



클래스 이름은 HousePark 로 만들고 인스턴스는 bum 으로 하자.


bum = HousePark()



bum.lastname 을 출력하면 '박씨네 집' 이라는 클래스에 걸맞게 '박'이라는 성을 출력하게하자


print(bum.lastname)



이름을 설정하면 bum.fullname이 성을 포함한 값을 가지도록 하자.


bum.setname("기범")

print(bum.fullname)

박기범



여행 가고 싶은 장소를 입력하면 출력해주는 travel 함수도 만들어보자



bum.travel("부산")

박기범, 부산여행을 가다!



일단 이런식으로 출력되는 것을 만든다고 치고 이제 처음부터 클래스를 만들어보자.





class HousePark:

    pass



일단 껍질을 만들어 보았다.



pass 를 지우고 박씨네 집이니 성을 설정해보자


class HousePark:

    lastname = "박"




성을 설정했으니 이제 이름을 설정해보자


이름을 설정하면서 성이랑 연결하는 완전한 이름(fullname)을 만들어보자



class HousePark:

    lastname = "박"

    def setname(self, firstname):

        self.fullname = self.lastname + firstname




여기서 self.lastname 이 아니고 lastname 으로 하면 


lastname 이 정의되지 않았다고 오류가 나옴!! 




이제 메서드를 사용해보자


bum = HousePark()

bum.setname("기범")



print(bum.fullname)

박기범




이제 생각해둔 마지막 설정인 여행을 가는 설정을 추가해보자.




class HousePark:

    lastname = "박"

    def setname(self, firstname):

        self.fullname = self.lastname + firstname

    def travel(self, where):

        print("%s , %s 여행을 간다!" %(self.fullname,  where))




그리고 클래스를 사용해보자


bum = HousePark()

bum.setname("기범")

bum.travel("부산")

박기범, 부산 여행을 간다!






초깃값 설정하기



HousePark 라는 클래스를 이용해 인스턴스를 만들어 보았고,


이 인스턴스에 setname 함수를 이용해 사람 이름을 설정해 주는 방식을 사용함.



근데 이렇게 사용하면 어떻게 될까?


bum = HousePark()

bum.travel("부산")


이러면 오류가 발생할 것임.


왜냐하면 travel 함수가 self.fullname 이라는 변수를 필요로 하는데


setname 함수에서 설정을 안해주었기 때문에 당연히 오류가남.



클래스를 설계할 때 이렇게 오류가 발생할 수 있는 상황을 차단해야 좋은 클래스임.



그래서 이런 오류를 방지하기 위해 bum 이라는 객체를 만드는순간 


setname 메서드가 동작하게 된다면 편리할 것임. 그래서 나오게 된게


__init__ 이라는 메서드.



이제 HousePark 클래스를 바꾸어보자



class HousePark:

    lastname = "박"

    def __init__(self, firstname):

        self.fullname = self.lastname + firstname

    def travel(self, where):

        print("%s , %s 여행을 간다!" %(self.fullname,  where))




setname 메서드 이름이 __init__ 으로 바뀌기만 함.



그다음 클래스를 사용하려고 하면


bum = HousePark()


TypeError:__init__() takes exactly 2 arguments (1 given)


오류가 뜨는데 해석하면 입력값을 1개만 넣었다는 것이다.


받은 입력값은 입력 인수 self 를 통해받는 bum 하나..



입력값을 넣어주자


bum = HousePark("기범")


그 후


bum.travel("태국")

박기범, 태국 여행을 간다!




__init__ 은 그냥 초기 값을 설정한다고 생각하면 된다(=초기화)


그리고 항상 실행되기 때문에 초깃값이 필요없는 것도 있지만 필요하면 넣어주어야함





클래스의 상속



상속은 말그대로 물려받는 것


박씨네 집이라는 HousePark 클래스를 만들었는데


김씨네 집이라는 것도 만들어보고 싶다는 생각이 듬.


상속의 개념을 이용하면 간단함.


class HouseLee(HousePark)

    lastname = "이"



성을 '이'로 고쳤을 뿐 그외에는 아무것도 추가안함.


이렇게 되면 lastname 는 이 이고 클래스명은 HouseLee 인


HousePark 의 복제품이 나타남.





상속의 개념을 이용하면 강씨네 집, 김씨네 집, 정씨네 집, 구씨네 집 등등


쉽게 만들 수 있음.




메서드 오버라이딩



상속의 개념중 한 가지 더 알아야 할 것.




travel 메서드를 바꿔서 HousePark 과 다르게 일수를 추가하고 싶다면




class HouseLee(HousePark):

    lastname = "이"

    def travel(self, where, day ):

        print("%s , %s 여행을 %d일 간다!" %(self.fullname,  where, day))



동일한 이름의 travel 함수를 HouseLee 클래스내에 다시 구현하면 됨.


이렇게 메서드 이름을 동일하게 다시 구현하는 것이 바로 메서드 오버라이딩.






연산자 오버로딩



연산자 오버로딩이란 연산자(+, -, *, / ,,,) 를 객체끼리 사용할 수 있게 하는 기법


연산자 오버로딩을 사용하면 다음과 같은 것이 가능


bum = HousePark("기범")

young = HouseLee("선영")

bum + young

박기범, 이선영 결혼했네



이제 다시 클래스를 만들어보자.



class HousePark:

    lastname = "박"

    def __init__(self, firstname):

        self.fullname = self.lastname + firstname

    def travel(self, where):

        print("%s , %s 여행을 간다!" %(self.fullname,  where))

    def love(self, other):

        print("%s, %s 둘은 사랑에 빠져버렸다" %(self.fullname, other.fullname))

    def __add__(self, other):   ← 연산자 오버로딩 사용

        print("%s, %s 둘은 결혼을 했다" %(self.fullname, other.fullname))



class HouseLee(HousePark):

    lastname = "이"

    def travel(self, where, day ):

        print("%s , %s 여행을 %d일 간다!" %(self.fullname,  where, day))





bum = HousePark("기범")

young = HouseLee("선영")

bum.love(young)

bum + young



위의 프로그램을 실행하면 결과는 이렇게


박기범, 이선영 둘은 사랑에 빠져버렸다

박기범, 이선영 둘은 결혼을 했다



여기서 bum.love(young)을 보면 love 메서드를 호출하는데


입력 인수로 2개의 객체를 받음.


self 에는 bum 이 들어가고 other 에는 young 이 들어감.


그래서 '박기범, 이선영 둘은 사랑에 빠져버렸다' 라는 문장이 출력




그다음 


bum + young 을 보면


+ 더하기기호를 이용해 객체끼리 더하려고 함.


이렇게 + 연산자를 객체에 사용하게 되면 HousePark 클래스의 __add__ 라는 함수가 호출



그래서 '박기범, 이선영 둘은 결혼을 했다'  출력

'파이썬 복습' 카테고리의 다른 글

4/19 클래스 (3/4)  (0) 2018.04.19
4/13 클래스 (2/4)  (0) 2018.04.13
4/13 클래스 (1/4)  (0) 2018.04.13
4/3 연습문제  (0) 2018.04.03
4/2 파일 읽고 쓰기  (0) 2018.04.02
posted by 김고노