서론
공부하면서 ".함수()"나 ".변수"와 같은 형식을 봐왔을 거이다. 오늘은 이러한 형식이 나온 클래스에 대해 알아볼 예정이다.
객체지향(Object Oriented Programming, OOP)
파이썬도 객체 지향 프로그래밍 언어이다. 우선, 객체란 어떤 것의 특징들을 모아둔 것이다. 예를 들어, 자동차의 색깔, 차종, 전진, 후진 등을 묶어 객체라 한다. 객체 지향이란 여러 독립된 객체들과 서로 상호작용하며 프로그래밍하는 것을 말한다. 이는 사람의 사고와 비슷하다고 한다. 그렇기에 복잡한 문제를 더욱 단순하게 만들기 쉽고, 코드 중복을 최소화하여 재사용에 용이하다.(항상 객체 지향이 최선은 아니다.) 이 이전 개념으로 절차지행 프로그래밍(Functional Programming, FP)이라 하여 절차를 중시하는 프로그래밍이 있다.
객체지향 개념(특징)
- 추상화(Abstraction): 만들고자 하는 것들을 공통적인 것을 바탕으로 하나로 묶는 것
- 캡슐화(Encapsulation): 맡은 역할의 수행을 위해 최소한의 외부 접근만을 허용하는 것
- 다형성(Polymorphism): 자료형에 구애받지 않고 프로그래밍하는 것
- 상속(inheritance): 하위 개념이 상위 개념의 속성 및 동작 등을 물려받는 것
객체지향 5원칙
객체 지향 프로그래밍 할 때 아래 다섯 가지(SOLID)를 지키며 코딩해야 한다. 아래 원칙을 지키게 되면 시간이 지나도 변경이 용이하고, 유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 될 것이다.
- 단일 책임의 원칙(SRP, Single Responsibility Principle): 객체는 오직 "하나"의 책임을 가져야 한다.(변경이 필요시 오직 한 클래스만 변경하면 해결이 되도록) 이는 클래스의 목적을 명확히 함으로써 구조가 난잡해지거나 수정 사항이 불필요하게 넓게 퍼지는 것을 예방하고 기능을 명확히 분리할 수 있게 한다.
- 개방 폐쇄 원칙 (Open-Closed Principle, OCP): 확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다.(추상화에 의존) 확장에 대해 열려있다는 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다. 수정에 대해 닫혀 있다는 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다. 즉, 다형성과 확장을 가능케 한다.
- 리스코프 치환 원칙 (Liskov Substitution Principle, LSP): 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다.(상속의 본질, 다형성 원리)
- 인터페이스 분리 원칙 (Interface segregation principle, ISP): 인터페이스를 각각 사용에 맞게 끔 잘게 분리해야 한다는 설계 원칙이다. 인터페이스 단일 책임을 가질 수 있게 인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이 목표이다.(주의해야 할 점으로 한번 인터페이스를 분리하여 구성해 놓고 나중에 무언가 수정사항이 생겨서 또 인터페이스들을 분리하는 행위를 가하지 말아야 한다.)
- 의존 역전 원칙 (Dependency Inversion Principle, DIP): 어떤 클래스를 참조해서 사용해야 하는 상황이 생긴다면, 그 클래스를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)로 참조하라는 원칙이다.
클래스 선언
class Car:
pass
생성자
class Car:
def __init__(self): #self는 자기 자신을 뜻한다.
pass
인스턴스 vs 객체
인스턴스(instance)란 클래스 기반으로 만들어진 객체를 말한다. 사실 인스턴스와 객체는 같은 것을 의미한다. 보통 객체만을 지칭할 때 객체라고 부른다. 반면, 인스턴스는 클래스와 연관을 지어서 말할 때 인스턴스라고 부른다. 예를 들어, Car라는 클래스로 a라는 객체를 만들었을 때, 이 a를 "a"라 부르면 객체, "Car의 a"라 부르면 인스턴스이다.
class Car:
def __init__(self): #self는 자기 자신을 뜻한다.
pass
a = Car() #인스턴스 생성
특수한 매서드(매직 매서드)
매직 메서드 또는 특별 메서드(special method)란 메서드 중에서 "__"로 시작해서 "__"로 끝나는 메서드들을 말한다. 이를 라고 부른다. 매직 메서드는 다양하기에 자세한 내용을 보고 싶으면 아래 참고 내용을 참고 바란다.
파이썬에서 객체에 "."점을 찍으면 해당 객체에 접근할 수 있다. 이것은 매직 메서드 덕분에 가능한 일이다. 변수가 어떤 객체를 바인딩하고 있을 때 "."점을 찍으면 클래스의 "__getattribute__"라는 이름의 매직 메서드를 호출해 준다. 물론, 클래스 만들 때__getattribute__"을 구현해주어야 한다.
속성
class Car:
def __init__(self, speed):
self.speed = speed #자기자신의 speed라는 속성에 speed라는 인수가 들어온다.
메서드
class Car:
def Move(self):
print("움직였다.")
비공개 속성
class Car:
def __init__(self, speed):
self.__speed = speed #클래스 내부 어디서든 비공개 속성을 쓰기 위해 "__"을 써야한다.
상속
class Vehcle:
pass
class Car(Vehcle):
pass
상속을 사용하는 이유는 기존 클래스를 변경하지 않고 기능을 추가 및 변경할 수 있기 때문이다. 예를 들어, RPG게임에서 캐릭터는 공통적으로 공격력, 이동속도, 이동하기 등이 존재하지만, 캐릭터 각각의 고유 능력은 다를 수 있다. 그럴 때 캐릭터마다 캐릭터 공통적인 속성 및 메서드를 사용하기 위해 상속을 한다.
다중상속
상속은 항상 한 개만이 아니라 여러 개를 상속받을 경우가 있다. 그때 "class 클래스이름(부모클래스이름 1, 부모클래스이름 2):"로 선언해야 사용할 수 있다.
class Vehcle:
pass
class Kia:
pass
class Car(Vehcle, Kia):
pass
오버라이딩
오버라이딩이란 부모에 정의되어 있는 함수를 자식에서 다시 정의하는 것을 재정의한 것을 말한다. 사용방법은 간단하다. 부모 클래스와 똑같은 메서드를 자식 클래스에 맞게 정의하면 된다.
자신의 부모클래스에게 접근하기 위해서는 "super()"를 통해 접근할 수 있다.
접근자와 설정자
주섬주섬
객체 지향 프로그래밍 언어의 목적 그대로 객체와 서로 상호 작용하며 프로그램을 돌아가기에 모든 객체 지향 프로그래밍 언어에서 클래스를 다루는 것은 중요하다. 또한, 언어마다 지원하는 기능이 다양하기에 이곳에서 언어 이해의 차이가 많이 난다.
클래스까지 배운다면 좀 더 복잡한 작품들을 만들 수 있다.
참고
댓글