Gidhub BE Developer

클래스, 클래스 선언

2018-02-04
goodGid

클래스

삼각형을 프로그램으로 표현한다고 가정해보자.

삼각형을 만들기 위한 클래스를 정의한다.

작업이 진행됨에 따라 추가적으로 사각형, 원 등의 도형이 필요해졌다.

각 도형마다 클래스를 작성해 보니 공통적으로 사용되는 데이터와 함수가 클래스마다 중복된 것을 확인했다.

이를 최소화하기 위해 각 도형 클래스에서 공통된 부분을 추출해 기본 클래스로 작성하는 작업을 추상화(Abstraction)라고 한다.

추상화 결과로 작성된 클래스를 ‘부모(상위) 클래스’라고 하며, 이를 받아서 각 특성을 추가한 클래스를 ‘자식(하위) 클래스’라고 한다.

부모 클래스로부터 공통된 요소를 물려받는 관계를 상속 관계라고 한다.

부모 클래스가 2개 이상인 경우를 다중 상속이라고 한다.


반면 Rotate()함수와 같은 경우는 사용자 입장에서는 각 도형이 입력된 각도에 맞도록 회전시키는 것으로 보이지만

개발자 입장에서는 도형의 중앙점으로부터 삼각형은 3개의 점을, 사각형은 4개의 점을 이동시켜야만 한다.

즉 같은 부모 클래스를 통해 상속받은 동일한 멤버 함수 호출에 대해 각 클래스가 다른 작업을 수행해야만 하는 것이다.

동일한 인터페이스에 대해 구체적인 인스턴스마다 다른 동작을 수행하는 특징을 다형성(Polymorphism)이라 한다.


클래스 선언

멤버 변수와 멤버 메서드를 가지고 있는 클래스를 정의

>>> class Person:
...     Name = "Ki yong"
...     def Print(self):
...             print("My name is {0}" .format(self.Name))

>>> p1 = Person()
>>> p1.Print()
My name is Ki yong
  • 클래스를 정의하면 클래스 객체가 생성되고 독립적인 이름공간이 만들어진다.

  • 이렇게 생성된 공간에 멤버 변수와 메서드가 존재하게 되는 것이다.

  • 정의된 클래스를 사용하려면 인스턴스 객체를 만들어야한다.

  • 파이썬에서는 기본적으로 클래스, 인스턴스의 모든 멤버 변수와 메서드 접근 권한은 Public이다.
    Why? 파이썬의 설계 철학은 개발자에게 많은 제약을 가하지 않는 것이기에 기본적인 접근 권한은 public으로 했으며,
    정보 은닉을 위해 특별한 방법을 제공한다.


기본적으로 클래스의 메서드는 클래스 객체의 이름공간에 선언된다.

이러한 이유로 인스턴스 객체가 클래스의 메서드를 호출하면 자기 이름공간에 대한 정보를 호출하는 메서드에게 전달해야 한다.

메서드를 호출할 때 암묵적으로 첫 인자로 인스턴스 객체를 넘기는 호출 방식을 바운드(Bound Method) 호출이라 한다.

이 때는 메서드를 정의할 때 첫 인자가 인스턴스 객체임을 선언하나, 호출할 때는 자동으로 반영되기에 명시적으로 입력하지 않는다.

반면 메서드 호출 시 명시적으로 첫 인자로 인스턴스 객체를 전달하는 호출 방식을 언바운드 메서드(Unbound Method) 호출이라 한다.

이 때는 클래스 객체를 통해 메서드를 호출하며, 첫 인자로 인스턴스 객체를 입력해야 한다.

>>> p1.Print()          # 바운드 메서드 호출
My name is Ki yong

>>> Person.Print(p1)    # 언바운드 메서드 호출
My name is Ki yong

Comments

Content