> For the complete documentation index, see [llms.txt](https://nmdkims-organization.gitbook.io/python-hand-book/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nmdkims-organization.gitbook.io/python-hand-book/day2./2..md).

# 2. 기본 객체 지향 프로그래밍(클래스, 객체)

## 객체지향 프로그래밍의 특징&#x20;

### **클래스**

어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것으로 객체를 만들기 위한 메타정보라고 볼 수 있습니다.

### **인스턴스(객체)**

클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터 입니다.

### 객체지향 프로그래밍 이란?

<details>

<summary>💡 <strong>객체 지향 프로그래밍</strong>은 컴퓨터 프로그래밍 패러다임 중 하나로,  <strong>프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고  객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법 입니다.</strong></summary>

4가지특징와 5가지 원칙으로 많이 설명하는데 밑에서는 4가지 특성만 먼저 설명 하였습니다.

</details>

{% hint style="info" %}

### 객체 지향의 4가지 특징

{% endhint %}

### **추상화**

객체 지향 프로그래밍에서는 '추상화' 라는 단어를 여러 군데 붙일 수 있습니다.

여기서 말하는 추상화는 추상 클래스나 추상 클래스가 갖는 추상 메서드를 의미하기보다는 클래스를 설계하는 것 자체를 의미합니다.

즉, **"공통의"** 속성이나 기능을 묶어 이름을 붙이는 것입니다.

### **캡슐화**

객체 지향 프로그래밍에서 기능과 특성의 모음을 **"클래스"**&#xB77C;는 **"캡슐"**&#xC5D0; 분류해서 넣는것 입니다.

캡슐화의 목적 2가지

**1. 코드를 재수정 없이 재활용가능하게 하기 위해서 캡슐화를 사용합니다.**

**2. 접근 제어자를 통한 정보 은닉 하기에도 적합 합니다.**

### **상속**

**상속**은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하는 것을 의미 합니다.

기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것 입니다.

### **다형성**

하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것입니다.

즉 오버라이딩(Overriding), 오버로딩(Overloading)이 가능합니다.

<details>

<summary>📚 오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것 입니다.</summary>

```python
class Animal:
    def make_sound(self):
        print("The animal makes a sound.")

class Dog(Animal):
    def make_sound(self):
        print("The dog barks.")

# create an instance of the Dog class
my_dog = Dog()

# call the make_sound method of the Dog class
my_dog.make_sound()

```

</details>

<details>

<summary>📚 오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것 입니다.</summary>

```python
class Calculator:
    def add(self, a, b, c=0):
        return a + b + c
    
# create an instance of the Calculator class
my_calculator = Calculator()

# call the add method with two arguments
result1 = my_calculator.add(2, 3)
print(result1)  # outputs 5

# call the add method with three arguments
result2 = my_calculator.add(2, 3, 4)
print(result2)  # outputs 9
```

</details>

* 그리고 파이썬에서는 오버로딩을 정식으로 지원하지 않고 구현은 가능하다는 점을 알고 있으면 되겠습니다.

<details>

<summary>오버라이딩 오버로딩 간단 요약</summary>

간단하게 요약하자면 오버라이딩은 밑의 예제 처럼 원래 있던 내용을 상속받아 쓰면서 다른 기능으로 사용할 수 있게 해주는 것이고 오버로딩은 이름은 같은 함수가 매개변수의 갯수에 따라서 다른 동작을 하는 것이라고 생각하면 되겠습니다.

</details>

### 클래스 예시

```python
class Animal:
    def __init__(self, name):
        self.name = name
    def move(self):
        print("move")
    def speak(self):
        pass
 
class Dog (Animal):
    def speak(self):
        print("bark")
 
class Duck (Animal):
    def speak(self):
        print("quack")
```
