[PythonBasic] 클래스 (Object Oriented Programming)

Alex of the year 2020 & 2021·2020년 7월 1일
0

Python

목록 보기
10/18
post-thumbnail

클래스

제일 먼저 떠오르는 뜻은 학급.. 학급의 특징: 비슷비슷한 놈들이 모여있다.
대충 파이썬에서도 비슷한 의미로 사용되는 것 같다.
클래스를 이루는 객체들은 같은 속성을 가지고 있다.
다만 현실세계에서는 객체(..)들이 먼저 각자의 부모에 의해 알아서 생성된 후, 나름 성장한 후 클래스로 모이지만
파이썬에서는 이 객체들을 만들 때, 클래스를 이용한다는 점이 다를 수 있겠군.

정리하면 파이썬에서는

해당 객체가 가져야 할 속성들을 적어 넣은(정의해 둔) 클래스를 가지고 객체를 만들어 낸다

클래스 개념의 아주 좋은 예로 이 아래 사진을 참고할 수 있다. (송영이는 희극인 송은이님임을 미리 밝혀둔다.)

말하자면
이영자, 송은이, 양세형, 유병재는 모두 코미디언이라는 같은 개념으로서만 존재하는 특징(클래스)을 공유하는 객체이지만, 그렇다고하여 이 넷이 모두 같은 인스턴스를 가리키는 것은 아니다(이 넷이 다 같은 사람은 아니다).

차에 유난히 관심이 있다면 이 예가 더 좋다.

이런 클래스를 정의하는 기본 식은 아래와 같다.

class 클래스이름: 
	def 메서드(self):
        	코드

그리고 방금 전에 본 차 예제를 들어 만일 자동차 클래스를 만드는 식을 작성한다고 하면,

class Car:
    pass

를 기본 틀로 시작해서

hyundai = Car()
bmw = Car()

위처럼 함수를 실제로 호출하여 클래스를 실체화(instantiate)하는 과정을 마치면, 이제 객체가 탄생한 것이다.
근데 여기까지만하면 다소 아쉬운 객체가 된다. 즉, 해당 객체들을 특징 지을 수 있는 속성적인 무언가가 없다. 그래서 아래처럼 세밀하게 정의한다.

자동차가 가질 수 있는 속성들(마력, 연비, 브랜드 등)을 넣어서 식을 짜면

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

이처럼 만들 수 있다.
확실히 ~에서 ~라는 이름으로 ~마력으로 만든 차구나, 라는 것을 알 수 있다.
(이 식에서 주어진 인자의 개수가 4개였다는 것과, self 인자가 있었다는 것을 유념하고 넘어가자)

그리고 여기서 주의~!
Class안의 def가 있다면 기존의 def처럼 함수(function)라고 부르지 말고
메소드(method) 라고 부르는 것으로~!

(위코드 레플릿에 있는 사진이라 나도 첨부한건데 여러모로 숙연하다)

근데 __init__ 저건 갑자기 대체 뭐지?

우선 앞뒤로 언더바가 두 개씩 위치한 메소드를 "특별 메소드(Special methods)"라고 부르고,
그 중 __init__ 는 클래스가 실체화될 때 사용되는 함수이다.
근데 이게 좀 알쏭달쏭한 점이 있으니 아래를 보자

만약에 이런 코드가 있다고 칠 때,

hyundai = Car("현대", "제네시스", 500)

위 코드를 그림으로 도식화하면 아래와 같다

그리고 이때는 코드에서 __init__의 흔적은 찾을 수 없지만 이미 __init__ 메소드가 호출되어 클래스가 실체화된 것으로 본다. 이해는 안되는데 우선 그렇게 알고 넘어가겠다.

그런데 여기서 또 눈여겨야 하는 점이 있다.
아까 위에서는 Car 클래스를 정의하며 파라미터를 self를 포함하여 4개로 만들었는데 지금은 maker, model, horse_power만을 즉 파라미터 세 개만으로 객체를 정의하고 있다. 이를 이해하기 위해서는 self 파라미터가 무엇인지에 대한 이해가 필요한데,

self 파라미터는
class 의 실체(instance)인 객체를 의미한다.
그리고 이 self 파라미터는, 인스턴스가 호출될 때 파이썬이 알아서 인자 값으로 넘겨주기 떄문에 호출 시 또다시 명기할 필요가 없다.

그림으로 표현하면 아래와 같다.

그럼에도 불구하고 이해가 어려우니 다시 한 번
잘 정리된 글을 복붙하며 읽어보는 것이 좋겠다.

  1. __init__ 메소드는 클래스가 실체화 될때 자동으로 호출이 된다.
  2. __init__ 메소드의 self 파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.
  3. __init__ 메소드의 self 파라미터는 항상 정의되어야 있어야 하며 맨 처음 파라미터로 정의 되어야 한다 (그래야 파이썬이 알아서 넘겨줄 수 있으므로)
  4. 이건 내 생각인데, 약간 객체 초기화의 느낌이 난다.

그리고는 다시 한 번 코드를 분석

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power
        # Parameter로 넘겨진 maker, model, 그리고 horse_power 값을 
        # 동일한 이름으로 self 에 저장
        # --> self가 객체라는 것을 감안할 때 이후 타 메소드에서의 재사용을 위해서임
	
    	# 아래 메소드 하나 추가하면
   def honk(self):
      return "빠라바라빠라밤"
      # 역시 이번에도 honk 메소드 제 1의 인자는 self.

만일 저 honk 메소드를 사용한다면 이런식으로 쓴다

hyundai = Car("현대", "제네시스", 500) 
# Car클래스를 이용하여 hyundai라는 인스턴스를 먼저 만들고
hyundai.honk()
# 그 현차 마력 500짜리 제네시스의 honk하는 기능을 호출해본다
> "빠라바라빠라밤"
# 그러면 "빠라바라바라밤"이라는 값이 리턴된다

여기서 주의~!
어떤 객체의 메소드 값을 호출할 때는
객체.메소드()로 쓴다 (dot notation)



심화

이 때는,
Car class 자체에 대한 선언은 달라질게 없고, honk 메소드만 살짝 바꿔주면 된다.

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

    def honk(self):
        return f"{self.maker} 빠라바라빠라밤"
        # 앗 f가 나타났다..! (여기서 우선은
        # f가 프린트가 아니라 리턴과도 어울리는 놈이라는 것을 알았고)
        # 이렇게 쓰면, 내가 선언한 브랜드를 먼저 보여준 후 
        # 빠라바라바라밤을 출력하라는 뜻이된다

해당 클래스와 메소드의 구현은 다음과 같이 할 수 있겠다

hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
> "현대 빠라바라빠라밤"

자 이제 문제 풀러 가볼까;;;;;;

profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글