Coding & Programming/Python 기초(A-Z)

[Python:파이썬:기초] 16. 클래스와 객체(Classes, Objects) 생성하기

mainCodes 2021. 5. 25. 21:59

[Python:파이썬:기초] 16. 클래스와 객체(Classes, Objects) 생성하기

 

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

파이썬은 객체지향 언어(Object Oriented Programming Language)입니다. 그래서 클래스를 지원하며 클래스를 이용하여 객체(Object)를 생성할 수 있어요. 다음 클래스의 기본 구조로 클래스는 기본적으로 변수와 메소드(함수)를 포함해요.

class 클래스명:
    클래스 변수
    ...
    def __init__(self, 파라미터):  #메소드(함수)
        self.변수 = 파라미터
        코드1      
        ...


    def 메소드명:
        코드2
        ...

 

클래스는 객체지향 프로그래밍 언어의 기본적인 사용자 정의 자료형(user defined data type)이며 같은 종류의 어떤 문제를 해결하기 위해 변수, 메소드(함수) 등을 그룹 지어 놓은 것입니다. 클래스에 포함된 함수를 메소드라고 부르며 일반 함수와 동일하다고 생각하면 됩니다.

 

다음 예제는 단순한 클래스 정의 부터 생성자, 메소드 등을 포함하는 클래스에 대한 정의와 객체를 생성하는 방법을 포함합니다.

 

🔗 클래스 정의 및 객체 생성 예제(Example):

 
class testClass1:
    a = 10  #클래스 변수
    b = 20  #클래스 변수
    
#객체(변수) 생성    
tc1_1 = testClass1()
tc1_2 = testClass1()
print("객체 변수 tc1.a = ", tc1_1.a) #마침표(.)를 사용하여 클래스 변수 참조  
print("객체 변수 tc1.b = ", tc1_1.b) #마침표(.)를 사용하여 클래스 변수 참조     
 
testClass1.a = 200 #클래스 변수값 변경
print("클래스 변수 a = ", testClass1.a)
print("객체 변수 tc1.a = ", tc1_1.a) #객체를 통해 변경된 값 확인
print("객체 변수 ttt.a = ", tc1_2.a) #객체를 통해 변경된 값 확인
 
# --------------------------------
# 생성자 __init__() 포함된 클래스
class testClass2:
    #생성자
    def __init__(self, a, b):
        self.a = a
        self.b = b
        
#2개 파라미터(매개변수)를 이용하여 객체(변수) 생성
#100, 200은 각각 생성자의 a, b로 전달
tc2 = testClass2(100200)        
print(tc2.a)    
print(tc2.b)
 
# --------------------------------
# 메소드가 포함된 클래스
class testClass3:
    #생성자
    def __init__(self, a, b):
        self.a = a
        self.b = b
        
    #메소드 선언    
    def setVariables(self, a, b):
        self.a = a
        self.b = b    
        
    #메소드 선언            
    def add(self):
        return self.a + self.b
    
    #메소드 선언        
    def sub(self):
        return self.a - self.b 
    
    #메소드 선언
    def add_print(self):
        print("a+b = "self.add()) #add 메소드 호출
        
    #메소드 선언            
    def sub_print(self):
        print("a-b = "self.sub()) #sub 메소드 호출
 
#객체(변수) 생성        
tc3 = testClass3(150100)        
print(tc3.add())   #메소드 호출
print(tc3.sub())   #메소드 호출
tc3.add_print()    #메소드 호출
tc3.sub_print()    #메소드 호출
 
#클래스 내 변수값 변경
tc3.setVariables(500300)
tc3.add_print()
 
tc3.a = 1000 #변수값 변경
print(tc3.a) 
 
print("tc3  타입은 =", type(tc3))
print("tc3.a  타입은 =", type(tc3.a))
cs

 

class testClass1는 가장 단순한 클래스로 2개의 클래스 변수를 포함하고 있습니다. tc1_1 = testClass1()는 tc1_1이라는 클래스 객체를 생성한 것으로 객체는 클래스 안에 정의된 변수, 함수 등을 참조할 수 있습니다.

tc1_1 = testClass1()

print("객체 변수 tc1.a = ", tc1_1.a)    #마침표(.)를 사용하여 클래스 변수 참조  

print("객체 변수 tc1.b = ", tc1_1.b)    #마침표(.)를 사용하여 클래스 변수 참조  

 

클래스 변수

testClass1에 정의된 a, b 는 클래스 내부에 선언된 클래스 변수입니다. 클래스 마다 필수적으로 선언할 필요는 없습니다. 객체 변수는 선언된 객체별로 독립적으로 값이 유지되는 반면 클래스 변수는 모든 생성된 객체에 동시에 반영됩니다. 그렇기 때문에 예제에서 testClass1 객체인 tc1_1, tc1_2 중 tc1_1.a의 값을 200으로 변경했을 때 tc1_2.a의 값도 함께 변경된 것입니다. 

 

생성자(__init__())

class testClass2는 생성자인 __init__()함수를 포함하고 있는 클래스입니다. 클래스 안에  생성자를 추가하고 싶은 경우에는 __init__()이라는 이름의 함수를 추가하면 됩니다. __init__() 생성자는 클래스 객체 생성 시 자동으로 호출되는 메소드로 클래스 안에서 변수 등을 초기화하는 용도로 사용합니다. 

예제는 tc1_1, tc1_2, tc2, tc3의 객체를 각각 생성하는데 이런 객체들을 각 클래스의 인스턴스(instance)라고 표현합니다. __init__()함수나 각 메소드들의 첫 번째 파라미터가 self로 되어 있는데 이 파라미터에는 호출한 객체가 전달됩니다. 따라서 파라미터가 없는 메소드를 정의하더라도 sub_print(self)와 같이 self 파라미터를 포함해야 합니다. self라는 이름은 변경이 가능하지만 추천하지는 않습니다.

 

예를 들어, testClass3는 setVariables(self, a, b)라는 메소드가 정의되어 있는데 tc3.setVariables(500, 300)이라고 호출되면 self에는 tc3이라는 객체가 전달되고 a에는 500, b에는 300이라는 값이 전달됩니다.  이는 파이썬 클래스의 고유 특징으로 self 파라미터는 객체가 클래스의 인스턴스 참조와 클래스안의 변수에 접근할 때 사용되는 것으로 생각하면 됩니다.

 

🔗 실행결과(Output):

이상 JollyTree였습니다 (•̀ᴗ•́)و