728x90
반응형

* 본 포스팅은 주피터 노트북에서 실행하였다.

 

클래스와 특수 메소드

2차원 벡터를 표현하는 Vector2D라는 클래스를 구현하고 이 클래스를 통해서 특수 메소드의 필요성에 대해 살펴볼 것이다.

class Vector2D:
    def __init__(self,x,y):
        self._x=x
        self._y=y
    def __str__(self):
        return '({},{})'.format(self._x, self._y)
    def add(self, other):
        return Vector2D(self._x + other._x, self._y+other._y)
    

2차원 벡터를 표현하는 Vector2D라는 클래스를 구현하고 이 클래스를 통해서 특수 메소드의 필요성에 대해 살펴보자.

v1 = Vector2D(30,40)
v2 = Vector2D(110,20)
v3 = v1 + v2
print(v3)

 

  • 에러가 나타나는 이유는 클래스 내부에 어떤 방식으로 덧셈을 할지 그 방법을 서술해야 하기 때문이다.
  • add()라는 메소드를 정의하고 두 벡터의 x 성분과 y 성분을 더하고 이 성분값을 초기값으로 가지는 Vector2D를 반환하도록 하자
v3 = v1.add(v2)                 # Vector2D의 add() 메소드 사용
print('v1 + v2 = ',v3)

  • v1.add(v2)는 두 벡터의 합을 출력한다.
  • add() 메소드 대신에 +, - 와 같은 연산자를 사용하면 보다 편리하다.

 

class Vector2D:
    def __init__(self,x,y):
        self._x=x
        self._y=y
    def __str__(self):
        return '({},{})'.format(self._x, self._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 __mul__(self,other):
        return Vector2D(self._x * other._x, self._y*other._y)
v1 = Vector2D(30,40)
v2 = Vector2D(10,20)
v3 = v1.add(v2) #v1+v2도 가능
v4 = v1-v2
print(v3)
print(v4)

 

v1 = Vector2D(30,40)
v2 = Vector2D(10,20)
v5 = v1*v2
print(v5)


class Circle:
    PI=3.1415 #클래스 변수
    def __init__(self, name,radius):
        self._name=name
        self._radius = radius
    def area(self):
        return Circle.PI * self._radius**2
        
c1 = Circle('C1',4)
print('c1의 면적 ',c1.area())

 

c2 = Circle('C2',6)
print('c2의 면적 ',c2.area())

 

dictionary로 key값 보기

c1 = Circle('C1',4)
print('c1의 속성들 ',c1.__dict__)

 

print('c1의 name 변수값 ',c1.__dict__['_name'])

 

print('c1의 radius 변수값 ',c1.__dict__['_radius'])

728x90
반응형
728x90
반응형

 

* 본 포스터는 주피터 노트북에서 실행하였다.

 

클래스 정의

  • 프로그램 상에서 사용되는 속성과 행위를 모아놓은 집합체
  • 객체의 설계도 혹은 템플릿 (형틀 template)

인스턴스 정의

  • 클래스로부터 만들어지는 각각의 개별적인 객체
  • 서로 다른 인스턴스는 서로 다른 속성 값을 가질 수 있음

 

클래스 정의방법

  • class라는 키워드를 써 준 후 class의 이름을 써 준다. 그 후 필요한 속성과 메소드를 파이썬 문법에 맞게 써준다
# 클래스 정의
class Cat:
    def meow(self,i):
        print('야옹 야옹',i)
    def cow(self, t, u):
        print(t+u)
  • 클래스 내부에서 정의되어 클래스나 클래스 인스턴스가 사용하는 함수를 메소드method 혹은 멤버함수member function라 한다.
  • meow() 메소드의 매개변수인 self는 자기 자신을 참조하는 변수이며 메소드의 첫 번째 매개 변수로 반드시 들어가야 한다.
nabi = Cat() #객체 생성
nabi.meow(3)
nabi.cow(3,5)

 

클래스에서 생성자 정의

# 클래스 정의
class Cat:
    #생성자 정의
    def __init__(self,name,color): #생성자
        self.name=name #self가 들어가면 멤버변수
        self.color=color
    #메서드 (멤버함수)
    def meow(self):
        print('내이름은 {}, 색깔은 {} 이야~'.format(self.name, self.color))
nabi = Cat('나비','검정색')
nero = Cat('네로','흰색')
mimi = Cat('미미','갈색')
nabi.meow()
nero.meow()
mimi.meow()

 

Cat 객체의 문자열 표현 방식 / __str__ 메소드 적용하기

# 클래스 정의
class Cat:
    #생성자 정의
    def __init__(self,name,color): #생성자
        self.name=name #self가 들어가면 멤버변수
        self.color=color
    #Cat 객체의 문자열 표현 방식
    def __str__(self): #toString과 동일
        return 'Cat(name=' +self.name+' 색상= '+self.color+')'
nabi = Cat('나비','검정색')
mimi = Cat('미미','갈색')
print(nabi)
print(mimi)

 

 

캡슐화 encapsulation

  • 메소드와 변수를 외부에서 함부로 조작하는 것을 제한
  • 데이터를 보호
  • 우연히 값이 변경되는 것을 방지
# 클래스 정의
class Cat:
    #생성자 정의
    def __init__(self,name,age): #생성자
        self.name=name #self가 들어가면 멤버변수
        self.age=age
    #Cat 객체의 문자열 표현 방식
    def __str__(self): #toString과 동일
        return 'Cat(name=' +self.name+' age= '+str(self.age)+')'
nabi = Cat('나비',3)
print(nabi)
nabi.age=4
nabi.age=-5
print(nabi)

멤버변수 값이 바뀐걸 확인할 수 있다. -> 데이터 보호(은닉/캡슐화)가 안됨

 

# 클래스 정의
class Cat:
    #생성자 정의
    def __init__(self,name,age): #생성자
        self._name=name #self가 들어가면 멤버변수
        self._age=age
    #Cat 객체의 문자열 표현 방식
    def __str__(self): #toString과 동일
        return 'Cat(name=' +self._name+' age= '+str(self._age)+')'
    def set_age(self, age):
        if age>0:
            self._age = age
    def get_age(self):
        return self._age
nabi = Cat('나비',3)
print(nabi)
#_ 접근 가능하지만 _로 시작하는 변수는 바로 접근하지 말자는 약속  데이터는 바로 접근 x
nabi.set_age(4)
nabi.set_age(-5)
print(nabi)

 

nabi.set_age(-5)는 적용이 되지 않음을 확인할수 있다. 함수를 이렇게 저장했기 때문이다!

Cat 클래스

 

_로 시작하는 변수는 바로 접근하지 말자는 약속이 있다. getter, setter를 이용해서 하자~! 

728x90
반응형

+ Recent posts