본문 바로가기
방구석코딩/파이썬 기초문법

[파이썬 독학] 클래스(class) 멤버변수 : 클래스 내부 / 외부 사용법

by 석세상 2022. 7. 22.
반응형

지난번 클래스의 개념에 대해서 이해한 부분까지 정리해 보았는데요. 대충 감으로는 이런 거다라는 느낌은 있지만 개념적으로 정리하기에는 아직 좀 어려운 거 같네요. 그래서 예시를 들어 이런 게 클래스다라고 감을 일단 익히면 좋을 듯합니다. 

 

혼자 공부하다 보니 클래스가 너무 내용도 복잡하고 많은 거 같아서 조금씩 잘라서 설명해볼까 합니다. 이번에는 멤버 변수에 대해서 알아보려고 하는데요. 클래스가 틀이라고 생각하면 될 거라고 했었는데 예전에 과일주스를 만드는 예제를 가지고 와서 적용해보도록 하죠. 또 지난번 정리한 용어 외에 추가로 알게 된 용어가 있으면 그것 또한 같이 정리해보도록 해요.

 

멤버 변수란?

멤버 변수란 클래스 내애서 정의되어 있는 변수를 말하며 당연히 클래스 내부에서 사용 가능하며, 또한 클래스 외부에서도 사용 가능합니다. 클래스에서 정의되지 않은 변수를 추가하기 위해 외부에서 변수를 추가하여 사용하는 것도 가능합니다.

 

 

클래스 구성

멤버 변수를 이해하기 위해서는 먼저 클래스의 구성에 대해 알아야 할 텐데요. 아래와 같이 보면 먼저 class 옆에 클래스명을 정의하고 그 안에 def를 통해서 함수를 정의한 것을 볼 수 있어요. 함수 정의는 기존에 함수 만들기에서 보는 동일한 형태라고 생각하시면 될 것 같고요. 클래스는 아래와 같이 여러 함수를 정의하여 사용하는 경우가 많기 때문에 제가 지난번에 함수의 모음이라고 생각해도 될 거라고 얘기드렸죠. 함수 정의가 기억나지 않는다면 아래 링크를 참조해주세요.

[파이썬 독학] 데이터 분석 - 함수 만들기 : 변수 적용 범위 (tistory.com)

 

[파이썬 독학] 데이터 분석 - 함수 만들기 : 변수 적용 범위

파이썬에서 함수를 만들 때 함수 밖에 있는 변수명과 함수 안에 있는 변수명이 동일하다면 어떻게 적용될까? 함수 만들기 - 초기값 설정 오류 test라는 함수명으로 함수를 생성했는데 test(a)로 실

gusugi.tistory.com

 

그리고 함수의 개념에 대해 얘기할 때 __init__, 객체, 인스턴스에 대해서 얘기드렸는데 그중 하나인 __init__은 아래 보는 바와 같이 함수 만들기처럼 만듭니다. 대신 __init__만의 독특한 점이 있는데요.

 

그건 self라는 변수가 기본적으로 포함되어야 하며, 함수 내에서 self.변수명으로 만들어 주게 됩니다. 그럼 이 변수를 클래스명과 함께 객체를 생성할 때 자동으로 호출하여 사용하게 되는 것이죠.

class 클래스명 :
    def __init__(self, 변수명1, 변수명2, ...) :
         self.변수명1 = 변수명1
         self.변수명2 = 변수명2
         ....
        실행할 명령문1

    def 함수명1(변수명3, 변수명4, ...) :
        ....
        ....

 

 

클래스 사용 예시

이해를 위해서 예를 들어서 설명해보죠. 주스를 만드는 것이니 클래스명은 주스라고 입력해주었습니다. 그리고 __init__을 정의하였는데, 괄호 안에 보면 기본으로 들어가는 self, 그다음으로 과일 종류와 과일 수를 변수로 넣었습니다. 그리고 아래와 같이 함수를 정의했습니다. 이러면 아주 간단한 클래스가 하나 생성된 것이죠.

 

아래 객체를 생성하는 것을 보면 딸기주스 1, 딸기주스 2, 바나나 주스 1을 만들어봤는데요. self를 제외한 def에서 정의한 순서대로 쓰는 경우는 변수명을 따로 적어주지 않고 사용 가능하며, 만약 순서를 다르게 입력한 경우는 앞에 변수명을 적어주어야 합니다. 그럼 아래와 같이 3개의 객체가 생성된 결과를 볼 수 있습니다.

클래스 생성 및 실행

 

 

예시를 통한 멤버 변수

위의 예시에서 fruit와 count는 클래스 내부에서 정의되어 있고 사용 가능합니다. 그럼 여기서 멤버 변수는 self.fruit과 self.count를 멤버 변수라 할 수 있습니다. 그럼 이 멤버 변수를 사용하는 방법은 어떨까요?

 

 

클래스 내부에서 멤버 변수 사용법

우리는 클래스 내부에서 멤버 변수를 사용하는 방법을 조금 전에 배웠습니다. 위의 클래스 사용 예시에서 딸기주스와 바나나 주스를 만들면서 활용해 봤죠. '클래스명(변수명 1, 변수명 2,...)과 같이 사용하면 되죠. 또한 변수 순서를 다르게 주는 경우도 위의 예시에서 표현했으니 조건에 맞게 사용하면 됩니다.

 

 

클래스 외부에서 멤버 변수 사용법

클래스 외부에서 멤버 변수를 사용하는 방법은 약간 다릅니다. 이 경우는 생성된 객체명을 이용하여 멤버 변수를 사용하는데요. 아래 예시를 보면 훨씬 이해가 쉬울 거예요. 먼저 위 예시에서 straw1이라는 딸기 주스를 생성했었죠. 이 객체를 가지고 클래스 외부에서는 어떻게 사용되는지 알아봅시다.

 

print문은 이제 다들 아실 테고 그 안에 있는 format에서 사용된 변수를 보면 straw1이라는 객체명과 클래스 안의 변수명 중 fruit만 따로 가져온 것을 볼 수 있죠. 그럼 straw1의 fruit값인 딸기를 가져온 것을 볼 수 있습니다. 이렇게 클래스 외부에서도 멤버 변수를 사용할 수 있습니다.

클래스 외부에서 멤버변수 사용 예시

 

 

외부 변수 추가 방법

클래스에서 정의된 변수 외 추가 변수가 필요한 경우가 있을 텐데요. 그런 경우는 어떻게 변수를 추가할 수 있을까요? 만약에 딸기주스에 시럽을 추가해달라고 하는 사람이 있다고 합시다. 우리는 시럽을 추가하는 경우가 거의 없어서  위의 클래스 정의 시 시럽을 정의하지 않았다고 합니다. 그 객체에만 추가하는 방법을 알아보도록 하죠.

 

객체명. 추가하려는 변수명을 쓰고 = 뒤에 입력하려는 값을 적어줍니다. 이렇게 하면 외부 변수 추가한 거죠. 그럼 우리는 변수가 추가가 되었는지, 되었다면 제대로 되었는지 보고 싶으니, print를 통해서 알아보도록 하죠. 클래스명을 사용해서 출력하는 것이 아니니 위에서 배웠던 클래스 외부에서 쓰는 방법과 마찬가지로 format 부분에 변수명을 입력해 줍니다.

 

그러면 아래 결과와 같이 시럽 여부 옆에 True라고 출력되는 것을 볼 수 있네요.

외부변수 추가 예시

 

 

※ 객체와 인스턴스의 비교

지난번 클래스 용어 정리 시 객체와 인스턴스에 대해서 정의했는데요. 유독 잘못 알려드린 객체는 변수명과 유사하다고 한 부분이 있는데요. 공부를 하다 보니 그 부분이 잘못된 것 같아 다시 정리해 봅니다. 

 

객체와 인스턴스는 결국 동일한 것이지만 표현의 차이라고 보면 될 것 같습니다. 위의 예시에서 생성한 딸기주스, 바나나 주스는 객체라고도 할 수 있고 인스턴스라고도 할 수 있습니다. 하지만 어떤 경우는 객체, 어떤 경우는 인스턴스라고 부릅니다. 둘을 부르는 용어의 차이는 인스턴스의 경우 "어떤 클래스에서 만든 객체야?"라고 말한다면 이럴 때는 인스턴스라고 하는 것이죠.


  • 객체 : 바나나 주스
  • 인스턴스 : juice class에서 생성된 바나나 주스

 

하지만 프로그램을 코딩하다가 결과창에 나오는 메시지를 보면 모두 객체(object)로 인식하는 것 같고 사람이 이해하기 위해 둘을 구분해 둔 것으로 보입니다. 그러니 제 생각에는 인스턴스나 객체나 사실 하나만 정확하게 알고 있다면 특별히 구분하지 않아도 큰 무리는 없을 것으로 보입니다.

 

728x90
반응형

댓글