OOP...? 웁...?
Class..? 수업....?
이번 포스팅에서는 조코딩님의 최신 파이썬 코딩 무료 강의의 5-1장 내용인 클래스에 대해서 살펴보도록 하겠습니다. 클래스라는 개념 자체가 제가 처음 코딩을 배울 때 가장 어려웠던 것 중 하나였는데, 막상 강의 내용을 정리하려니 객체 지향부터 포함해서 여러가지 개념이 끼어 있더라구요. 따라서 노마드님의 강의 내용을 비롯해 많은 포스팅의 내용들을 덧붙여 앞 부분에서 OOP에 대한 간단한 개념을 살펴보도록 하겠습니다. 공부하면서 정리한 내용이니, 잘못 된 내용이 있다면 코멘트 남겨주시기 바랍니다. 🫶🏻
파이썬은 객체 지향 프로그래밍(OOP) 언어입니다.
객체(Object)란 어떠한 상태(state)와 행동(behavior)을 가지고 있는 데이터입니다.
- 예를 들면, 고양이는 다리가 4개(state)이고, 야옹하고 우는 행동(behavior)을 하는 객체입니다.
 - 쿠키런 킹덤의 쿠키들 또한 전투력과 방어력을 가지고 있고(state), 각각의 쿠키들이 스킬을 사용(behavior)하는 객체입니다.
 - 이 때, 실제 프로그래밍에서 객체의 상태는 value 또는 attribute로 불리고, 객체의 행동은 method로 불리게 됩니다.
 
객체지향 프로그래밍(Object-Oriented Programming, OOP)이란 객체가 프로그래밍의 중심이 되는 방법으로서,
- 모든 데이터를 객체로서 취급합니다.
 - 객체 지향에서 Class는 객체를 만들어 내기 위한 설계도(Template)와 같은 개념으로, 단순히 데이터만 넣어준다면 원하는 속성과 행동을 가진 객체를 아웃풋으로 얻을 수 있다는 장점이 있습니다.
 - 또한, 설계도를 통해 찍어내는 개념으로 코드 재사용이 편리해지고, 이를 통해 코드의 가독성 또한 향상된다는 장점이 있습니다.
 
OOP는 4가지 특성을 가지고 있습니다.
- Encapsulation(캡슐화)
- 데이터, 그리고 데이터를 활용하는 함수를 캡슐(Class) 안에 두는 것을 의미합니다.
 - 다시 말하면 데이터와 함수를 클래스 안에 넣는 것을 의미합니다.
 - 또한, 캡슐화는 어떻게 클래스 정보에 접근 혹은 수정하는지를 결정하는 권한을 제공합니다.
 
 - Inheritance(상속)
- 상위 개념의 특징(attribute, method)를 하위 개념이 물려받는 것을 의미합니다.
 - 상속하고자 하는 클래스는 부모 클래스, 받고자 하는 클래스는 자식 클래스라고 불리며, 같은 특징이 있는 클래스를 물려 받아 attribute와 method를 재사용할 수 있게 됩니다.
 - 또한, 상속은 클래스들을 작게 쪼개고 분할한 후에 레고처럼 클래스들을 구성함으로써 분할 및 정복을 가능하게 합니다.
 
 - Abstraction(추상화)
- 구현 세부 정보를 숨기는 일반 인터페이스를 지정하는 행위입니다.
 - 추상화를 사용하면 누군가 세부 메소드를 변경하더라도 인터페이스는 그대로 유지되기 때문에 따로 수정할 필요가 없다는 장점이 있습니다.
 
 - Polymorphism(다형성)
- 클래스를 상속 받음으로써 클래스의 핵심은 그대로 있고, 구현 방식의 형태는 달라질 수 있는 것입니다.
 - 다시 말해 부모 클래스에서의 메소드를 오버라이딩 할 수 있는데, 메소드가 어떻게 작동해야하는지는 규칙이 정해져 있다는 특징을 가지고 있습니다.
 
 
Class란,
반복되는 변수와 메서드(함수)를 미리 정해놓은 틀로 만들어 둔 것으로서, 객체를 만들어내는 설계도입니다.
- 이렇게 만들어진 클래스를 사용하기 위해서는 단순히 객체를 찍어내기만 하면되는데, 이렇게 클래스 형태로 찍어낸 객체를 인스턴스(Instance)라고 부릅니다.
 - 참고로, 클래스를 통해 찍어낸 각각의 인스턴스는 독립적입니다.
 - 그리고 Class내에 있는 함수는 Function이 아닌, Method로 불립니다.
 
Class를 작성하는 방법은,
- class를 입력하고,
 - 대문자로 시작하는 클래스 이름을 작성한 뒤,
 - 안에 들어갈 함수 및 변수를 작성해줍니다.
 
# 클래스 작성
class Person: #대문자로 시작
  def __init__(self, age, name): #변수 지정
    self.age = age #객체 변수
    self.name = name #객체 변수
  def sayhi(self): #메소드 지정
    print("나는 %d살 %s인디"%(self.age, self.name))
self와 __init__은 무엇인가요?
self는 자기 자신을 의미합니다.
- 클래스를 사용하기 위해 변수에 할당시키면 인스턴스가 생성되는데, 이 때 self는 인스턴스 자신을 의미하는 역할을 합니다.
 - 따라서 상위 코드를 보면 Person()이 self에 들어갈 것이고, Person()의 인스턴스인 woolim을 통해 각 속성 및 메소드에 접근할 수 있게 됩니다.
 
__init__ 은 생성자입니다.
- 생성자란 객체가 생성될 때 자동으로 호출되는 함수로서 객체를 초기화하거나 초깃값을 설정하는데 사용됩니다.
 - 따라서, __init__메서드에서는 self.속성의 형태로 해당 클래스에서 사용하기 위한 속성을 정의하게 됩니다.
 
클래스 변수와 객체 변수
상위의 클래스 작성 코드를 다시 확인해보시면 클래스 변수라는 주석이 있습니다. 클래스 내부에 있는 변수는 객체 변수와 클래스 변수로 구별됩니다.
클래스 변수(Class Variable)란,
- 클래스에 공통적으로 적용되는 변수로서 클래스 내에 미리 선언해놓은 변수를 의미합니다.
 - 따라서 이 변수는 모든 객체들이 공유하는 변수가 됩니다.
 - 객체 변수는 클래스명.변수명을 통해 접근할 수 있습니다.
 - 만약 모든 객체가 공통으로 가져야 하고, 값이 변경되어도 모든 객체에 적용되어야 하는 값이라면 클래스 변수를 사용하시면 됩니다.
 
객체 변수(Object Variable)란,
- 각각의 인스턴스(객체)마다 정의한 변수로서, class내의 __init__ 메소드를 통해 선언된 변수들입니다.
 - 이는 객체별로 객체 변수를 따로 가지고 있기 때문에 각각의 인스턴스끼리는 공유하지 않는다는 특징을 갖고 있습니다.
 - 객체 변수는 인스턴스명.변수명을 통해 접근할 수 있습니다.
 - 모든 인스턴스가 해당 속성을 가지고 있지만, 각각의 인스턴스에 별도의 값이 보관되어야 할 때 사용하게 됩니다.
 
class Korean: 
  country = "korea" #클래스 변수
  def __init__(self, age, name):
    self.age = age #객체 변수
    self.name = name #객체 변수
  def sayhi(self):
    print("나는 %d살 %s인디"%(self.age, self.name)) # 객체 변수 접근 방법
    print(Korean.country) # 클래스 변수 접근 방법
woolim = Korean(26, "우림")
minbyeong = Korean(31, "민병")
woolim.sayhi() #나는 26살 우림인디
minbyeong.sayhi() #나는 31살 민병인디
print(woolim.country) #korea
print(minbyeong.country) #korea
Class를 활용하는 방법은,
- 할당할 변수 = 클래스명() 를 통해 인스턴스를 생성해주고,
 - 변수.클래스의 함수(함수의 파라미터) 를 통해 해당 클래스의 함수를 사용해주면 됩니다.
 
# 클래스 활용
woolim = Person(26, "우림") #인스턴스 생성
woolim.sayhi() #메소드 사용
Class의 상속이란,
파이썬에서의 상속이란 부모 클래스의 속성과 함수를 물려받는 개념입니다.
클래스를 상속받으려면 class 자식클래스(부모클래스): 형태로, 클래스를 선언할 때 괄호 안에 부모 클래스를 작성해주면 됩니다. 이러한 형태로 원하는 변수 및 메서드를 상속 받거나 추가 및 변경할 수 있습니다.
이 때, 부모클래스와 동일한 이름의 메소드를 자식 클래스에 작성해주면, 기존 부모 클래스의 메서드가 자식 클래스의 메서드로 덮여 씌어지게 되는데, 이를 메서드 오버라이딩(Method Overriding)이라고 합니다.
class Person: #부모 클래스
    def __init__(self, leg):
    	self.leg = leg
    def action(self):
    	print("숨쉬기")
        
class Programmer(Person): #상속
    def action(self): #메서드 오버라이딩
    	print("숨쉬듯 코딩하기")
Class 사용해보기
실제 사용 예시로는 게임 캐릭터를 개발하는 경우가 있습니다. 게임 캐릭터는 전투력(cp), 방어력(hp), 전투방법(attack)이라는 속성을 공통적으로 갖고 있습니다. 따라서 이런 경우에는 우선 클래스 내부 __init__ 메소드에 cp, hp이라는 변수를 선언해주고, 전투방법에 관한 내용은 attack 함수로 작성해줍니다. 그 후, 각 캐릭터마다 다른 내용을 할당해주는 방식으로 클래스를 사용할 수 있습니다. 아래에서 쿠키런 킹덤의 캐릭터들을 예시로 들어보겠습니다.
- 일단 용감한 쿠키가 기본 캐릭터로 cp, hp 속성을 갖고, attack이라는 공격 메소드를 갖고 있습니다.
 - 좌측 바다요정 쿠키 클래스는 용감한 쿠키 클래스를 상속받고 있고, attack 메소드를 물결 공격으로 덮어쓰고, hp 변화량 또한 바꿈으로써 atttack 메소드를 오버라이딩 하였습니다.
 - 우측 퓨어바닐라 쿠키 클래스는 용감한 쿠키 클래스의 내용을 모두 상속받고, powerup이라는 체력회복 메소드를 추가하였습니다.
 

참고
- OOP 관련
- https://www.youtube.com/watch?v=cg1xvFy1JQQ
 - https://www.youtube.com/watch?v=IeLWSKq0xIQ
 - https://wordbe.tistory.com/entry/Class-1-Class-OOP-%EC%B6%94%EC%83%81%ED%99%94
 - https://wikidocs.net/20457
 - https://wordbe.tistory.com/entry/Class-1-Class-OOP-%EC%B6%94%EC%83%81%ED%99%94
 
- Class 관련
'Data Scientist > Python' 카테고리의 다른 글
| 회사 가기 싫은가요? (조코딩 - 예외처리) (0) | 2022.09.14 | 
|---|---|
| 모듈, 패키지, 라이브러리, 프레임워크 그만!!!! (조코딩 - 모듈, 패키지) (0) | 2022.09.14 | 
| 파이썬, 너 쫌 하네? (조코딩 - Python 입출력 & 파일 함수) (0) | 2022.09.08 | 
| 계산기 쓸래? 함수 쓸래? (조코딩 - Python 함수) (0) | 2022.09.07 | 
| 만약에 누가 10번 이상 만나자하면 만날 거야? (조코딩 - Python 제어문) (0) | 2022.09.06 |