본문 바로가기
프로그래밍 언어/파이썬

9.클래스

by Jinger 2023. 3. 7.

서론

   공부하면서 ".함수()"나 ".변수"와 같은 형식을 봐왔을 거이다. 오늘은 이러한 형식이 나온 클래스에 대해 알아볼 예정이다.


객체지향(Object Oriented Programming, OOP)

    파이썬도 객체 지향 프로그래밍 언어이다. 우선, 객체란 어떤 것의 특징들을 모아둔 것이다. 예를 들어, 자동차의 색깔, 차종, 전진, 후진 등을 묶어 객체라 한다. 객체 지향이란 여러 독립된 객체들과 서로 상호작용하며 프로그래밍하는 것을 말한다. 이는 사람의 사고와 비슷하다고 한다. 그렇기에 복잡한 문제를 더욱 단순하게 만들기 쉽고, 코드 중복을 최소화하여 재사용에 용이하다.(항상 객체 지향이 최선은 아니다.) 이 이전 개념으로 절차지행 프로그래밍(Functional Programming, FP)이라 하여 절차를 중시하는 프로그래밍이 있다.

객체지향 개념(특징)

  1. 추상화(Abstraction): 만들고자 하는 것들을 공통적인 것을 바탕으로 하나로 묶는 것
  2. 캡슐화(Encapsulation): 맡은 역할의 수행을 위해 최소한의 외부 접근만을 허용하는 것
  3. 다형성(Polymorphism): 자료형에 구애받지 않고 프로그래밍하는 것
  4. 상속(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)란 어떠한 데이터와 기능이 묶인 객체를 표현하기 위한 문법(기능)이다. "class 클래스이름"(클래스의 첫글자는 보편적으로 대문자로 쓴다.) 이때 클래스와 객체와의 관계를 자동차라는 개념을, A사 자동차를 객체로 이해하면 쉽게 이해할 것이라 믿는다.
class Car:
   pass

생성자

   생성자(constructor)란 클래스를 호출할 때 자동으로 어떤 함수를 실행하거나 값을 호출하고 싶다면 클래스 이름과 같은 함수를 말한다. "def __init__(self)"(init양옆에 언더바가 2개)로 사용되거나, 인수가 필요하면 "def __init__(self, 매개변수)"로 사용되기도 한다.
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__"을 구현해주어야 한다.


속성

    속성(attribute)이란 클래스가 가진 변수를 말한다.(파이썬에는 엑세스 한정자가 없지만, 개념은 존재한다. 일반적으로 속성과 메서드는 public이다. 즉, 외부에서 접근이 가능하다.) 속성은 보통 생성자에서 정의한다.
class Car:
   def __init__(self, speed):
      self.speed = speed              #자기자신의 speed라는 속성에 speed라는 인수가 들어온다.

메서드

   메서드(method)란 클래스가 가지고 있는 함수를 말한다. 함수 선언과 동일한 방법으로 사용된다. 차이점으로 항상 첫번째 인자로 "self"를 넣어야 한다.
class Car:
   def Move(self):
      print("움직였다.")

비공개 속성

    비공개 속성이란 클래스 바깥에서는 접근할 수 없고 클래스 안에서만 사용할  수 있는 속성을 말한다.(private과 비슷하다.)  비공개 속성을 선언하기 위해서는 "__속성"과 같이 "__"가 앞에만 붙여 사용한다. 비공개 속성은 중요한 속성은 쉽게 바꾸지 못하게 하기 위해 사용되며, 자식 클래스도 사용하지 못 한다.
class Car:
   def __init__(self, speed):
      self.__speed = speed              #클래스 내부 어디서든 비공개 속성을 쓰기 위해 "__"을 써야한다.
    파이썬에도 "protected"를 의미하는 기능이 있다. 속성 앞에 "_"(언더바)가 한개만 붙이면 된다. 하지만, 이는 실제로 제약되지는 않고 경고 표시로 사용되기만 한다.

상속

    상속이란 부모클래스(물려주는 클래스, 상위 클래스)의 내용(속성과 메소드)을 자식클래스(물려받는 클래스, 하위 클래스)가 가지게 되는 기능이다. "class 클래스이름(상속받을 클래스이름):"로 상속할 수 있으며, 자식클래스에서는 부모클래스의 속성과 메서드를 기재하지 않아도 포함된다.
class Vehcle:
	pass
class Car(Vehcle):
	pass
    이해하기 쉽게 예를 들어 준다면, 포유류를 상위 클래스라 할때 그에 속하는 동물들이 하위클래스라 생각하면 된다. 포유류가 새끼를 낳고 젓이 나오는 등의 특징은 하위의 모든 동물들이 보유하고 있다.

    상속을 사용하는 이유는 기존 클래스를 변경하지 않고 기능을 추가 및 변경할 수 있기 때문이다. 예를 들어, RPG게임에서 캐릭터는 공통적으로  공격력, 이동속도, 이동하기 등이 존재하지만, 캐릭터 각각의 고유 능력은 다를 수 있다. 그럴 때 캐릭터마다 캐릭터 공통적인 속성 및 메서드를 사용하기 위해 상속을 한다.

다중상속

    상속은 항상 한 개만이 아니라 여러 개를 상속받을 경우가 있다. 그때 "class 클래스이름(부모클래스이름 1, 부모클래스이름 2):"로 선언해야 사용할 수 있다.

class Vehcle:
	pass
class Kia:
    pass
class Car(Vehcle, Kia):
	pass

오버라이딩

    오버라이딩이란 부모에 정의되어 있는 함수를 자식에서 다시 정의하는 것을 재정의한 것을 말한다. 사용방법은 간단하다. 부모 클래스와 똑같은 메서드를 자식 클래스에 맞게 정의하면 된다.

    자신의 부모클래스에게 접근하기 위해서는 "super()"를 통해 접근할 수 있다.


접근자와 설정자

    설정자(setter)란 멤버 변수에 접근하는 함수이다. 접근자(getter)란 멤버 변수의 값을 가져오는 함수이다. 외부에서 직접 접근하지 못 할 때 사용하는 함수들이다. 보통 함수 앞에 "set"을 붙이면 설정자, "get"을 붙이면 접근자이다.

주섬주섬

    객체 지향 프로그래밍 언어의 목적 그대로 객체와 서로 상호 작용하며 프로그램을 돌아가기에 모든 객체 지향 프로그래밍 언어에서 클래스를 다루는 것은 중요하다. 또한, 언어마다 지원하는 기능이 다양하기에 이곳에서 언어 이해의 차이가 많이 난다.

    클래스까지 배운다면 좀 더 복잡한 작품들을 만들 수 있다.

참고

 

7.함수

서론 프로그래밍 언어에서 함수와 수학의 함수는 비슷하다. 하나의 목적을 위해 수행되는 코드를 묶어 사용하는 것이다. 이해하기 쉽게 튀김기에 어느 음식을 넣든 행동하는 것은 똑같지만, 나

jinger.tistory.com

 

Magic or Dunder Methods in Python

Python - Magic or Dunder Methods Magic methods in Python are the special methods that start and end with the double underscores. They are also called dunder methods. Magic methods are not meant to be invoked directly by you, but the invocation happens inte

www.tutorialsteacher.com

 

A Guide to Python's Magic Methods « rafekettler.com

__exit__(self, exc, val, trace) with self as x: with statement context managers

rszalski.github.io

 

반응형

'프로그래밍 언어 > 파이썬' 카테고리의 다른 글

11.파일  (0) 2023.03.13
10.예외처리  (0) 2023.03.13
8.모듈  (0) 2023.03.02
7.함수  (0) 2023.02.27
6.시퀀스  (0) 2023.02.21

댓글