Suyeon9911 / TIL

매일 오전에 적는 미라클 TIL 🥣
11 stars 0 forks source link

[Python] 파이썬에서의 객체지향 ? #66

Closed Suyeon9911 closed 2 years ago

Suyeon9911 commented 2 years ago

파이썬에서의 객체지향이란 무엇일까..?

프로그램이 어떤 작업을 수행하기 위해서는 (1)데이터와 (2)데이터를 조작하는 행위, 두 가지 요소가 필요하다. 일반적으로 데이터는 변수에 넣어서 사용하고 데이터를 조작하는 일은 함수로 구성해서 쉽게 실행할 수 있도록 만들어 놓는다.

객체(object, instance) 멤버(member), 속성(attribute) 메서드(method)

객체(object, instance)는 서로 연관된 데이터와 그 데이터를 조작하기 위한 함수를 하나의 집합에 모아놓은 것을 말한다. 이 때 집합의 원소가 되는 변수나 함수는 멤버(member) 또는 속성(attribute)이라고 한다. 특히 객체의 속성인 함수는 메서드(method)라고 부른다.

예를 들어 사각형의 면적을 구하는 프로그램을 만든다고 하자. 필요한 변수와 함수는 다음과 같다. 가로 길이와 세로 길이라는 두 개의 데이터를 넣을 변수 두 길이를 곱해서 면적을 구하는 함수 객체지향을 사용하지 않고 파이썬으로 구현하면 다음과 같다.

h = 10
v = 20

def area(h, v):
    return h * v

a = area(h, v)
print(a)

위 프로그램에서 사각형의 가로 길이를 나타내는 변수 h, 사각형의 세로 길이를 나타내는 변수 v, 그리고 이 사각형의 면적을 계산하는 함수 area는 제각기 떨어져 있다. 하지만 객체지향 프로그래밍에서는 이 세가지를 하나의 객체(object)로 묶을 수 있다.

다음은 이 프로그램을 객체지향 방식으로 다시 구현한 것이다.

class Rectangle(object):

    def __init__(self, h, v):
        self.h = h
        self.v = v

    def area(self):
        return self.h * self.v

하나의 클래스로 구현 !

실제로 길이 변수들을 저장하고 면적을 계산하는 코드는 다음과 같다.

r = Rectangle(10, 20)
a = r.area()
print(a)

위 프로그램에서 r이 바로 객체이다. 어떻게 위와 같은 코드를 만드는지에 대해서는 곧 자세히 설명할 것이다.

객체 r은 사각형의 가로 길이와 세로 길이를 나타내는 변수 h와 v 그리고 면적을 계산하는 함수 area()가 합쳐져서 만들어진 것이다. 객체 r에 포함된 이 변수들과 함수, 즉 속성을 꺼내려면 객체 이름 뒤에 점(.)을 붙인 다음 속성 이름을 입력하면 된다. 다음과 같이 입력해 보면 알 수 있다.

r.h r.v r.area()

클래스(class)

객체지향 프로그래밍에서 객체를 만들려면 객체를 바로 만들지 못하고 항상 클래스(class)라는 것을 만든 후에 그 클래스를 이용하여 객체를 만들어야 한다.

위 예제에서 Rectangle은 클래스이고 r은 Rectangle 클래스로 만들어진 객체이다. 객체와 클래스의 관계는 “붕어빵”과 “붕어빵을 굽는 틀”에 비유할 수 있다. 즉, 정해진 속성, 여기에서는 가로 길이 h와 세로 길이 v라는 속성을 가지도록 사각형 클래스를 한 번 만들어 놓으면 이 속성을 가지는 실제 사각형은 얼마든지 많이 만들 수 있다.

예를 들어 위에서 만들어 놓은 Rectangle 클래스로 다음과 같이 5개의 사각형을 만들 수도 있다.

a = Rectangle(1, 1)   # 가로 1, 세로 1인 사각형
b = Rectangle(2, 1)   # 가로 2, 세로 1인 사각형
c = Rectangle(4, 2)   # 가로 4, 세로 2인 사각형
d = Rectangle(6, 3)   # 가로 6, 세로 3인 사각형
e = Rectangle(8, 5)   # 가로 8, 세로 5인 사각형

이 사각형들의 면적은 다음과 같이 계산한다.

print(a.area())
print(b.area())
print(c.area())
print(d.area())
print(e.area())

1 2 8 18 40

생성자

파이썬에서 클래스를 정의하는 문법은 다음과 같다.

class 클래스이름(object):

    def __init__(self, 속성값1, 속성값2, 속성값3):
        self.속성이름1 = 속성값1
        self.속성이름2 = 속성값2
        self.속성이름3 = 속성값3

생성자(constructor)

__init__

이때 속성값 인수는 필요하지 않다면 없어도 된다. 여기에서 class 블럭 안에 정의된 init란 함수는 생성자(constructor)라고 하며 클래스 정의에서 가장 중요한 함수이다.

객체를 생성할 때는 클래스이름을 함수처럼 호출해야 하는데, 이때 실제로는 init로 정의된 생성자 함수가 호출된다. 생성자 함수 내부에서는 생성자를 호출할 때 넣은 입력 변수, 즉 인자의 값을 속성값으로 저장한다.

상속, 오버라이딩, 오버로딩에 관한 내용까지 보고싶을때 아래 자료를 참고

https://datascienceschool.net/01%20python/02.12%20%ED%8C%8C%EC%9D%B4%EC%8D%AC%20%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.html