본문 바로가기

Python/객체지향 프로그래밍

(Python) 객체지향 프로그래밍 - 인스턴스가 함수의 인자값인 경우

728x90

 

인스턴스를 함수의 인자값으로 이용할 수 있다는 것을 일깨우기 위해 다음과 같은 코드를 게시해 둔다.

 

 
 
class Rectangle:
    # side = 0 는 매개변수 값이 주어지지 않을 때 0 으로 초기화된다.
    def __init__(self, side = 0):
        self.side = side

    # 정사각형의 면적을 출력하는 메서드
    def getArea(self):
        return self.side ** 2

# 함수 정의
# 클래스 Rectangle의 인스턴스와 횟수를 매개변수로 받아서 횟수 값이 0이
# 될 때까지 변의 길이와 면적을 출력해주는 함수
def printArea(rectangle, cnt):
    print("인스턴스의 주소: ", id(rectangle))
    print("cnt의 주소: ", id(cnt))
    print("변의 길이", "\t", "면적")
 
    while cnt >=1:
        print("\t",rectangle.side, "\t", rectangle.getArea())
        rectangle.side += 1
        cnt -= 1

rectangle = Rectangle()
print("인스턴스의 주소: ", id(rectangle))
cnt = 5
print("cnt의 주소: ", id(cnt))
 
printArea(rectangle,cnt)
 
 

 

 

다음은 특수 메서드이다. 이는 + , - , *, == 등을 인스턴스를 인자로 하는 경우에도 이용 가능하게끔 하는 기능이다!!

다만, 클래스 내부에서 해당 기호에 따른 각각의 메서드를 정의해 두어야 한다!

 
# 특수 메서드를 이용하는 경우 1

class Circle:
    def __init__(self, radius):
        self.radius = radius
    def __eq__(self, other):
        return self.radius == other.radius

c1 = Circle(10)
c2 = Circle(10)

print(c1==c2)  # True
 

 

 
# 특수 메서드를 이용하는 경우 2

class Vector2D:
    def __init__(self,x,y):
        self.x = x
        self.y = y
   
    def __add__(self, other):
        return Vector2D(self.x + other.x, self.y + other.y)

    def __sub__(self, other):
        return Vector2D(self.x - other.x, self.y - other.y)

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __str__(self):
        return "(%g, %g)" % (self.x, self.y)

u = Vector2D(0,1)
v = Vector2D(1,0)
w = Vector2D(1,1)
a = u + v
 
print(a)  # (1,1)
 

 

이번에 알게된 사실인데, '__str__' 메서드는 print() 함수를 대신한다!!

 

 

 

 

# 중요 사항 #

 

 

1.

 

인스턴스는 함수에 매개변수로 전달될 때 참조(주소)값이 전달 되어서 내용 변경이 가능하다. 이는 리스트와 같다.

 

하지만, 상수, string은 그렇지 않고 값만 복사되기 때문에, 해당 값을 변경하게 되면 아예 새로운 주소값을 만들게 된다.

 

즉, 변경 불가하다.

 

 

인스턴스, 리스트 (mutalbe)

String, 상수 (immutable)

 

 

 

2.

 

특수 메서드 __eq__(), __add__(), __sub__() 등은 인스턴스 간의 산술연산과 비교연산을 가능케 하는 메서드이다.

 

따라서 인스턴스간의 ==, -, + 등의 연산자는 특수메서드를 호출하여 작동한다.

 

단, 우리는 클래스 내부에 미리 특수메서드를 작성해둬야 한다!

 

 

 

 

 

 

 

 

출처 : 따즈아 파이썬 기초부터 실무까지 제대로 배우기 part. 14 객체재향 프로그래밍-2