2023-07-30 21:25:16
728x90
728x90

파이썬의 프로그래밍 언어는 객체지향 프로그래밍 언어(Object Oriented Programming)이다. 객체 지향 프로그래밍이란 객체를 우선으로 생각해서 프로그래밍 한다는 의미이다. 클래스 기반의 객체 지향 프로그래밍 언어는 클래스(class)라는 것을 기반으로 객체(object)를 만들고, 그러한 객체를 우선으로 생각해서 프로그래밍해야 한다. 

 

객체

프로그램을 만들 때는 우선 '우리가 어떤 데이터를 활용하는가?'를 생각하게 된다. 학생 성적 관리 프로그램을 만든다면 학생 이름, 학번, 과목별 성적 등이 필요하다. 딕셔너리로 학생을 표현하고 이를 리스트로 묶어 학생들을 표현한다. 이처럼 여러가지 속성을 가질 수 있는 대상을 객체(object)라고 부른다. 그런데 딕셔너리로 객체를 하나하나 만드니 조금 복잡하고 귀찮다. 딕셔너리를 만들 때 키를 잘못 입력하는 실수 등이 일어날 가능성도 있다. 딕셔너리를 생성하는 코드를 다음과 같은 경태의 함수로 만들면 어떨까? 딕셔너리를 입력할 때보다 쉽고, 키를 잘못 입력하는 실수도 하지 않게 된다.

 
# 딕셔너리를 리턴하는 함수를 선언한다.
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("윤인성", 87, 98, 88, 95),
    create_student("연하진", 92, 98, 96, 98),
    create_student("구지연", 76, 96, 94, 90),
    create_student("나선주", 98, 92, 96, 92),
    create_student("윤아린", 95, 98, 98, 98),
    create_student("윤명월", 65, 88, 92, 92)
]
#학생을 한 명씩 반복
print("이름", "총점", "평균", sep="\t")
for student in students:
    #출력
    print(student_to_string(student))

이처럼 객체와 관련된 코드를 분리할 수 있게 하는 것이 객체 지향 프로그래밍의 핵심이다. 그런데 이런 코드가 너무 자주 사용되다 보니, 개발자들은 클래스(class)라는 구조를 만들게 되었다. 위와 같은 형태의 코드를 조금 더 효율적으로 만들기 위한 기능이라고 생각하면 된다.

 

클래스 선언하기

클래스는 객체를 조금 더 효율적으로 생성하기 위해서 만들어진 구문이다.

클래스는 다음과 같은 구문으로 생성한다.

class 클래스 이름:
    클래스 내용

이렇게 만들어진 클래스는 클래스 이름과 같은 함수(생성자)를 사용해서 객체를 만든다.단순하게 생각하면 위 코드의 create_student() 함수와 같은 것이다.

인스턴스 이름(변수 이름) = 클래스 이름() -> 생성자 함수라고 부른다.

이러한 클래스를 기반으로 만들어진 객체를 인스턴스(instance)라고 부른다.

 

생성자

클래스 이름과 같은 함수를 생성자(constructor)라고 부른다. 클래스 내부에 __init__ 라는 함수를 만들면 객체를 생성할 때 처리할 내용을 작성할 수 있다.

class 클래스 이름:
    def __init__(self, 추가적인 매개변수):
    pass

클래스 내부의 함수는 첫 번째 매개변수로 반드시 self를 입력해야 한다. 이때 self는 '자기 자신'을 나타내는 딕셔너리 라고 생각하면 된다. 다만 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("윤인성", 87, 98, 88, 95),
    Student("연하진", 92, 98, 96, 98),
    Student("구지연", 76, 96, 94, 90),
    Student("나선주", 98, 92, 96, 92),
    Student("윤아린", 95, 98, 98, 98),
    Student("윤명월", 65, 88, 92, 92)
]
# Student 인스턴스의 속성에 접근하는 방법
students[0].name
students[0].korean
students[0].math
students[0].english
students[0].science

 

메소드

클래스가 가지고 있는 함수를 메소드(method)라고 부른다. 클래스 내부에 메소드를 만들 때는 다음과 같이 사용한다. 생성자를 선언하는 방법과 똑같다. 다만 첫 번째 매개변수로 self를 넣어야 한다는것을 기억하자.

class 클래스 이름:
    def 메소드 이름(self, 추가적인 매개변수):
        pass

위에서 만들었던 student_get_sum(), student_get_average(), student_to_string() 함수를 클래스 내부에 구현해 보겠다. 앞에서는 매개변수로 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("윤인성", 87, 98, 88, 95),
    Student("연하진", 92, 98, 96, 98),
    Student("구지연", 76, 96, 94, 90),
    Student("나선주", 98, 92, 96, 92),
    Student("윤아린", 95, 98, 98, 98),
    Student("윤명월", 65, 88, 92, 92)
]
# 학생을 한 명씩 반복
print("이름", "총점", "평균", sep="\t")
for student in students:
    #출력
    print(student.to_string())

 

클래스의 추가적인 구문

클래스를 사용하는 것은 작정하고 속성과 기능을 가진 객체를 만들겠다는 의미이다. 그래서 파이썬은 그에 따른 부가적인 기능을 지원한다. 예를 들어 어떤 클래스를 기반으로 그 속성과 기능을 물려받아 새로운 클래스를 만드는 상속, 이러한 상속 관계에 따라서 객체가 어떤 클래스를 기반으로 만들었는지 확인할 수 있게 해주는 isinstance()함수, 파이썬이 기본적으로 제공하는 str() 함수 혹은 연산자를 사용해서 클래스의 특정 함수를 호출할 수 있게 해주는 기능등이 대표적인 예이다.

 

728x90