반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 파이썬 프로그래밍의 초보에서 벗어나기 위한 첫번째 단계로, 클래스(class)에 대해 알아보겠습니다.

(이 글은 TCP 스쿨의 파이썬 강의를 참고하여 공부한 후 정리한 글입니다.)

 

이 글은 지난 글과 이어지는 글이므로, 지난 글을 읽고 읽으시면 이해에 도움이 됩니다.

 

https://coding-kindergarten.tistory.com/56

 

[파이썬 중급 문법] 클래스(class) 총정리 1편_객체,속성,메소드,인스턴스

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도

coding-kindergarten.tistory.com

 

 


 

1. 초기화 메소드 ( __init__ )

 

지난 시간 class에 대해서 설명하며 예로 들었던 코드를 다시 보겠습니다. 사실 쉬운 이해를 위해서 아래와 같이 코딩했지만 당연히 실제로는 계좌번호나 계좌잔액에 정해진 값을 넣어 두진 않겠죠? 클래스를 1회용으로 만들지는 않을테니까요!

 

class ATM:                    # 클래스 선언

    계좌번호 = "123456789"      # 속성 선언
    계좌잔액 = "30000"


    def withdraw_all(self):   # 메소드 선언

        print(self.계좌번호 + "에서" + self.계좌잔액 + "을 인출하겠습니다.")
        

Coding_ATM = ATM()          # 인스턴스 생성

print(Coding_ATM.계좌번호)    # 인스턴스의 속성 가져오기
Coding_ATM.withdraw_all()   # 인스턴스의 메소드 호출

 

그래서 우리는 계좌번호와 계좌잔액을 입력받는 메소드를 가장 처음에 만들어줍니다. 이것도 코드로 보시죠.

이렇게 하면 인스턴스를 생성하고 setInfo 메소드를 이용해서 입력값을 받아서 모든 고객용으로 사용가능할 것입니다.

 

class ATM:                   

    def setInfo(self, 계좌번호, 계좌잔액):
    	
        self.계좌번호 = 계좌번호
        self.계좌잔액 = 계좌잔액

    def withdraw_all(self):

        print(self.계좌번호 + "에서" + self.계좌잔액 + "을 인출하겠습니다.")



Coding_ATM = ATM()   # 인스턴스 생성

Coding_ATM.setInfo('123456789', '30000')
Coding_ATM.withdraw_all()

 

하지만 이런 방식은 비효율적입니다. 만약 setInfo 메소드를 가장 먼저 호출해주지 않으면, withdraw_all 메소드에서 사용해야할 인수가 입력되지 않았으므로 오류가 발생하기 때문이죠. 거기다가 코드도 길어지는 단점이 있죠.

 

그래서 지금 배울 초기화 메소드(initialize method)를 사용해줍니다. 앞으로 클래스를 만들 땐 꼭 초기화 메소드를 사용한다고 생각하시면 되겠습니다. 파이썬에서 초기화 메소드의 이름은 __init__으로 고정되어 있습니다.

 

class ATM:                   

    def __init__(self, 계좌번호, 계좌잔액):
    	
        self.계좌번호 = 계좌번호
        self.계좌잔액 = 계좌잔액

    def withdraw_all(self):

        print(self.계좌번호 + "에서" + self.계좌잔액 + "을 인출하겠습니다.")



Coding_ATM = ATM('123456789', '30000')   # 인스턴스 생성 시, 인수를 입력해주어야함

Coding_ATM.withdraw_all()

 

 

2. 클래스 변수 / 인스턴스 변수

 

변수가 선언된 위치에 따라 변수의 유효 범위가 달라지며, 이에 따라 다음과 같이 구분할 수 있습니다.

 

1) 클래스 변수(class variable)

   : 해당 클래스에서 생성된 모든 인스턴스가 값을 공유하는 변수

 

2) 인스턴스 변수(instance variable)

   : __init__() 메소드 내에서 선언된 변수로 인스턴스가 생성될 때마다 새로운 값이 할당되는 변수

 

class ATM:                      # 클래스 선언

    계좌번호 = "123456789"        # 이 방식이 클래스 변수
    계좌잔액 = "30000"
    
    
    def __init__(self, 계좌번호, 계좌잔액):
    	
        self.계좌번호 = 계좌번호    # 이 방식이 인스턴스 변수
        self.계좌잔액 = 계좌잔액    

 

예를 들어, 게임회사의 프로그래머가 게임 캐릭터를 만들 때 계속 사용할 클래스를 만드는 상황을 가정해봅시다.

게임 캐릭터가 공통적으로 가지는 특성은 클래스 변수로 설정해주고, 캐릭터마다 개성을 부여해줄 부분은 인스턴스 변수로 설정해주는 것을 생각해 볼 수 있겠습니다.

 

 

3. 상속

 

여기서의 상속(inheritance)은 여러분들이 아는 그 상속이 맞습니다. 부모가 자식한테 재산을 물려주는 것 말입니다.

여기서 다른 것은 사람이 아니라 클래스인 점이죠. 이 상속의 개념을 이용하면 이미 존재하는 클래스의 속성과 메소드를 모두 그대로 사용할 수 있습니다. 거기다가 기능을 추가할 수도 있답니다.

 

용어를 잠깐 설명드리면, 이미 존재하던 클래스를 부모 클래스(parent class) 또는 기초 클래스(base class)라고 부르며,

상속을 통해 새롭게 생성되는 클래스를 자식 클래스(child class) 또는 파생 클래스(derived class)라고 부릅니다.

 

상속의 사용 예를 들어보겠습니다. 서로 개과와 고양이과로 생김새는 다르지만 새끼를 낳는 ‘포유류’라는 공통적인 특징을 갖는 것입니다.

만약 게임 안에서 개와 고양이를 만들 때, 포유류 클래스를 만들어서 다리는 4개, 새끼를 나음, 눈 2개 등의 특징을 부여하고, 그 클래스를 상속받아서 각각의 개 클래스, 고양이 클래스를 세부적으로 만들어주는 것이죠.

 

클래스 상속은 아래와 같이 간단하게 가능합니다. 이렇게 상속을 통해 만들어진 자식 클래스를 이용해 만든 인스턴스는, 부모 클래스 안의 속성과 매소드를 모두 활용 가능합니다. 상속 그리 어렵지 않죠?

 

class 자식클래스명(부모클래스명):

 

4. 메소드 오버라이딩

 

위에서 배운 상속이 어떤 도면을 복사 붙여넣기 해서 내용을 추가한 것이라면, 메소드 오버라이딩은 상속한 후에 기존 내용을 수정한 것입니다. 즉, 상속한 다음에 메소드를 같은 이름으로 재정의 해주는 것입니다.

 

# 부모 클래스 (일반 새)
class Bird:

    def __init__(self):
        self.flying = True  

    def birdsong(self):
        print("짹짹")    


# 자식 클래스 1 (참새)  --> 상속
class Sparrow(Bird):


# 자식 클래스 2 (닭) --> 상속 후 메소드 오버라이딩
class Chicken(Bird):

    def birdsong(self):
        print("꼬끼오")   


# 객체화
my_sparrow = Sparrow()
my_chicken = Chicken()


# 그냥 상속과 메소드 오버라이딩의 비교
my_sparrow.birdsong()
my_chicken.birdsong()


<결과>

짹짹
꼬끼오

 

 

자세히 보시면 birdsong 메소드를 실행시켰을 때 차이가 생깁니다.

 

단순히 Bird 클래스를 상속받은 Sparrow 클래스는 birdsong 메소드를 실행시켰을 때 "짹짹"을 출력하고,

 

Bird 클래스의 속성을 상속받은 후 birdsong 메소드를 재정의(메소드 오버라이딩) 해준 Chicken 클래스는 "꼬끼오"를 출력하죠?

 


혹시 설명이 잘 이해가 가지 않거나 질문사항 있으시면 댓글 달아주세요!

 

감사합니다.

 

 

 

반응형

+ Recent posts