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

호기심 파이썬 : 객체를 알아보자

by 인성패밀리 2022. 11. 29.
반응형

객체 지향 프로그래밍에 대해서 알아보도록 하겠습니다

 

객체 지향 프로그래밍은 객체를 사용해서 프로그래밍을 짜는 것입니다.

 

그렇다면 객체에 대해서 알아야합니다.

 

객체는 속성행동을 가지고 있는 것들을 의미하는데요. 예를 들어 게임 캐릭터들끼리 싸우는 코드를 만들 때 다음과 같이 만들 수 있습니다.

# 캐릭터1 설정
user1_name = "코딩"
user1_hp = 100
user1_mp = 200
user1_skill1 = 10
user1_skill2 = 20

# 캐릭터2 설정
user2_name = "발록"
user2_hp = 500
user2_mp = 250
user2_skill1 = 5
user2_skill2 = 7

# 서로 한 대씩 주고 받기
user2_hp -= user1_skill1
user1_hp -= user2_skill2

그런데 실제 게임 속에서는 많은 수의 유저들이 있습니다. 그리고 각 유저들은 공통적인 속성과 행동들이 보입니다. 조금 더 자세하게는 각 캐릭터의 직업에 따라서 공통적인 특징들이 있는 것이죠

 

이런 공통적인 특징들을 하나로 묶는데 속성 값은 다를 수 있겠죠? 어떤 유저는 레벨이 10 어떤 유저는 레벨이 250 이렇게 말이에요

 

그래서 class 라는 녀석을 이용하면 여러 유저들(객체)를 생성하면 하나의 코드로 다른 여러 명을 생성할 수 있습니다.

 

이런 식으로 코드를 작성하는 방법의 장점은 유지 보수가 쉽고, 코드가 간결해지며, 쉬워지는 특성이 있습니다. 물론 클래스 문법을 안다는 상황에서 말하는 내용입니다. 모르면 유지 보수가 쉬운지 코드가 쉬운지 알 수가 없죠

 

그래서 클래스 문법에 대해서 쉽게 이야기 해보려고 합니다.

 

지금 위의 코드 상에는 두 명의 유저가 있는데요 각 유저들은 이름/체력/마나/어떤 스킬 이라는 공통적인 특징들이 있습니다. 아까 유저들이 객체라고 이야기 했고, 객체는 속성과 행동을 가지고 있다고 했고, 객체는 class로 만든다고 이야기 했습니다. 클래스를 만들기 위해서는 유저에서 속성과 행동을 분리해야합니다.

 

속성 : 이름 / 체력 / 마나

행동 : 스킬 사용하기

 

속성과 행동을 분리해야 클래스를 정의할 수 있고 그에 따라 객체(유저)도 올바르게 생성할 수 있습니다.

 

때문에 간단한 클래스를 만들어보고 이야기해보겠습니다.

class Player:
    def __init__(self, name, hp, mp):
        """플레이어 생성 후 초기값 셋팅하는 함수"""
        self.name = name
        self.hp = hp
        self.mp = mp

    def skill1(self, you):
        """스킬 1 데미지는 10"""
        you.hp -= 10  # 상대방 체력 10 깎았음
        self.mp -= 50  # 마나 50 소모
        print(f"{you.name}의 체력이 10 줄었습니다. 현재 체력{you.hp}")

    def skill2(self, you):
        """스킬 1 데미지는 10"""
        you.hp -= 120  # 상대방 체력 10 깎았음
        self.mp -= 100  # 마나 50 소모
        print(f"{you.name}의 체력이 120 줄었습니다. 현재 체력{you.hp}")


# 캐릭터 생성
p1 = Player("인성패밀리", 2000, 15000)
p2 = Player("적군", 5000, 7000)

# 스킬을 써보자
p1.skill1(p2)
p2.skill2(p1)

-> 클래스를 생성할 때의 간단한 규칙으로 클래스의 이름의 첫 글자는 대문자로 작성하기로 약속이 되어있습니다. 때문에 가장 첫 줄에 Player의 첫 글자가 대문자입니다.

 

-> 두 번째 줄이 캐릭터를 처음 만들었을 때 캐릭터 초기 생성하는 함수입니다. 클래스에서 정의된 함수를 method라 부릅니다. 언더 바(_)가 붙은 이들은 조금 특별한 기능을 가지고 있는 메소드인데요 우선 __init__은 이름을 부를 때 init 메소드라고 이름을 부릅니다. 이 메소드는 객체가 처음 생성되면 변수들을 초기화 시키는 역할을 합니다.

 

-> init 메소드에서 정의된 변수 더 정확히는 self가 붙은 변수들은 인스턴스 변수라고 부릅니다. 바로 이 인스턴스 변수가 객체의 속성을 나타냅니다.

 

-> self라는 키워드가 자주 등장하는 것을 볼 수 있는데 self의 의미는 자기 자신을 의미합니다.

 

-> 때문에 skill1 메소드에서 you의 hp는 상대방의 hp를 말하고, self.mp는 나의 mp를 의미합니다. you는 매개변수로 받은 것이라 이것은 변수 이름이 바뀌면 바뀝니다.

 

각 문법에 대해서는 조금 더 자세하게 설명이 들어갈 것이며 이번 포스팅은 대략적인 내용들입니다.

 

오늘의 핵심으로 코드를 통해서 클래스에서 쓰이는 용어에 대해서 알아보겠습니다.

class Player:
    def __init__(self, name, hp, mp):  ## 생성자
        """플레이어 생성 후 초기값 셋팅하는 함수"""
        self.name = name  ## 인스턴스 변수
        self.hp = hp  ## 인스턴스 변수
        self.mp = mp  ## 인스턴스 변수

    def skill1(self, you):  ## 메소드
        """스킬 1 데미지는 10"""
        you.hp -= 10  # 상대방 체력 10 깎았음
        self.mp -= 50  # 마나 50 소모
        print(f"{you.name}의 체력이 10 줄었습니다. 현재 체력{you.hp}")

    def skill2(self, you):  ## 메소드
        """스킬 1 데미지는 10"""
        you.hp -= 120  # 상대방 체력 10 깎았음
        self.mp -= 100  # 마나 50 소모
        print(f"{you.name}의 체력이 120 줄었습니다. 현재 체력{you.hp}")


# 캐릭터 생성
p1 = Player("인성패밀리", 2000, 15000)  ## 인스턴스
p2 = Player("적군", 5000, 7000)  ## 인스턴스

# 스킬을 써보자
p1.skill1(p2)
p2.skill2(p1)

## 을 통해서 각 부분이 어떤 용어로 불리는지 표시해두었습니다.

 

각 용어의 간단한 의미입니다.

생성자 : 객체를 만들때 초기값 셋팅

인스턴스 변수 : 객체의 속성

메소드 : 객체의 행동 함수로 만든다

인스턴스 : 클래스를 통해 만든 객체

 

반응형

댓글