파이썬 공부

Python Class 완전 쉽게 이해하기 (1) - 객체(object) 란

조뚜비 2021. 1. 27. 21:26
728x90

안녕하세요. 조뚜비입니다. 제대로 된 잡덕..⭐ 이번엔 파이썬 공부 카테고리로 왔습니다🤣 찐잡덕 인증,, 

 

저는 학부때도 입사 후에도 코딩의 ㅋ도 모르는 코알못이었는데요, 회사에서 딥러닝이니 뭐니 관심을 가지게 되면서 어어-억-지로 파이썬에 입문하게 되었습니다🤮 현재는 어찌저찌 이미지프로세싱 과제를 하고 있습니다..😭 그야말로 사노예가 아닌지..!!! 아, 사설이 길었습니다.

 

파이썬에 처음 입문을 하면서, 코딩 초보인 제게 제일 어려웠던 개념은 class 였습니다. 인스턴스 변수니, 객체지향이니, 오브젝트니.. 하는 말들 만으로도 머리가 아팠고 이해하기가 어려웠어요. 직접 코딩을 해 보니 class는 어렵다기 보다는 '편리한' 수단이더라구요. 해서 초보자분들께 도움이 되었으면 좋겠습니다.  **저도 초보인지라 틀린 부분이 있으면 지적 해 주시면 바로 수정하겠습니다!

 

 

 


 

Python 은 객체 지향 프로그래밍 언어(Object Oriented Programming Language)입니다. "객체 지향"이란 "객체를 우선"한다는 것인데, 이 프로그래밍 언어는 "클래스(class)"를 기반으로 "객체(object)"를 만들고, 그 객체를 우선으로 프로그래밍을 합니다.

 

 

1. 객체 (Object)

프로그램을 만들 때 사용하는 데이터에는 많은 속성들이 있습니다. 병원에서 환자 데이터를 기반으로 질병 발생확률을 계산한다면, 환자들의 나이, 성별, 몸무게, 진료기록 등이 속성이 되겠죠. 쉽게 학생들의 성적들로 간단한 데이터를 만들어 보면 아래와 같습니다.

 

students = [
    { 'name' : '황시목', 'korean':95, 'math': 93, 'english': 89, 'science': 93},
    { 'name' : '서동재', 'korean':83, 'math': 88, 'english': 97, 'science': 90},
    { 'name' : '이창준', 'korean':99, 'math': 91, 'english': 85, 'science': 92},
    { 'name' : '영은수', 'korean':92, 'math': 85, 'english': 86, 'science': 84}
    ]

print('이름', '총점', '평균', sep='\t')   # 이름 총점 평균을 tab으로 분리

for student in students:
    score_sum = student['korean']+student['math']+student['english']+student['science']
    score_avg = score_sum / 4
    
    print(student['name'], score_sum, score_avg, sep='\t')

 

비밀의 숲 출연자 이름으로 성적을 내 보았습니다. 평균은 황시목 검사가 제일 좋았네요! 

코드 결과

 

이렇게 여러가지 속성 (국어, 수학, 영어, 과학 각각의 점수) 을 가진 '학생들'을  '객체' 라고 부릅니다. 

 

그런데, 직접 코딩을 해 보니 학생들 성적을 일일히 딕셔너리로 치는 게 여간 불편한게 아닙니다. 조금 편한 방식으로 바꾸자면 아래처럼 바꿀 수있어요.

 

def student_data(name, korean, math, english, science):
    return {'name': name,
            'korean' : korean,
            'math' : math,
            'english' : english,
            'science' : science}

# 이름, 국어, 수학, 영어, 과학 순서대로 입력하면 딕셔너리로 변환하는 함수

students = [
    student_data('황시목', 95, 93, 89, 93),
    student_data('서동재', 83, 88, 97, 90),
    student_data('이창준', 99, 91, 85, 92),
    student_data('영은수', 92, 85, 86, 84)]

# 입력한 데이터가 student_data 함수에 의해 딕셔너리화 됨

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

for student in students:
    score_sum = student['korean']+student['math']+student['english']+student['science']
    score_avg = score_sum / 4
    
    print(student['name'], score_sum, score_avg, sep='\t')

 

조금 길어지긴 했지만, student_data 라는 함수를 쓰니, 매번 딕셔너리를 쓸 필요가 없게 되었습니다. 한 단계 더 들어가서, 총점과 평균은 학생을 대상으로만 이루어 지므로, 학생을 매개변수로 받는 형태의 함수로 만들면 아래처럼 됩니다. 

 

""" 학생 객체와 관련된 부분 """

# 이름, 국어, 수학, 영어, 과학 순서대로 입력하면 딕셔너리로 변환하는 함수
def student_data(name, korean, math, english, science):
    return {'name': name,
            'korean' : korean,
            'math' : math,
            'english' : english,
            'science' : science}


# 각 점수들의 합을 내주는 sum_score 함수
def sum_score(student):
    return student['korean']+student['math']+student['english']+student['science']


# 평균을 내주는 avg_score 함수
def avg_score(student):
    return sum_score(student)/4 

# 출력 포맷 작성. 각각 \t 으로 분리되며, 이름, 점수합, 평균 이 들어감.
def score_data(student):
    return '{}\t{}\t{}'.format(
        student['name'],
        sum_score(student),
        avg_score(student))

# 입력한 데이터가 student_data 함수에 의해 딕셔너리화 됨
students = [
    student_data('황시목', 95, 93, 89, 93),
    student_data('서동재', 83, 88, 97, 90),
    student_data('이창준', 99, 91, 85, 92),
    student_data('영은수', 92, 85, 86, 84)]
    
    
    
""" 객체를 활용하는 처리 """

print('이름', '총점', '평균', sep='\t') 
for student in students:
    print(score_data(student))

 

실행결과는 모두 동일하지만, 코드가 점점 분리가 되었죠. 물론 한번 쓰고 말 코드라면, 맨 윗 코드처럼 간단하게 작성해도 문제 없습니다만, 맨 마지막처럼 코드를 분리 해 놓으면 각 기능들을 모듈(.py)로 빼서 관리가 가능 해 집니다!

 

이렇게 '객체와 관련 된 코드를 분리' 할 수 있게 하는 것이 객체 지향 프로그래밍의 핵심입니다. 그런데 이렇게 코드가 자주 사용되다보니 '클래스' 라는 개념을 만들었습니다. 

 

 

2. 클래스(Class)

 

클래스는, 코드를 효율적으로 쓰기 위해 만들어진 구문입니다. 클래스는 아래처럼 선언합니다.

 

class Car:
    price = 100

클래스 이름은 '카멜케이스' 명명법에 따라, 첫 글자를 대문자로 작성합니다. 함수와 변수는 소문자와 "_"를 쓰는 '스네이크 케이스'를 쓰는 것에 비해, 클래스는 함수,변수와 구분을 위해 첫 글자를 대문자로 작성하는 것이 규칙입니다. 

 

이렇게 선언 된 클래스는, 이름과 같은 함수(생성자)를 사용해서 객체를 만듭니다. 위 코드로 예를 들면, student_data 함수와 같습니다!

 

인스턴스이름(변수) = 클래스이름()
# 우측의 클래스이름() 은 생성자 함수라고도 부릅니다

이렇게 만들어진 객체를 '인스턴스(instance)' 라고 부릅니다.

인스턴스 내용 부터는 다음 글에 이어서 쓰겠습니다 😎

 

 

#뚜비는복습중 .... 

여러분 우리 포기하지말아요!

또 만나요!!!!!!!!!!!!!