반응형
클래스란?
  1.   객체 지향 프로그래밍 언어를 구현하는 방법입니다.
  2.   객체를 기반으로 변수와 함수를 묶어서 구분하는 것을 객체 지향 프로그래밍입니다.

 

▶  클래스?
     1. 함수와 변수를 묶어 놓은 것

     2. 객체를 만들어내개 위한 설계도
     객체 = 인스턴스

 

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

    -  객체를 우선으로 생각해서 프로그래밍한다는 의미입니다. 

    -  클래스 기반의 객체 지향 프로그래밍 언어는 클래스라는 것을 기반으로 객체를 만들고, 그러한 객체를 우선으로 생각해서 프로그래밍하는 것을 의미합니다.

 

[  클래스 - 문제1 ]  학생들의 성적을 저장해두고 평균과 합계를 출력하는 프로그램입니다.

학생들 = [
    {"이름":"정올", "국어":87, "영어":99, "수학":96, "과학":67},
    {"이름":"본선", "국어":69, "영어":88, "수학":49, "과학":82},
    {"이름":"민석", "국어":98, "영어":90, "수학":76, "과학":79}
]

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

[ 생각해볼문제 ]

1. 학생수가 적다면 문제가 없지만 학생수가 많아진다면?

   - 학생을 추가할 때 오타가 날 수 있습니다.

   - 총점이나 평균을 구하는 코드가 여러번 사용될 수 있습니다.

 2.  만약, 또 다른 과목이 추가 된다면?

    - 총점을 구하는 코드를 일일이 찾아서 변경해야 합니다.

    - 변경 누락이 생길수 있고 시간이 오래 걸립니다.

 

[ 해결 방법 1 - 함수로 해결하기 ]

def create_student(이름, 국어, 영어, 수학, 과학):
    return {"이름":이름, "국어":국어,"영어":영어,"수학":수학,"과학":과학}

def sum_student(학생):
    return 학생["국어"]+학생["영어"]+학생["수학"]+학생["과학"]

def average_student(학생):
    return sum_student(학생) / 4
    
학생들 = [
    create_student("정올", 87, 99, 96, 67),
    create_student("본선", 69, 88, 49, 82),
    create_student("민석", 98, 90, 76, 79)
]

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

▶ 함수 때문에 코드길이는 늘어났지만 수정이 용이해졌습니다.

 

[ 생각해볼문제 ]

  1. 규모가 더~~ 더 커진다면 함수가 너무 많아져서 어떤 함수가 있는지 알수가 없습니다.

 

[ 해결 방법 2 - 클래스로 해결하기 ]

class 학생:
    def 초기화(self, 이름, 국어, 영어, 수학, 과학):  #매개변수
        self.이름 = 이름
        self.국어 = 국어
        self.영어 = 영어
        self.수학 = 수학
        self.과학 = 과학
        


#객체(인스턴스)
st = 학생()

#함수 호출 방법 1
학생.초기화(st,"정올", 87, 88, 98, 95)
print(st.이름, st.국어)


#함수 호출 방법2
st.초기화("정올", 87, 88, 98, 95)
print(st.이름, st.국어)

※ 함수 호출 방법2를 더 많이 사용합니다.

 

[ 해결 방법 3 - 클래스로 해결하기 ]

class Student:
    def __init__(self, 이름, 국어, 영어, 수학, 과학):
        self.이름 = 이름
        self.국어 = 국어
        self.영어 = 영어
        self.수학 = 수학
        self.과학 = 과학

    def sum(self):
        return self.국어 + self.영어 + self.수학 + self.과학
    
    def average(self):
        return self.sum() / 4
        
    def print(self):
        print(self.이름, self.sum(), self.average(), sep="\t")


StudentList = [
    Student("정올", 87, 99, 96, 67),
    Student("본선", 69, 88, 49, 82),
    Student("민석", 98, 90, 76, 79)
]
   
print("이름", "총점","평균", sep="\t")
for 학생s in StudentList:
    학생s.print()

 

# 클래스 이름 정의하는 방법

  -  스네이크 케이스 : 단어와 단어 사이를 _ 연결하는 방법  예) create_student

 대문자 캐멀 케이스 : 단어의 첫 자를 대문자로 바꾸고 연결하는 방법  예) CreateStudent

    →  파이썬은 대문자 캐멀 케이스를 사용하여 클래스 이름을 정의 합니다.

 

클래스를 사용하는 이유

     1. 함수와 변수를 모았으므로 가독성이 좋아지고

     2. 코드 변경과 유지 보수 대 확인해야 하는 범위가 줄어듭니다.

     3. 캡슐화 : 변수 앞에 __를 붙이면 코드 밖에서 수정이 불가능합니다. 

         -  인스턴스 변수의 중복 사용을 막을 수 있습니다.

 

반응형
Posted by 명문코딩컴퓨터
,