# 클래스, 객체, 인스턴스, 메서드, self

[파이썬 클래스](https://www.youtube.com/watch?v=FRHGtAvU03Q&list=LL&index=1)

클래스 : 제품의 설계도

객체 : 설계도로 만든 제품

한개의 설계도로 여러개의 제품을 만들 수 있다.   
즉, 하나의 클래스로부터 여러개의 객체를 만들어낼 수 있다.

---

### 클래스 용어

<table><tbody><tr><td colspan="1" rowspan="1"><p>클래스</p></td><td colspan="1" rowspan="1"><p>제품의 설계도</p></td></tr><tr><td colspan="1" rowspan="1"><p>객체</p></td><td colspan="1" rowspan="1"><p>설계도로 만든 제품</p></td></tr><tr><td colspan="1" rowspan="1"><p>속성</p></td><td colspan="1" rowspan="1"><p>클래스안의 변수</p></td></tr><tr><td colspan="1" rowspan="1"><p>메서드</p></td><td colspan="1" rowspan="1"><p>클래스안의 함수</p></td></tr><tr><td colspan="1" rowspan="1"><p>생성자</p></td><td colspan="1" rowspan="1"><p>객체를 만들 때 실행되는 함수</p></td></tr><tr><td colspan="1" rowspan="1"><p>인스턴스</p></td><td colspan="1" rowspan="1"><p>메모리에 살아있는 객체</p></td></tr></tbody></table>

---

### 클래스 만들기

메서드이름 뒤의 괄호 안에는 항상 self를 매개변수로 가지고 있는다.

self는 객체 자기자신을 말하는 것으로 메서드들의 첫번째 매개변수는 객체 자기자신이 들어간다.

```plaintext
class 클래스이름:
  def 메서드이름(self):
     명령블록
```

**객체 = 클래스이름() :** 이걸 실행하고 나면 객체가 나오는데 그 객체를 변수에 할당해주는 것이다.

**객체.메서드() :** .은 ~의라고 해석하면 된다. 객체의 메서드를 호출한다.

```plaintext
shark = Monster()  # shark라는 객체를 Monster 클래스로부터 만들었다.
shark.say()  # shark의 say 메서드
```

---

### 속성 추가하기

**init** : 생성자 함수, name : 속성값

[self.name](https://self.name) = name : Moster클래스의 name이 속성이 들어가게 된것이다.

```plaintext
class Monster:
  def __init__(self, name):
     self.name = name  # 객체 자기자신의 name이라는 속성은 init 함수로 부터 받은 name으로 할당하겠다.
  def say(self):
     print(f'나는 {self.name}')  # self.name은 Monster 클래스의 속성
shark = Monster("상어")  # Monster 클래스로 부터 객체를 만들어 내는데, 매개변수로 상어를 넣어주겠다.
shark.say()  # shark의 say 메서드를 호출하겠다. 
```

shark = Monster(”상어”)를 해주면 제일 먼저 호출되는건 생성자 def **init** (self, name):이다.

상어 데이터가 name자리로 들어가고, name은 [self.name](https://self.name) = name의 name으로 간다.

self자리에는 만들고 있는 객체인 shark가 들어간다.

즉, shark 객체의 이름 속성은 상어다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1709003966297/9c1d3fea-7da2-49cd-b5a9-8acee37b775e.png align="center")
