데이터과학 유망주의 매일 글쓰기 — 45일차

배우는 자(Learner Of Life)
8 min readNov 13, 2020

--

클래스, self, __init__

# 클래스, #self, #__init__

나를 컴퓨터 클래스로 표현하면, 이런 식이 아닐까?

오늘 한일:

드디어 이번 한 주의 피날레인 시험이 끝났다! 하지만, 정해진 시간안에 모든 테스팅을 통과하지 못했다. 그래서, 한 20분 가까이 추가시간을 쓰다가, 겨우 내가 무엇을 잘 못했는지 알아내서 고치고 다시 제출해서 모든 테스팅을 통과할 수 있었다. 참, 별거 아닌 실수인데, 그것을 놓쳤다니.. 바로잡아서 다행이지만, 프로그래밍은 정말 주의해서 해야겠다는 생각이 든다.

오늘 시험에 나왔던 개념 중 가장 중요했던 것이 클래스(class)에 대한 개념이었다. “__init__”이라는 방법과 self라는 키워드를 사용하는 것이 필수였다. 다행히도, 어느 정도 이해해서 시험에서 요구하는 프로그램을 짤 수 있었다. 그럼에도 불구하고, 이번 주는 이 개념을 충분히 이해하지 못했다는 생각이들어, 오늘 금요일 블로그의 주제로 선택했다.

파이썬(Python) 클래스(Class)의 구성

클래스란 무엇일까? 클래스는 하나 이상의 공통된 속성(property/attritube)을 가진 것을 말한다. 또한, 이 클래스의 속성은 종류(type)나 성질(quality)에서 서로 구분된다. 즉, 특정한 행위를 하는 각 객체(object)에 대한 청사진이라고 할 수 있다.

객체(Object)

객체란 클래스의 인스턴스(instance) 중 하나이다. 클래스에서 정의하는 기능을 수행할 수 있는 주체를 이야기한다.

Self

self는 클래스의 인스턴스를 이야기한다. 파이썬에서는 self를 사용함으로써, 클래스의 속성과 메소드(method)에 접근할 수 있다.

__init__

파이썬 클래스를 위해 표준화된 초기화 매소드이다. 객체지향(Object-Oriented)의 개념에서 생성자(constructor)역할을 한다. 클래스에서 객체를 생성할 때 자동적으로 불러오는 매소드이며, 클래스의 속성을 초기화할 수 있게 해준다.

__init__을 어떻게 사용해야할까? 창조주가 “나"라는 인간을 만든다고 하자. 가장 먼저 내 몸을 만들어야 할 것이다. 내 몸은 “피부색", “키", “몸무게" 등의 속성을 가질 수 있다. 나는 “걷기", “말하기", “듣기" 등의 기능(매소드)를 수행할 수 있다.


class body(object):
"""
내 몸 사용 설명서
"""
def __init__(self, skin, height, weight):
self.skin = skin #내 피부색
self.height = height # 내 키
self.weight = weight # 내 몸무게

def talk(self): # 말하기 기능
print("말하다")
def listen(self): # 듣기 기능
print("듣다")
def walk(self): # 걷기 기능
print("걷다")

창조주는 나라는 인간을 이용하여 아래와 같은 새로운 인간들의 몸을 만들 수 있다.

Yoo Myeonghae = body("Asian", "180", "80")
Donald Trump = body("White", "170", "90")

이렇게 하면 하나의 body라는 클래스를 이용하여 하나 이상의 인간(객체)을 만들 수 있다. 우리가 인간객체를 만들기 위해 입력한 인자들(arguments)은 __init__ 에 전달되어 객체를 초기화한다.

여기서 self 키워드는 클래스의 인스턴스를 나타내는데, 우리가 입력한 인자와 속성을 묶는 역할을 한다. 아래와 같은 예로 사용될 수 있다. 예를 들어, 한 건물의 가격을 측정한다고 가정하자. 가로 (length = 600m)와 세로(width = 200m)의 직사각형의 넓이에, 평당(1m²) 100(만원)이 든다고 가정하자.

# 직사각형을 계산하기 위한 클래스 생성
class Rectangle:
def __init__(self, length, width, unit_cost=0):
self.length = length
self.width = width
self.unit_cost = unit_cost
def get_perimeter(self):
return 2 * (self.length + self.width)
def get_area(self):
return self.length * self.width
def calculate_cost(self):
area = self.get_area()
return area * self.cost
r = Rectangle(600, 200, 100)print("직사각형의 넓이: {} m^2".format(r.get_area()))
print("건물 가격: {} m^2".format(r.calculate_cost()))

예를 들어 위 get_area()의 메소드를 보면, 객체(클래스의 인스턴스)를 생성할 때 self.length 를 사용하여 “length”라는 속성의 값을 얻었고, 이를 객체에 묶은 것을 알 수 있다. self는 클래스내 객체를 나타낸다. self는 “r = Rectangle(600, 200, 100)”에서 “r”의 역할을 하는 것과 같다.

또다른 예로, “def get_area(self)”의 예를 보면 “self”를 메소드의 파라미터로 사용한 것을 알 수 있다. 이는 매소드를 부를 때, 객체(클래스의 인스턴스)가 첫 번째 인자로써 전달되기 때문이다. 매소드에 인자(변수)들을 입력하더라도, 클래스의 인스턴스가 먼저 불려와야 한다는 것이다. 만약 아무 인자가 입력되지 않았다면, 매소드에는 self만이 전돨될 것이다. 이 것이 바로 클래스내에서 매소드를 부르기 위해 “self”를 사용해야하는 이유이다. 그래서 “r.get_area()”의 경우처럼, 클래스의 정의 밖에서 매소드를 불러오기 위해 객체 즉, 클래스의 인스턴스를 사용한다. 이 경우, “r”이 클래스의 인스턴스이며, 바로 이 “r”이 self로 인해 get_area()매소드의 첫 번째 인자로써 전달된다.

일반적인 클래스 인스턴스의 작동 방식

여기서 객체(클래스의 인스턴스)는 클래스 밖에서 정의된 것이고, self는 클래스 안에서 정의된 것이라는 사실에 유의하자.

앞으로 할일:

다행히도, 오늘의 시험을 통과했지만, 시간이 좀 더 걸렸다는 것이 아쉽기도 했다. 문제를 좀 더 제대로 파악했다면, 좀 더 효율적으로 시간을 써서 쓸떼없는 잔실수는 없었을텐데.. 일단 어찌저찌 한 주 주어진 사명은 완료했으니 마음이 한 결 편해진다.

특히나 이번 주는 객체지향의 개념을 이해하는데 있어 상당한 노력이 필요했다. 나 뿐만 아니라, 대부분의 동료들이 그랬을 것 같다. 일부를 제외하고는, 객체, 클래스, 상속과 포함등의 개념을 이해하는데 상당히 애를 먹었다.

계속 과정이 진행될 때마다 느끼는 것은, 컴퓨터를 깊이 있게 이해하는 것이 쉽지 않다는 것이다. 컴퓨터의 자료 구조, 알고리즘 등은 지난 1세기를 거쳐 엄청나게 발전하고 변화해왔다. 기술이 발전하면서, 특히 4차 산업 혁명이라해서 데이터를 분석 및 처리하고, 인공지능관련 시스템을 개발해야할 필요가 점점 늘어나고 있다. 인류 역사상 가장 새로운 학문이면서도, 가장 필요한 분야다. 컴퓨터를 이해하는 것, 특히 컴퓨터의 언어를 이해하는 것은 21세기의 특권이다. 컴퓨터가 어떻게 일을하고, 어떤 식으로 컴퓨터와 소통해야 하는지 아는 사람들은 고대의 연금술사와 같은 존재들이라고 느껴진다. 그렇게 갚어치가 높은 기술이니, 당연이 배우기 쉽지 않고, 제대로 배운이들이 몸값이 비싸지는 건 당연하게 느껴진다.

나도 이 흐름을 타기 위해 지금 노력 중이다. 지금 과정을 수강하면서 종종 데이터 사이언티스트 관련 공고를 보곤 하는데, 상당히 많은 회사들이 “개발자의 능력을 가진 데이터 사이언티스트”를 찾길 원하는 것 같다. 데이터를 가공하고 처리하여 분석하는 것 뿐만 아니라, 그 데이터를 최적의 성능으로 처리하고 분석할 수 있는 환경도 만들 줄 아는 사람을 원하는 것이다. 그러니까 컴퓨터 공학, 수학, 통계에 모두 능한 사람이 되어야 한다는 것이다. 사실 이 3가지의 분야는 데이터 사이언스를 정의하는 코어 분야이기 때문에, 크게 놀랍지는 않다. 어쨌든 데이터 사이언티스트가 컴퓨터를 가지고, 컴퓨터의 언어로 대부분의 일을 해야하는 숙명을 가졌기 때문에, 피할 수 없는 흐름인지도 모른다.

진부한 말이지만, 몸에 좋은 약은 항상 쓰다. 항상 달고 짠 것만 먹어왔으니, 몸이 그 맛에 적응하지 못했기 때문이다. 쓴 맛에 적응하려면 시간이 좀 걸린다. 하지만, 완전히 고통스러운 맛은 아니다. 어느 정도 나름 단맛이 느껴지는 쓴맛이다. 그렇다는 건, 분명 긍정적인 신호다. 나중에 그 쓴맛은 우리의 노력이 열매가 되었을 때 세상 그 어느 것보다 달 것이기 때문이다. 나무가 열매를 나기위해 짧게는 수년에서 길게는 수십년의 꾸준한 노력을 하는 것처럼, 인간의 삶도 꾸준한 노력으로 결실을 맺을 수 있다는 것을 많은 본보기를 통해서 보아왔다. 언젠가는 컴퓨터의 언어로 컴퓨터와 유창하게 말할 수 있는 컴퓨터 동시통역가이자 번역가가 되고 싶다. 즉, 컴퓨터를 잘 아는 프로그래머, 문제 해결사가 되고 싶다. 그것이 유능한 데이터 사이언티스트가 되는 가장 효율적인 길일 테니까.

훌륭한 컴퓨터 소통가가 되기 위해, 이번 주도 한 발짝 더 움직였다. 다음 주도 꿈을 향해가는 모두가 무사히 한발을 더 내딛을 수 있기를.

참조:

이 글은 MicroPyramid의 Understanding self and __init__ method in python Class 라는 글을 참조하였습니다.

--

--

배우는 자(Learner Of Life)
배우는 자(Learner Of Life)

Written by 배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.

No responses yet