본문 바로가기

Python/basic

[Python] class와 객체 연습하기

class와 객체에 대해 연습해보았다.

(https://github.com/aruymeek/python-basic/tree/master/classtest)

 

 

클래스를 굳이 사용하지 않아도 프로그램을 충분히 만들 수는 있다. (프로그램 작성을 위해 꼭 필요한 요소는 아니다.)
하지만 프로그램을 작성할 때 클래스를 적재적소에 사용하면 프로그래머가 얻을 수 있는 이익은 상당하다.

- [점프 투 파이썬] 05-1 클래스 <클래스는 왜 필요한가?>

https://wikidocs.net/28#_2

 

 

클래스를 공부하면 객체, 인스턴스, 속성 등의 개념이 같이 따라온다. 이들을 쉽게 이해할 수 있는 방법으로 맥도날드에 비유하고는 한다. 아래처럼 McDonalds라는 클래스가 있다고 하자.

class McDonalds:
    delicious = True
    
    def __init__(self, _burger, _drinks, _side):
    	self.burger = _burger
        self.drinks = _drinks
        self.side = _side
        
BigMacMeal = McDonalds(bigmac, coke, fries)

이때, delicious는 클래스 속성이다. 클래스 속성은 McDonalds 클래스 안에서만 사용되는 변수라고 생각하면 된다. (McDonalds로 만든 객체의 모든 것은 delicious 값이 기본적으로 True를 갖고 있다고 생각하면 될듯...?)

 

__init__은 생성자인데, 인스턴스 속성의 초기값을 설정할 수 있다. 그럼 인스턴스 속성은? burger, drinks, side가 바로 인스턴스 속성이 된다. McDonalds의 인스턴스를 만들 때 부여한 값들이 각각 속성값으로 할당이 된다.

 

BigMacMeal는 객체이다. 즉, McDonalds의 인스턴스라는 뜻과 같다. 빅맥세트는 빅맥 버거와, 콜라, 감자튀김으로 구성되어 있다는 것을 의미한다.

 

 

클래스로 만든 객체에만 적용할 수 있는 함수(메서드)를 정의할 수도 있다. Dog라는 클래스를 만들었다.

class Dog:
    # 클래스 속성
    name = ''
    color = ''
    age = 1

    walk_count = 0

    def __init__(self, _name, _color, _age):
        self.name = _name                   
        self.color = _color                 
        self.age = _age                     

    # 메서드 정의
    def ShowName(self):                    
        print('Name: {0} / Color: {1} / Age: {2}'.format(self.name, self.color, self.age))

    def GetColor(self):
        print(self.color)

    def ReName(self, new_name):
        self.name = new_name

    def GoWalk(self):
        self.walk_count += 1

하나하나 뜯어보면 이런 의미가 있다.

먼저, Dog 클래스는 name, color, age, walk_count 등의 속성을 기본적으로 갖고 있게 되며 그 초기값은 각각 '', '', 1, 0으로 설정하였다. 이후 클래스로 객체를 생성할 때 입력받은 _name, _color, _age의 값에 따라 각 변수에 값이 새롭게 할당된다.

 

Dog 클래스에는 이름, 색, 나이를 출력해주는 ShowName, 색만을 출력해주는 GetColor, 이름을 변경해주는 ReName, 그리고 걸음의 수를 더하는 GoWalk 등의 메서드가 존재한다.

 

 

메서드를 사용할 때에는 객체.메서드명(속성값)의 형태로 사용한다.

dog1 = Dog('coco', 'black', 3)  

dog1.ShowName()                        
#print('Name: {0} / Color: {1} / Age: {2}'.format(dog1.name, dog1.color, dog1.age))

dog1.ReName('cookie')
dog1.ShowName()

dog1.GoWalk()
print(dog1.walk_count)

dog1Dog 클래스로 만든 객체이다. 이름은 'coco', 색은 'black', 나이는 3살이다.

 

dog1.ShowName()dog1의 이름, 색, 나이를 출력한다. 아래에 주석표시를 해둔 코드와 같은 기능을 수행한다. 결과는 Name: coco / Color: black / Age: 3과 같이 출력된다. 추가로, ()안에 아무 값도 들어가지 않았던 이유는, ShowName 메서드를 정의하면서 매개변수를 아무것도 설정하지 않았기 때문이다. 그렇다 하더라도 self는 필수!!

 

dog1.ReName('cookie')dog1의 이름을 'cookie'로 변경하겠다는 뜻이다. 다시 dog1.ShowName()을 실행하면 Name: cookie / Color: black / Age: 3와 같이 이름이 변경된 것을 확인할 수 있다. ReName 메서드는 정의할 때에 new_name이라는 변수의 값을 입력받도록 설정하였으므로, 'cookie'라는 값을 넣어서 사용한 것이다.

 

마지막으로, dog1.GoWalk()dog1의 걸음 수(walk_count)를 1만큼 증가시킨다는 뜻이다. 그다음, print(dog1.walk_count)를 실행하면 1이라는 결과값이 출력된다. (walk_count는 클래스 속성으로, 초기값을 0으로 설정해두었기 때문이다.)