클래스(Class)

2023. 3. 11. 23:49Python/실전 예제로 배우는 파이썬 프로그래밍

클래스와 객체는 객체지향프로그래밍에서 나오는 용어입니다. 클래스(Class)는 프로그램을 이용해서 객체를 만들어주는 역할을 하고, 객체(Object)는 클래스에 의해서 만들어지는 결과물(Instance)을 말합니다.

 

클래스

클래스의 속성은 자료(data)를 나타내며, 명사 형태로 기술합니다. 속성 앞부분의 (-, +)는 외부에서 접근여부를 나타내는 기호입니다. - 기호는 외부에서 접근을 차단하여 해당 자료를 은닉(private)화 시키고, +는 외부에서 접근을 허용하도록 공용(pubic)화 시킵니다. 또한 클래스의 행위는 자료를 연산하거나 조작하는 역할을 하며, 동사 형태로 기술하고, 프로그램에서는 기능을 정의하는 함수로 표현합니다.

 

객체

객체는 클래스에 의해서 만들어지는 결과물입니다. 클래스의 속성에 실제 자료가 들어가고, 실제 자료를 동작시키는 함수가 하나로 묶인 단위를 말합니다. 즉 자료(Data)와 매서드(Method)가 하나로 묶여서 만들어진 결과물입니다. 클래스와 객체는 1 : N의 관계를 갖습니다. 각 객체는 Method를 이용하여 자체 Data를 조작하면서 실행됩니다. 객체들은 서로 독립적인 메모리 주소를 가지고 있으며, 메시지(Message)를 이용해서 상호작용도 가능합니다.

 

■ 함수(Function): 독립된 기능을 수행하는 코드(명령문)들의 집합

■ 메서드(Method): 클래스에 포함되어 있는 함수

 

함수와 클래스

함수는 독립적인 기능을 수행할 수 있는 코드의 집합이고, 클래스는 공통 기능을 갖는 함수들을 하나로 묶을 수 있는 단위를 의미합니다.

 

형식

함수 형식)
      def 외부함수(인수) :
               변수선언
               def 내부함수(인수) :
                      명령문
                      return 값
               return 내부함수
클래스 형식)
    class 클래스명 :
              변수 선언
              def 생성자(인수) :
                     명령문
              def 함수명(인수) :
                     명령문

 왼쪽의 함수 형식에서 def 명령어로 함수명과 인수를 이용하여 선언합니다. 외부함수에서는 함수 내에서 사용할 변수를 선언하고, 내부함수에서는 선언된 변수를 처리하는 명령문을 작성합니다. 마지막으로 내부함수를 호출할 수 있도록 return문으로 반환합니다.

 오른쪽의 클래스 형식은 함수 형식과 비슷한 모양을 갖습니다. class 명령어 다음에 클래스이름이 옵니다. 함수처럼 외부에서 값을 넘겨받는 인수는 없습니다. 클래스 내부는 객체의 자료가 저장될 변수를 선언하고, 자료를 처리하는 함수들로 구성됩니다. 그리고 객체를 생성하기 위해서 '생성자'라는 특수한 함수를 포함합니다. 클래스는 객체를 통해서 함수를 호출하기에 함수들을 반환하는 return문이 없습니다.

 

실습 함수와 클래스 예시

# (1) 함수 정의
def calc_func(a, b):	# 외부함수
	# 변수 선언: 자료 저장
    x = a	# 10
    y = b	# 20
    
    def plus():	# 내부함수
    	p = x + y
        return p
    
    def minus():	# 내부함수
    	m = x - y
        return m
    return plus, minus

# (2) 함수 호출
p, m = calc_func(10, 20)
print('plus =', p())
print('minus=', m())

plus = 20
minus = -10

# (3) 클래스 정의
class calc_class :
	# 클래스 변수: 자료저장
    x = y = 0
    
    # 생성자 : 객체 생성 + 멤버변수 초기화
    def __init__(self, a, b):
    	self.x = a	# 10
        self.y = b	# 20
        
    # 클래스 함수
    def plus(self):
    	p = self.x + self.y	# 변수 연산
        return p
    
    # 클래스 함수
    def minus(self):
    	m = self.x - self.y	# 변수 연산
        return m

# (4) 객체 생성
obj = calc_class(10, 20)

# (5) 멤버 호출
print('plus = ', obj.plus())	# plus = 30
print('minus =', obj.minus())	# minus = -10

plus = 30
minus = -10

# (1) 함수 정의

매개변수 x, y를 대상으로 덧셈과 뺄셈을 수행하는 plus()와 minus()의 내부함수를 포함하는 중첩함수입니다.

 

# (2) 함수 호출

실인수 10과 20으로 중첩함수를 호출하고, 함수 클로저(내부함수)를 반환받아서 덧셈과 뺄셈 연산 결과를 출력합니다.

 

# (3) 클래스 정의

함수의 매개변수 x, y를 클래스 변수로 선언합니다. 생성자를 선언하여 객체를 생성하고, 클래스 변수에 값을 초기화하도록 합니다. 덧셈과 뺄셈을 수행하는 plus()와 minus()를 클래스 함수로 정의합니다.

 

# (4) 객체 생성

클래스의 생성자를 이용하여 객체를 생성하고, 클래스 변수에 실인수 10과 20을 할당하여 자료를 만듭니다.

 

# (5) 멤버 호출

생성된 객체(obj)를 이용하여 클래스에서 정의한 함수를 호출하고, 연산 결과를 출력합니다.

 

클래스 구성요소

■ 클래스 구성요소: 멤버(Member) + 생성자(Constructor)

■ 멤버: 멤버변수(자료) + 메서드(기능)

 

실습 클래스 구성요소 예시

class Car:
	# (1) 멤버변수
    cc = 0	# 엔진 cc
    door = 0	# 문짝 개수
    carType = None	# null
    
    # (2) 생성자
    def __init__(self, cc, door, carType):
    	# 멤버 변수 초기화
        self.cc = cc
        self.door = door
        self.carType = carType	# 승용차, SUV
    
    # (3) 메서드
    def display(self):
    	print("자동차는 %d cc이고, 문짝은 %d개, 타입은 %s" % (self.cc, self.door, self.carType))
    
    # (4) 객체 생성
    car1 = Car(2000, 4, "승용차")	# 객체 생성 + 초기화
    car2 = Car(3000, 5, "SUV")
    
    # (5) 멤버 호출: object.member()
    car1.display()	# car1 멤버 호출
    car2.display()	# car2 멤버 호출
    
    자동차는 2000 cc이고, 문짝은 4개, 타입은 승용차
    자동차는 3000 cc이고, 문짝은 5개, 타입은 SUV

# (1) 멤버변수

Car 클래스의 선언부에 3개의 멤버변수(cc, door, carType)를 선언합니다. (초기값은 0과 null)

 

# (2) 생성자

생성자는 함수의 선언과 유사하지만 차이점은 이름이 정해져 있고, self라는 인수를 사용한다는 점입니다. 예문에서 생성자는 def 명령어 다음에 '__init__'이라는 이름과 self 인수를 이용하여 선언됩니다.

 

# (3) 메서드

메서드는 함수의 선언과 동일합니다. 차이점은 생성자와 마찬가지로 self로 정해진 인수를 포함하고 있다는 점입니다. 예문에서 display() 메서드는 self를 이용하여 3개의 멤버변수의 내용을 출력하는 역할을 합니다.

 

# (4) 객체 생성

클래스의 생성자를 이용하여 객체를 생성합니다. 한 개의 클래스에 의해서 다수의 객체를 만들어 낼 수 있습니다.

 

참조변수 = Car(실인수)

 

# (5) 멤버 호출

생성된 객체의 참조변수를 이용하여 객체의 멤버를 호출할 수 있습니다. 참조변수를 이용하여 객체의 멤버를 호출하는 방법은 다음과 같습니다.

 

참조변수. 멤버(멤버변수 or 메서드)

 

car1.display()는 car1 참조변수를 이용하여 display() 메서드를 호출하는 명령문입니다. 따라서 car1의 객체에 포함된 메서드 호출에 의해서 car1 객체의 자동차 정보가 출력됩니다.

 

생성자

생성자(Constructor)는 __init__() 이란 이름으로 제공되고, 객체가 생성될 때 자동으로 실행됩니다. 생성자의 역할은 객체 생성 시 멤버변수에 값을 초기화하는 역할을 합니다. 모든 클래스는 객체를 생성하는 것이 목적이므로 반드시 생성자를 가지고 있어야 합니다. 클래스에서 정의된 생성자의 이름과는 다르게 객체를 생성할 때는 생성자가 포함된 클래스 이름 뒤에 괄호()를 붙이고, 매개변수에 전달될 실인수를 괄호에 넣어서 함수를 호출하듯이 객체를 생성합니다.

 

형식

참조변수 = 클래스이름(실인수)

실습 생성자 예시

# (1) 생성자 이용 멤버변수 초기화
class multiply:
	# 멤버 변수
    x = y = 0
    
    # 생성자: 초기화
    def __init__(self, x, y):	# 객체만 생성
    	self.x = x
        self.y = y
    
    # 메서드
    def mul(self):
    	return self.x * self.y

obj = multiply(10, 20)	# 생성자
print('곱셈 =', obj.mul())

곱셈 = 200

# (2) 메서드 이용 멤버변수 초기화
class multiply2:
	# 멤버 변수
    x = y = 0
    # 생성자 없음: 기본 생성자 제공
    def __init__(self):
    	pass
    # 메서드: 멤버변수 초기화
    def data(self, x, y):
    	self.x = x
        self.y = y
    
    # 메서드: 곱셈
    def mul(self):
    	return self.x * self.y

obj = multiply2()	# 기본 생성자
obj.data(10, 20)	# 동적 멤버변수 생성
print('곱셈 =', obj.mul())

곱셈 = 200

# (1) 생성자 이용 멤버변수 초기화

multiply 클래스는 두 개의 멤버변수(x, y)에 값을 초기화하기 위해서 두 개의 매개변수를 갖는 생성자 __init__(self, x, y)를 정의하고, 객체가 생성되는 시점에서 실인수 2개가 매개변수로 할당되어 멤버변수 x, y에 초기화됩니다.

 

# (2) 메서드 이용 멤버변수 초기화

multiply2 클래스는 생성자를 이용하여 멤버변수에 값을 초기화하지 않고, data() 메서드에 의해서 초기화되므로 생성자를 쓰지 않았습니다.

 

소멸자(Destructor)

class multiply:
	  # 생성자: 객체 생성 + 멤버변수 초기화
            def __init__(self, x, y):
            	self.x = x
                self.y = y
            
            # 소멸자: 객체 소멸
            def __del__(self):
            	del self.x
                del self.y

self

클래스의 생성자와 메서드는 기본적으로 self라는 인수를 가지며, 만약 self 인수를 생략하면 오류가 발생합니다.

 

형식

self.멤버변수
self.메서드()

실습 self 명령어 예시

class multiply3:
	# 멤버변수 없음
    # 생성자 없음
    
    # 동적 멤버변수 생성/초기화
    def data(self, x, y):
    	self.x = x
        self.y = y
    
    # 곱셈 연산
    def mul(self):
    	result = self.x * self.y
        self.display(result)	# 메서드 호출
    
    # 결과 출력
    def display(self, result):
    	print("곱셈 = %d" % (result) )

곱셈 = 200

obj = multiply3()	# 기본 생성자
obj.data(10, 20)
obj.mul()

self 명령어 예시

multiply3 클래스는 멤버변수와 생성자를 모두 정의하지 않습니다. 생성자는 기본 생성자가 자동으로 만들어질 것이며, 곱셈 연산을 위해서는 두 개의 자료가 만들어져야 합니다. 클래스 선언부에 멤버변수가 정의되지 않았기에 data() 메서드가 호출되는 시점에서 self.x, self.y 명령문에 의해서 동적으로 멤버변수가 만들어지고, 매개변수에 의해서 값이 초기화됩니다.

 

self.멤버변수 = 매개변수

 

클래스 멤버

객체는 클래스의 생성자를 이용해서 만들어집니다. 그리고 객체를 구성하는 객체 멤버는 객체 변수, 객체 메서드가 되며, 이들은 모두 객체(참조변수)를 통해서 호출이 가능합니다.

 

객체 멤버와 클래스 멤버

구분 객체 멤버 클래스 멤버
구성요소 객체 변수, 객체 메서드 클래스 변수, 클래스 메서드
객체 생성 객체 생성 필요 객체 생성 필요 없음
멤버 참조 객체의 참조변수 이용 클래스이름 이용
기본 인수 객체 메서드(self) 클래스 메서드(cls)
함수 장식자 필요 없음 필요함(@classmethod)

실습 클래스 멤버 예시

class DatePro:
	# (1) 멤버 변수
    content = "날짜 처리 클래스"
    
    # (2) 생성자
    def __init__(self, year, month, day):
    	self.year = year
        self.month = month
        self.day = day
        
     # (3) 객체 메서드(instance method)
     def display(self):
     	print("%d-%d-%d"%(self.year, self.month, self.day))
     
     # (4) 클래스 메서드(class method)
     @classmethod	# 함수 장식자
     def date_string(cls, dateStr):	# '19951025'
     	year = dateStr[:4]
        month = dateStr[4:6]
        day = dateStr[6:]
        
        print(f"{year}년 {month}월 {day}일")
        
      # (5) 객체 멤버
      date = DatePro(1995, 10, 25)	# 생성자
      print(date.content)	# 날짜 처리 클래스
      print(date.year)	# 1995
      date.display()	# 1995-10-25
      
날짜 처리 클래스
1995
1995-10-25

# (6) 클래스 멤버
print(DatePro.content)	# 날짜 처리 클래스
# print(Datepro.year)	# AttributeError
Date.Pro.date_string('19951025')	# 1995년 10월 25일

날짜 처리 클래스
1995년 10월 25일

# (1) 멤버 변수

클래스 선언부에 선언된 content 변수는 기존과 같이 객체의 멤버변수가 됩니다. 또한 클래스 멤버변수가 될 수 있습니다.

 

# (2) 생성자

생성자에서 'self.멤버변수'로 선언된 변수는 객체 멤버변수만 됩니다. 클래스 멤버변수는 될 수 없습니다.

 

# (3) 객체 메서드(instance method)

객체 메서드는 기본 인수 self를 포함하여 함수가 정의됩니다. 이러한 함수는 생성자를 이용하여 객체를 생성하고, 객체의 참조변수에 의해서 호출되는 객체 메서드입니다.

 

# (4) 클래스 메서드(class method)

클래스 메서드는 '@classmethod'라는 함수 장식자를 이용하여 먼저 선언한 후 클래스 메서드를 정의합니다.

 

# (5) 객체 멤버

생성자를 이용하여 객체를 생성하고, 객체 멤버변수와 객체 메서드를 호출하여 날짜 정보를 출력합니다.

 

# (6) 클래스 멤버

DatePro 클래스이름으로 클래스 멤버를 호출합니다. self로 지정되지 않은 content는 클래스 멤버변수가 될 수 있습니다. 또한 함수장식자에 의해서 선언된 date_string()은 클래스 메서드이므로 클래스 이름으로 호출할 수 있습니다.

'Python > 실전 예제로 배우는 파이썬 프로그래밍' 카테고리의 다른 글

내장클래스  (0) 2023.03.13
객체지향 기법  (0) 2023.03.12
프로그램 블록 만들기 연습문제  (0) 2023.03.10
재귀함수(Recursive function)  (0) 2023.03.09
중첩함수  (0) 2023.03.08