본문 바로가기
일/Python

Python) 학습 - 기본6일차(class)

by 멜랑멀리 2022. 12. 22.
SMALL

[ 18_class ]

# everything is object ! 모든 것이 객체다!


print(10)
print("hello".upper()) # -> upper("hello")

# 학생의 점수를 관리하는 학사관리 프로그램.

def total(a, b, c):
    return a + b + c

def average(tot, cnt):
    return tot / cnt

name1 = "daniel"
kor1 = 10
eng1 = 20
math1 = 30
tot1 = total(kor1, eng1, math1) # kor1 + eng1 + math1
avg1 = average(tot1, 3)         # tot1 / 3
print(name1, tot1, avg1)

name2 = "susan"
kor2 = 20
eng2 = 30
math2 = 40
tot2 = total(kor2, eng2, math2)
avg2 = average(tot1, 3) # ??
print(name2, tot2, avg2)

# 절차지향적 프로그래밍. (C언어) 

# bug 발생가능성이 높음. -데이터에 잘못된 값을 넣으면...

# 관련있는건 묶어서 처리하는게 좋음.
# 딕셔너리를 사용 ["key":"value"]



# 이전의 코드는 학생데이터가 개별로 취급. 계산이 올바르게 되지 않을수 있음.
# 관련있는 데이터를 묶어서 처리(딕셔너리)

def total(st):
    return st["kor"] + st["eng"] + st["math"]

def average(st):
    return (st["kor"] + st["eng"] + st["math"]) / st["cnt"]

daniel = dict(name="daniel", kor=10, eng=20, math=30, cnt=3)
tot1 = total(daniel)
avg1 = average(daniel)
print(daniel["name"], tot1, avg1)

susan = dict(name="susan", kor=20, eng=30, math=40, cnt=3)
tot2 = total(susan)
avg2 = average(daniel) # ??
print(susan["name"], tot2, avg2)

# bug 가 발생할수 있음.
# 함수를 부를때 잘못 부르면 bug가 발생할수 있음.
# 데이터와 데이터가 사용하는 함수가 밀접하게 관계되어 있는데, 개별로 취급하고 있음. -> class 라는 개념을 제공.


# 이전의 코드는 데이터와 데이터를 처리하는 함수가 이원화 되어 있음 -> bug 문제 발생가능.
# 데이터와 함수를 하나로 묶어서 처리 -> 파이썬 클래스(class) 제공

# 1. class에 데이터 추가 --> 2 class에 함수 도입 ( 설명 방식 )


def total(st):
    #객체로부터 값을 꺼내오는 방법: 객체명.변수명
    return st.kor + st.eng + st.math

def average(st):
    return (st.kor + st.eng + st.math) / st.cnt

# 클래스 정의방법
# class 클래스명:
# ....관련코드 작성
# ....관련코드 작성

class Student:  # 클래스 이름은 관례적으로 첫문자는 대문자 사용.
    pass        # 그냥 지나가달라는 의미 : class선언한것의 비어있는걸 나타내는것.


# 클래스        vs      객체    의 관계
# 클래스                객체
# 제품의 설계도         설계도로부터 생산된 제품
# 붕어빵의 틀           붕어빵(크림빵,단팥빵,...)
# 상자를 만드는틀       상자

# 붕어빵의 틀이 없으면 직접만들어야한다. (class)

# 클래스로부터 객체를 생성하는 방법
# 변수명(객체명) = 클래스명()
daniel = Student()

# 객체 안에 값을 추가하는 방법
# 객체명.변수명 = 값
daniel.name = "daniel"
daniel.kor = 10
daniel.eng = 20
daniel.math = 30
daniel.cnt = 3
tot1 = total(daniel)    
avg1 = average(daniel)
print(daniel.name, tot1, avg1)

susan = Student()
susan.name = "susan"
susan.kor = 20
susan.eng = 30
susan.math = 40
susan.cnt = 3
tot2 = total(susan)     # 함수는 아직 개별적으로 사용되고 있음.
avg2 = average(susan)
print(susan.name, tot2, avg2)

# 기존 code와 차이점이 별로 없지만, 점점 합쳐지고 있음 -> class가 다반영이되면, 더 줄어들거다.
# 함수는 아직 개별적으로 사용되고 있음.


# 이전의 코드는 데이터와 데이터를 처리하는 함수가 이원화 되어 있음 -> bug 문제 발생가능.
# 데이터와 함수를 하나로 묶어서 처리 -> 파이썬 클래스(class) 제공

# 함수를 class를 넣는다.
class Student:  
    def total(st):
        return st.kor + st.eng + st.math

    def average(st):
        return (st.kor + st.eng + st.math) / st.cnt


daniel = Student()
daniel.name = "daniel"
daniel.kor = 10
daniel.eng = 20
daniel.math = 30
daniel.cnt = 3
tot1 = daniel.total() # total(daniel) : 이런식으로 전달함. 파이썬에서는 code를 변환해서 전달함. 인자를 전달하고 있음.
avg1 = daniel.average() # average(daniel)
print(daniel.name, tot1, avg1)

susan = Student()
susan.name = "susan"
susan.kor = 20
susan.eng = 30
susan.math = 40
susan.cnt = 3
tot2 = susan.total()     
avg2 = susan.average()   # 매개변수가 함수에는 있는데 사용할때는 매개변수없이 사용하고 있음. 
print(susan.name, tot2, avg2)





class Student:
    # 클래스 안에 정의된 함수들은 반드시 첫 번째 매개변수를 예약석으로 남겨두어야 합니다.
    # 이는 클래스 안의 함수를 호출할 때, 파이썬이 객체의 정보를 첫 번째 인자로 전달하기 때문입니다.
    # 이와 같이 함수가 호출될 때, 객체의 정보와 함께 호출되는 함수를 인스턴스 메서드라고 합니다.
    # 파이썬에서는 예약석으로 남겨둔 매개변수를 다른 매개변수와 구분하기 위해 관례적으로 self라는
    # 이름을 사용합니다.    
    def total(self):
        return self.kor + self.eng + self.math

    def average(self):
        return (self.kor + self.eng + self.math) / self.cnt

# 이전의 코드는 과목명이 이미 내부적으로 결정되어 있어 과목명을 모르면 학생 클래스를 사용할 수 없음.
# 이를 해결하기 위해 초기값을 사용자가 아닌 클래스 설계자가 대신 초기화할 수 있도록 초기화 메서드를 추가    
    def initialize(self, name, korean, english, mathematical, count):
        self.name = name
        self.kor = korean
        self.eng = english
        self.math = mathematical
        self.cnt = count

daniel = Student()
# daniel.initialize("daniel", 10, 20, 30, 3) # 초기화를 하지 않으면, Error 
tot1 = daniel.total() 
avg1 = daniel.average()
print(daniel.name, tot1, avg1)

susan = Student()
susan.initialize("susan", 20, 30, 40, 3)
tot2 = susan.total()
avg2 = susan.average()
print(susan.name, tot2, avg2)

# 이전의 코드는 객체를 생성한 후, 사용자가 반드시 초기화 메서드를 호출해야 한다는 치명적인
# 문제가 있습니다. 이를 해결하기 위해 초기화 함수를 자동으로 호출하는 메서드를 도입하도록 하는데
# 이를 생성자(constructor)라고 합니다.
class Student:
    # 파이썬에서 생성자의 이름은 이미 결정되어 있습니다.
    def __init__(self, name, korean, english, mathematical, count):
        print("Student.__init__(%s, %d, %d, %d, %d)" % (name, korean, english, mathematical, count))
        self.name = name
        self.kor = korean
        self.eng = english
        self.math = mathematical
        self.cnt = count
    
    def total(self):
        return self.kor + self.eng + self.math

    def average(self):
        return (self.kor + self.eng + self.math) / self.cnt

#daniel_f = Student()
daniel_f = Student("daniel", 10, 20, 30, 3)
tot1 = daniel_f.total() 
avg1 = daniel_f.average()
print(daniel_f.name, tot1, avg1)

susan_f = Student("susan", 20, 30, 40, 3)
tot1 = susan_f.total() 
avg1 = susan_f.average()
print(susan_f.name, tot2, avg2)

# 모두 class에서 사용하는 함수에 self가 들어가 있음.
help(list) 

# class에서 생성된걸 왜 객체(object)라고 할까?
# object = 사물 또는 물건 
# 사물이나 물건 -> 상태+기능 또는 속성+행위

# ex) 볼펜
# 상태나 속성: 검정색, 모나미, 0.5mm -> 변수
# 기능이나 행위: 쓰다, 그리다        -> 함수(메서드)

# 객체: 변수 + 함수
LIST