본문 바로가기
Base/Python

23. 객체지향 프로그래밍

by 귀멸 2023. 4. 20.

혼공파 78 ~ 79강

 

1. 객체지향 프로그래밍

# 객체 지향 프로그래밍

"어떻게 하면 프로그램을 더 좋게 만들 수 있을 것인가?" 라는 이념 중 하나

 

# 프로그래밍 이념

"더 좋은 프로그램" 으로 향해서 다가가는 접근 방법

 

## 명령형 프로그래밍

명령문을 사용해서 프로그램이 어떠한 동작을 할지 순서대로 나열해서 프로그램을 만들자!

주어 + 동사 + 목적어 (I love you)

동사 + 목적 (love you)  → love(you)

print("문자열")

input("문자열")

 

## 선언형 프로그래밍

<h1>제목</h1> html 같은 것

 

## 절차적 프로그래밍

서브루틴, 프로시저, 함수

 - 같은 코드를 여러 번 작성하지 말고 함수를 만들어서 사용하자!

 - GOTO 구문, JUMP 구문을 사용하지 말고 함수를 사용하자!

 

## 함수형 프로그래밍

함수는 수학적 개념 

순수 함수를 사용해야 한다!

 

## 객체 지향 프로그래밍

 - 더 좋은 프로그램 : 규모가 큰 프로그램

 - 변수와 함수를 묶어서 하나의 묶으로 만들면 더 좋은 프로그램을 만들 수 있을 것이다.

 

# 함수가 너무 많아서 발생한 폐해

 - 무엇이 무엇을 하는 함수 인지 모름

 - 어떤 함수가 존재하는지 찾기도 힘듦

 - 함수를 변경하려는데, 영향 범위를 추적하는 것이 힘듦

 >>> 대규모의 프로그램을 만드는 것이 힘들었다.

 

# 함수를 카테고리로 묶으면 어떨까?

 

## 관심사로 카테고리 구분

Math.PI()

Math.abs()

Math.sin()

Math.cos()

 

## 객체 지향 프로그래밍

I Love (You) 

주어를 다시 살려서 주어(객체)를 기반으로 변수/함수를 모으면 어떨까?

현대의 프로그래밍에서는 이러한 주어(객체)를 클래스로 만든다.

 

파이썬에서는 아래 모두를 사용한다.

### 명령형 프로그래밍

### 절차적 프로그래밍

### 함수형 프로그래밍

### 관심사로 카테고리 구분

→ [파이썬] 모듈

### 객체 지향 프로그래밍

→ [파이썬] 클래스


2. 클래스 등장 이전

# 학생들의 성적을 저장해두고
# 평균과 합계를 출력하는 프로그램
학생들 = [
    {"이름": "인성", "국어": 87, "영어": 88, "수학": 98, "과학": 95},
    {"이름": "구름", "국어": 92, "영어": 98, "수학": 97, "과학": 98},
    {"이름": "별이", "국어": 76, "영어": 96, "수학": 95, "과학": 90}
]

print("이름", "총점", "평균", sep="\t")
for 학생 in 학생들:
    총점 = 학생["국어"] + 학생["영어"] + 학생["수학"] + 학생["과학"]
    평균 = 총점 / 4
    print(학생["이름"], 총점, 평균, sep="\t")


# 문제점 발생
# 학생 생성 때 실수가 발생할 수 있으므로 생성을 획일화하면 좋을 것 같음
# 총점과 평균을 구하는 사양에 변경이 발생하면 코드를 수정하는데 오래 걸림

# 1. 함수를 사용해서 해결해 보기
# (1) 학생 생성 때 실수가 발생할 수 있으므로 생성을 획일화하면 좋을 것 같음
def create_student(이름, 국어, 영어, 수학, 과학):
    return {"이름": 이름, "국어": 국어, "영어": 영어, "수학": 수학, "과학": 과학}

학생들 = [
    create_student("인성", 87, 88, 98, 95),
    create_student("구름", 92, 98, 97, 98),
    create_student("별이", 76, 96, 95, 90)
]

## Ctrl + Alt + 방향키 위아래로 여러줄을 한꺼번에 선택하여 한번에 수정가능
# (2) 총점과 평균을 구하는 사양에 변경이 발생하면 코드를 수정하는데 오래 걸림
def sum_student(학생):
    return 학생["국어"] + 학생["영어"] + 학생["수학"] + 학생["과학"]

def average_student(학생):
    return sum_student(학생) / 4

print("이름", "총점", "평균", sep="\t")
for 학생 in 학생들:
    총점 = sum_student(학생)
    평균 = average_student(학생)
    print(학생["이름"], 총점, 평균, sep="\t")
    

## 문제점 발생
# (1) 함수가 너무 많아져서 합계를 구하는 함수가 있는지 + 평균을 구하는 함수가 있는지 자체를 모름
# (2) "학생들"이라는 변수에 직접적으로 접근할 수 있다는 것
# (3) 함수가 분산되어 있어 구분이 되지 않는다

## 이를 해결하기 위해 클래스가 탄생!!!!

 

댓글