cs

요즘 체력 저질이여...

 

회사일도 개인적인 상황도 정신이 없는 와중에,,,

 

드디어 책의 마지막 챕터까지 드디어 도착했드아!!

 

슬슬 머신러닝(혼공머신!)이랑 같이해도 되겠댜..!

 

(BigQuery로하는 ML도 같이 해볼 수 있으면 해보겠다. 

 

구글 교육을 최근에 다녀오고 너무나 좋았고, 좌절도 있긴 했지만,,, 공부에 좀 더 불이 화르르...)


익히 들어봤던 자바, 파이썬, C, C++ 등등 이런것들 중에서 C를 제외한 모든 프로그래밍 언어는 객체 지향 프로그래밍 언어 라고 부른다고 한다.

 

객체 지향 프로그래밍은 객체를 우선으로 생각하고 프로그래밍 한다는 말인데,, 

 

모든 프로그래밍 언어들은 클래스 기반의 객체지향프로그래밍 언어라고 한다. 

 

클래스 기반의 객체 지향 프로그래밍 언어는 클래스(Class)를 기반으로 객체(Object)를 만들고 객체를 우선으로 프로그래밍을 한다고 나와있다. 

 

(정말 고전적인 설명같은데 알아먹기가 쉽지 않다. 그렇다면 뭐다? 예제와 정의를 보면 된다)

 

 

객체 (Object)

프로그램을 만들때 항상 우리는 고민하는게 어떤 데이터를 사용하는지가 가장 중요하다. 

 

당연한거다, 데이터를 먼저 고려를 하고 프로그램을 짜던지 분석을 하던지 하니까. 

 

책에서와 같이, 학생 성적 관리 프로그램을 만들려면 뭐가 필요한가?

 

학생 이름이나, 학번, 과목들과 성적 등이 필요할 것이다. 

 

(손코딩... 나름 좀 간단하게 내가 줄여서 정리해보겠다)

 

기본 예제 코드

students = [
    {"name": "A", "Korean": 82, "Math" : 99, "English": 78, "Science": 93},
    {"name": "B", "Korean": 56, "Math" : 19, "English": 95, "Science": 73},
    {"name": "C", "Korean": 73, "Math" : 96, "English": 55, "Science": 84}
]


print("이름", "총점", "평균", sep="\t")

for student in students:
    score_sum = student["Korean"]+student["Math"] + student["English"] + student["Science"]
    score_average = score_sum/4
    
    print(student["name"], score_sum, score_average, sep="\t")

 

 

딕셔너리로 학생 정리하고 리스트로 학생들 점수를 써준거다 

 

이런것 처럼 여러 속성을 가질 수 있는 대상을 Object (객체)라고 부른다. 

-> 여기서는 학생이 객체 

 

근데 내가 이거 따라하면서도 느낀거지만, 참 귀찮고 복잡하고 그렇다잉.. 

에러를 한 3-4번은 본것같다.

 

조금 더 간단한 코드가 있다고 하는데,,

 

객체를 만드는 함수

#딕셔너리를 리턴하는 함수선언 
def create_student(name, Korean, Math, English, Science):
    
    return{
        "name": name,
        "Korean": Korean,
        "Math": Math,
        "English": English, 
        "Science": Science
    }

#학생 리스트 선언
students = [
    create_student("A", 85, 58, 99, 95),
    create_student("B", 63, 78, 69, 88),
    create_student("C", 74, 86, 87, 85)
]

#학생을 한명씩 반복
print("이름", "총점", "평균", sep="\t")
for student in students:
    score_sum = student["Korean"]+student["Math"]+student["English"]+student["Science"]
    score_average = score_sum / 4

    #출력
    print(student["name"], score_sum, score_average, sep="\t")

위랑 동일한데, 훨씬 더 뭔가 체계적으로 쓴 느낌이다. 

 

정리가 더 잘되어있고, 위에서보다 애러가 더 생길 이유가 없다. 

 

 

이제는 코드가 더 분리된 형태를 만들어보려한다. 

 

객체를 처리하는 함수

#딕셔너리 리턴하는 함수 선언 

def create_student(name, korean, math, english, science):
    return{
        "name": name,
        "korean": korean,
        "math": math,
        "english": english,
        "science": science
    }

#학생을 처리하는 함수 선언
def student_get_sum(student):
    return student["korean"]+student["math"]+student["english"]+student["science"]

def student_get_average(student):
    return student_get_sum(student)/4

def student_to_string(student):
    return "{}\t{}\t{}".format(
    student["name"],
    student_get_sum(student),
    student_get_average(student))


#학생 리스트 선언
students =[
    create_student("A", 41, 85, 46, 88),
    create_student("B", 16, 96, 98, 99),
    create_student("C", 75, 68, 57, 66),
    create_student("D", 97, 86, 64, 89)
]

# 학생을 한명씩 반복
print("이름", "총점", "평균", sep="\t")
for student in students:
    #출력하기
    print(student_to_string(student))

역시나 결과는 다 동일하게 나온다.

 

그치만 이번것이 더더욱 코드가 여러 형태로 분리가 되어있다. 

 

학생을 처리하는 함수가 따로 세가지가 나와있고, 리스트만 나누어준거다. 

 

이렇게 코드를 분리가 가능하게 짤 수 있는 것이 객체 지향 프로그래밍의 핵심이라고 불린다.

 

 

근데 보면, 정말 많은 반복이다. 코드가 많이 사용되다 보니까, 개발자들은 클래스라는 구조를 만들게 된것이다. 

 

 

클래스 선언하기

클래스는 객체를 조금 더 효율적으로 생성하기 위한 구문이다. 

 

class 클래스 이름:

    클래스 내용

 

이렇게 만들어진 클래스는 클래스 이름과 같은 함수를 사용해서 객체를 만든다.

 

아까 위에서의 create_student()같은 함수 라고 보면 된다.

 

인스턴스 이름(변수 이름) = 클래스 이름() 

 

이런 클래스 기반으로 만들어진 객체를 인스턴스라고 불러준다. 

 

책에서의 예제 그림이 딱 이해가 쉬워서 가져왔다.

붕어빵 올해 겨울도 못먹은듯하다...

 

학생들을 선언해보자면,,,,

#클래스 선언
class Student:
    pass

#학생 선언
students = Student

#학생 리스트 선언 
students = [
    Student(),
    Student(),
    Student(),
    Student()
]

요론 느낌이다. 

 

생성자

클래스 이름과 같은 함수를 생성자(constructor)라고 부른다.

 

클래스 내부의 __init__라는 함수를 만들면 객체를 생성할 때 처리할 내용을 작성할 수 있다. 

(뭔소리라?)

 

class 클래스 이름:

    def __init__(self, 추가적인 매개변수):

        pass

 

클래스 내부의 함수는 첫번째 매개변수로 반드시 self를 입력해야한다고 한다.

 

self는 '자기자신'을 나타내는 딕셔너리라는건데, 식별자 형태로 접근한다고 한다.

 

예제를 보자 예제...

 

 

#클래스 선언
class Student:
    def __init__(self, name, korean, math, english, science):
        self.name=name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
        

#학생 리스트 선언
students= [
    Student("A", 85, 64, 86, 79),
    Student("B", 55, 60, 69, 87),
    Student("C", 65, 64, 78, 100),
    Student("D", 95, 94, 96, 99)
]

students[0].name
students[0].korean
students[0].math
students[0].english
students[0].science

흠.. 잘 이해가 안가는데,

 

이렇게 만들면 Stduent 인스턴스가 생성되면 속성이 자동으로 직접 추가 된다고한댜.

 

(아직도 완벽히 이해하기 힘들긴한데,,, 분명 한번 어딘가에서 쓰일것이여..)

 

메소드

클래스가 가지고 있는 함수를 메소드라고 부른다.

 

선언하는 방법은 똑같은데 첫번째로 꼭 self를 넣어줘야한다고 한다. 

 

class 클래스 이름:

    def 메소드 이름(self, 추가적인 매개변수):

        pass

 

그래 또 예제를 보자...

 

이전에는 매개변수로 student를 받았는데, 함수를 생성할때 self를 입력해보자고요..

 

#클래스 선언
class Student:
    def __init__(self, name, korean, math, english, science):
        self.name=name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
        
    def get_sum(self):
        return self.korean+self.math+self.english+self.science
    
    def get_average(self):
        return self.get_sum() / 4
    
    def to_string(self):
        return "{}\t{}\t{}".format(\
                                  self.name,\
                                  self.get_sum(),\
                                  self.get_average())
    
students= [
    Student("A", 85, 64, 86, 79),
    Student("B", 55, 60, 69, 87),
    Student("C", 65, 64, 78, 100),
    Student("D", 95, 94, 96, 99)
]

print("이름", "총점", "평균", sep="\t")
for student in students:
    print(student.to_string())

응 확실히 함수로 다 설정을 시켜버리니까 어떤 함수가 사용이 된건지도 보기 쉽고, 수정할때도 편리해 보인다. 

 

어렵다 어렵... 

 

그래도 한번은 어디서 꼭 쓰일거여.

 

 

+ Recent posts