Recent Posts
Recent Comments
Archives
반응형
250x250
«   2024/05   »
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 29 30 31
Today
Yesterday

Total
05-15 00:01
관리 메뉴

Hey Tech

[Python] 클래스(class), 객체(object), 속성(attribute), 함수(method)에 대해 알아보자! 본문

SW 개발/Python

[Python] 클래스(class), 객체(object), 속성(attribute), 함수(method)에 대해 알아보자!

Tony Park 2021. 4. 29. 12:58
728x90
반응형

오늘은 프로그래밍 관점에서 클래스(class), 객체(object), 속성(attribut), 함수(method)에 대해 알아봅니다. 간단하게 이론적인 부분에 대해 살펴본 후 실제 파이썬에서 클래스와 객체를 생성하는 방법부터 객체별 속성을 정의하는 방법에 대해 알아봅니다.

목차

1.  이론적 배경
    1.1.  클래스(Class)
    1.2.  객체(Object)
    1.3.  속성(Attribute)
    1.4.  함수(Method)
2.  파이썬 클래시 예시: 리스트(List)
3.  파이썬에서 클래스 구현
    3.1.  클래스 및 객체 생성
        3.1.1.  클래스 생성
        3.1.2.  객체 생성
    3.2.  생성자 함수(__init__)
    3.3.  속성(Attribute) 정의
        3.3.1.  정적인(static) 속성 정의
        3.3.2.  동적인(dynamic) 속성 정의
        3.3.3.  속성의 기본값(default) 정의

1.  이론적 배경

1.1.  클래스(Class)

클래스는 객체를 정의하기 위한 데이터 타입입니다. 이해를 돕기 위해 '노트북(notebook)'이라는 클래스가 있다고 가정해 보겠습니다(그림 1 참고). 그림 내 아이콘 출처(링크)

 

그림 1.  노트북 클래스 예시

1.2.  객체(Object)

여기서 객체란 삼성의 갤럭시북, 애플의 맥북, LG의 그램과 같이 노트북이라는 클래스에서 실제로 존재하는 데이터를 의미합니다. 즉, 노트북 클래스는 갤럭시북, 맥북, 그램과 같이 노트북이라는 객체의 데이터 타입을 정의하기 위한 도구에 불과합니다.

1.3.  속성(Attribute)

노트북은 제조사, 디스플레이 크기, 가격이 모두 천차만별이죠? 이러한 클래스의 특징들을 속성이라고 합니다.

1.4.  함수(Method)

함수는 클래스의 연산 수행을 의미합니다. 노트북을 통해 복잡한 계산을 처리하거나, 인터넷 검색, 유튜브 등을 이용할 수 있습니다. 이러한 연산 처리 종류를 각각의 함수라고 할 수 있습니다. 그리고 계산기를 켜거나, 브라우저를 켜는 행위를 프로그래밍 관점에서 "함수를 호출한다"라고 부르죠.

2.  파이썬 클래스 예시: 리스트(List)

파이썬에서 클래스 예시를 들어보겠습니다. 데이터 타입 중 하나인 리스트(list) 역시 클래스 중 하나입니다(그림 2 참고). 리스트 클래스의 속성은 리스트 내 원소의 특성으로서 문자열, 숫자형, 튜플형 등을 가질 수 있죠. 예를 들어, 그림 2 의 우측과 같이 실제로 숫자형 데이터, 튜플, 문자형 데이터를 원소로 갖는 객체가 있을 수 있습니다. 리스트 클래스는 함수로서 원소 삽입을 위한 append() 함수, 데이터 추출을 위한 pop() 함수, 원소 정렬을 위한 sort() 함수 등이 있습니다.

 

그림 2.  파이썬 내 리스트 클래스

3.  파이썬에서 클래스 구현

3.1.  클래스 및 객체 생성

3.1.1.  클래스 생성

노트북이라는 클래스를 생성해 보겠습니다. 파이썬에는 노트북이란 클래스가 없기 때문에 아래와 같이 새롭게 클래스를 정의해야 합니다. 기본적으로 생성하는 클래스 이름의 맨 앞글자는 대문자로 입력합니다. 우선 클래스 내부 함수 등의 부수적인 세팅 없이 클래스 선언만 하기 위해 pass 키워드를 입력해 주었습니다. 클래스나 함수는 모두 생성과 함께 내부적으로 초기 세팅이 필요하지만 선언만 하고 넘어가고 싶을 때는 이와 같이 pass 키워드를 사용하면 됩니다.

class Notebook:
    pass

3.1.2.  객체 생성

아래와 같이 갤럭시북, 맥북, lg그램이라는 노트북 객체를 생성해 보겠습니다. 등호(=)를 기준으로 좌측에는 객체명을, 우측에는 클래스 이름과 괄호 묶음을 입력하면 됩니다. 클래스는 객체를 정의하기 위한 데이터 타입이라고 했습니다. 실제로 type()이라는 내장 함수를 통해 앞서 정의한 객체들의 데이터 타입을 확인해 보면 Notebook이라는 데이터 타입을 갖는 것을 확인할 수 있습니다.

galaxyBook = Notebook()
macBook = Notebook()
lgGram = Notebook()

print(type(galaxyBook))
print(type(macBook))
print(type(lgGram))

출력 결과

<class '__main__.Notebook'>
<class '__main__.Notebook'>
<class '__main__.Notebook'>

3.2.  생성자(__init__) 함수

생성자 함수란 객체가 생성되자마자 실행되는 함수입니다. 생성자 함수는 아래와 같이 클래스 생성 시에 함수를 생성할 때와 마찬가지로 def 키워드를 활용하여 선언합니다. 예를 들어, 생성자 함수를 활용해 객체가 생성될 때마다 각 객체의 메모리 주소를 출력하는 구문을 작성해 보겠습니다.

class Notebook:
    def __init__ (self):
        print('New object is generated at ', self)

객체 생성

아래와 같이 객체를 생성하자마자 생성자 함수 내에 있던 프린트 구문이 실행됩니다. 여기서 self 변수를 통해 출력되는 값은 객체가 저장된 메모리 주소입니다. 이를 통해 생성한 2가지 객체가 서로 다른 메모리에 생성되었다는 것을 확인할 수 있습니다.

galaxyBook = Notebook()
macBook = Notebook()

출력 결과

New object is generated at  <__main__.Notebook object at 0x7f1cc31a0340>
New object is generated at  <__main__.Notebook object at 0x7f1cc314a7f0>

3.3.  속성(Attribute) 정의

속성은 정적(static), 동적(dynamic), 기본값 설정이라는 3가지 방식으로 정의할 수 있습니다. 각각 나누어 알아보겠습니다.

3.3.1.  정적인(static) 속성 정의

'정적인(static)'은 사전적 의미로 '고정된', '변동이 없는'입니다. 즉, 객체 생성 시에 따로 초기화할 속성 값을 전달하지 않으면 기존에 정의한 속성 값으로 객체의 속성을 정의한다는 의미입니다. 아래와 같이 노트북 클래스에서 브랜드, 디스플레이 크기, 가격이라는 속성을 '삼성', '15인치', '100만원'이라는 값을 갖도록 정적으로 정의해 보았습니다.

class Notebook:
    def __init__ (self):
        print('New object is generated at ', self)
        self.brand = 'samsung'
        self.display = 15
        self.price = 1000000

각기 다른 3개의 객체를 생성합니다.

notebook1 = Notebook()
notebook2 = Notebook()
notebook3 = Notebook()

아래와 같이 f-string 문법을 활용해 객체별 속성을 출력해 봅니다.

print(f"brand: {notebook1.brand}, display size: {notebook1.display}, price: {notebook1.price}")
print(f"brand: {notebook2.brand}, display size: {notebook2.display}, price: {notebook2.price}")
print(f"brand: {notebook3.brand}, display size: {notebook3.display}, price: {notebook3.price}")

출력 결과

아래와 같이 각기 다른 객체의 노트북을 생성했지만 모두 브랜드, 디스플레이 크기, 가격이 동일한 것을 확인할 수 있습니다. 이는 객체를 생성 시에 속성을 따로 초기화하지 않았기 때문에 클래스의 생성자 함수에 정의된 속성 값으로 초기화되었기 때문입니다.

brand: samsung, display size: 15, price: 1000000
brand: samsung, display size: 15, price: 1000000
brand: samsung, display size: 15, price: 1000000

그렇다면 객체마다 다른 속성 값을 갖도록 정의하기 위해서는 어떻게 해야 할까요? 바로 동적(dynamic)으로 속성을 정의해 주면 됩니다. 아래 섹션에서 이어 설명하겠습니다. 

3.3.2.  속성의 동적인(dynamic) 정의

동적으로 속성을 정의하는 방법에 대해 알아보죠 아래와 같이 생성자 함수에서 객체 생성과 동시에 초기화할 속성을 매개변수(parameter)로 설정합니다

class Notebook:
    def __init__ (self, brand, display, price):
        print('New object is generated at ', self)
        self.brand = brand,
        self.display = display,
        self.price = price

 

이제 객체 생성 시에 정의할 속성 값을 전달인자(argument)로 입력합니다.

galaxyBook = Notebook('samsung', 15, 1800000)
macBook = Notebook('apple', 16, 2900000)
lgGram = Notebook('lg', 17, 2000000)

아래와 같이 객체별로 생성 시에 전달해 주었던 인자로 속성이 초기화된 것을 확인하실 수 있습니다.

print(f"brand: {galaxyBook.brand}, display size: {galaxyBook.display}, price: {galaxyBook.price}")
print(f"brand: {macBook.brand}, display size: {macBook.display}, price: {macBook.price}")
print(f"brand: {lgGram.brand}, display size: {lgGram.display}, price: {lgGram.price}")

출력 결과

brand: samsung, display size: 15, price: 1800000
brand: apple, display size: 16, price: 2900000
brand: lg, display size: 17, price: 2000000

3.3.3.  속성의 기본값(default) 정의

동적인 속성 정의에 있어서 만약 특정 속성에 대한 값을 전달인자로 받지 않은 경우에는 특정 기본값(default)으로 초기화하는 방법이 있습니다. 아래와 같이 생성자 함수의 매개변수 중 하나인 '가격'의 기본값을 1,000,000으로 설정해 보겠습니다.

class Notebook:
    def __init__ (self, brand, display, price = 1000000):
        print('New object is generated at ', self)
        self.brand = brand,
        self.display = display,
        self.price = price

3개의 객체를 생성하는 동시에 속성을 초기화할 값을 전달인자로 설정했습니다. 여기서 3번째 객체인 lgGram의 가격 속성의 전달 인자 값은 따로 입력하지 않았습니다.

galaxyBook = Notebook('samsung', 15, 1800000)
macBook = Notebook('apple', 16, 2900000)
lgGram = Notebook('lg', 17)

객체별 속성 값을 출력해 봅니다.

print(f"brand: {galaxyBook.brand}, display size: {galaxyBook.display}, price: {galaxyBook.price}")
print(f"brand: {macBook.brand}, display size: {macBook.display}, price: {macBook.price}")
print(f"brand: {lgGram.brand}, display size: {lgGram.display}, price: {lgGram.price}")

출력 결과

아래와 같이 가격 속성 값을 전달인자로 넘겨주지 않은 lgGram 객체의 가격은 클래스 생성자 함수 내 가격 속성의 기본값으로 설정한 1,000,000으로 초기화된 것을 확인하실 수 있습니다.

brand: samsung, display size: 15, price: 1800000
brand: apple, display size: 16, price: 2900000
brand: lg, display size: 17, price: 1000000

마치며...

오늘은 클래스, 객체, 속성, 함수에 대한 간략한 이론적인 내용부터 실제로 파이썬에서 클래스와 객체를 생성하는 방법과 객체별 속성을 정의하는 방법에 대해 알아보았습니다. 다음 포스팅에서는 클래스 함수에 대해 자세히 알아보겠습니다.

참고할만한 포스팅

1.  [Python] 클래스(class), 객체(object), 속성(attribute), 함수(method)에 대해 알아보자!
2.  [Python] 메서드(method)와 스태틱/클래스 메서드(static/class method)에 대해 알아보자!
3.  [Python] 클래스 상속, 메서드 오버라이딩(method overriding), 슈퍼(super) 함수에 대해 알아보자!

포스팅 내용에 오류가 있을 경우 댓글 남겨주시면 감사드리겠습니다.

그럼 오늘도 즐거운 하루 보내시길 바랍니다 :)

고맙습니다.

728x90
반응형
Comments