Class

sihwan_e·2020년 5월 17일
0

Python Dic

목록 보기
12/13

서론

일반적으로 클래스라고 생각하면 게임의 직업을 도적, 궁수, 전사 등으로 나뉜것을 생각할수도 있고, 일상 생활에서는 자동차, 나무들도 클래스로 생각할수 있다.
같은 개념으로 프로그래밍에서도 컴퓨터안에서 우리가 쓰려는 객체들을 통해서 클래스를 만들어서 표현할수가 있다.

객체와 클래스

방금 말한 도적, 궁수, 전사, 자동차, 나무처럼 특정한 개념이나 모양으로 존재하는 것을 객체(object)라고 부른다. 그리고 프로그래밍으로 우린 그 객체를 만들수가 있고 그때 사용하는 것이 클래스이다.

메서드(method)

그럼 도적을 클래스로 나타내려면 무엇이 필요할까. 여기서 속성과 기능으로 나뉘게 될것같다고 생각되지 않는가. 도적의 속성이라면 체력, 마나, 행운 등이 될수있고 기능은 훔치기, 투명화, 급습 정도가 되지 않을까.
여기서 우린 기능을 나타내는 훔치기, 투명화, 급습등을 메서드(method)라고 부른다.
속성은 어떤 직업도 다 가질수 있는 것이지만, 메서드(기능)은 도적만이 가질수 있는 특징이다.

이런식으로 객체들을 나눠서 직업들을 분류하고 조합하여 프로그래밍의 문제를 해결할수 있다면 유지와 보수에도 효율적일것이다. 이러한 프로그래밍 방법을 객체지향(object oriented)프로그래밍이라고 한다.

클래스 만들기

 class (Class Name):
	def method():
    	코드

속성만들기 (attribute)

클래스에 속성을 만들어 보자.
속성을 만들 때는 init메서드 안에서 self. 속성에 값을 할당한다.

class ClassName:
	def __init__(self):
    	self.속성 = 값
        
class Person:
	def __init__(self):
    	self.hello = 'hi'
        
    def greeting(self):
    	print(self.hello)

james = Person()
james.greeting() 
>> hi

Person클래스의 init 메서드에서 self.hello에 'hi'를 넣었다.
init메서드는 james = Person()처럼 클래스에 ()를 붙여서 인스턴스를 만들떄 호출되는 특별한 메서드이다. 즉, init(initialize)라는 이름 그대로 인스턴스(객체)를 초기화 한다.

self의 의미 (init과 self는 파트너!)

self는 인스턴스 자기자신을 의미한다. 인스턴스가 생성될 떄 self.hello = 'Hi'
처럼 자기 자신에 속성을 추가했다.

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

init 메소드가 호출이 되었다.

가만보면 self는 실체화가 되지 않고 나머지 현대, 제네시스 ,500만 실체화가 됬다는 점을 볼수있다.
class에서 self는 어떠한 실체를 가르키는 단어이다. 그렇다면 class에서 self는 class의 실체인 instance를 가르키게 된다.
그렇다. self는 class의 실체(instance)인 객체(object)를 가르킨다.
그러므로 Car class에서 self는 hyundai나 bmw를 가르키는 것이다.
그리고 클래스를 실체화 할때 파이썬이 해당 객체(self)를 자동으로 init함수에 전달한다.

정리.
1.
init 메소드는 클래스가 실체화 될때 자동으로 호출이 된다.
2.
init 메소드의 self 파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.
3.
init 메소드의 self 파라미터는 항상 정의되어야 있어야 하며 맨 처음 파라미터로 정의 되어야 한다 (그래야 파이썬이 알아서 넘겨줄 수 있으므로)

class Car:
   def __init__(self, maker, model, horse_power):
       self.maker       = maker
       self.model       = model
       self.horse_power = horse_power

근데 왜 Parameter로 넘겨진 maker, model, 그리고 horse_power 값을 동일한 이름으로 self 에 저장 하는 것을 볼 수 있는데,
객체에 maker, model, 그리고 horse_power를 저장하는걸 알 수 있습니다. 근데 왜 저장하는 걸까.
저장하는 이유는 나중에 다시 사용하기 위해서다
더 자세히 이야기하면 다른 메소드에서 사용하기 위해서이다.

Class Method

클래스에서 init말고도 다른 메소드를 원하는 대로 추가할 수 있다.
Method와 attribute의 차이는 명사와 동사의 차이라고 생각하면 된다.
속성은 해당 객체의 이름 등의 정해진 성질인 반면, 메소드는 move, eat등 객체가 행할수 있는 어떠한 동작같은 느낌이라고 생각 할수가 있다.

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

    def honk(self):
        return "빠라바라빠라밤"

honk메소드에도 self가 들어가잇는데, 모든 메소드에는 self 파라미터가 첫번째 파라미터로 들어가야한다.

사용은 다음처럼한다

hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
> "빠라바라빠라밤"

객체에서 메소드를 사용할떄는 dot을 사용하여 객체를 호출하도록 한다.

dot notation
<객체>.<메소드>

다음과 같이도 사용할수 있다.

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

    def honk(self):
        return f"{**self.maker**} 빠라바라빠라밤"
hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
> "현대 빠라바라빠라밤"

클래스의 이점

클래스를 사용하면 코드의 구조를 더 효과적으로 구현할 수 있기 때문에, 능숙해진다면 아주 효율적으로 코드를 관리 할수 있게 될것이다.

profile
Sometimes you gotta run before you can walk.

0개의 댓글