[Python] 클래스 (1)

ㅎㅎ·2021년 5월 20일
0

Python

목록 보기
15/27




📌 클래스(class)

  • 클래스 - 붕어빵틀, 객체 - 붕어빵
  • 즉, 객체는 붕어빵틀에 의해 만들어진 피조물(붕어빵)을 말한다. 이때 중요한 특징은 각 객체마다 고유한 성격을 가지며 동일하 클래스도 만든 객체들은 서로에게 영향을 끼치지 않는다.
>>> class Cookie: #클래스 
>>>    pass

>>> a = Cookie()
>>> b = Cookie()

➡️ 위 코드의 클래스는 아무 기능도 갖고 있지 않지만, 클래스이므로 객체를 만드는 기능을 가지고 있다. 클래스 Cookie()의 결과값을 돌려받은 ab가 바로 객체이다.

- 객체와 인스턴스의 차이

  • 클래스로 만든 객체를 인스턴스라고도 한다. 이때 객체와 인스턴스의 차이는? Cookie() 로 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다. 즉, 인스턴스라는 말은 특정 객체(a)가 어떤 클래스의 객체인지를 관계 위주로 설명할때 사용한다. 'a는 인스턴스'보다 'a는 객체'라는 표현이 어울리며, 'a는 Cookie의 객체'보다는 'a는 Cookie의 인스턴스'라는 표현이 더 잘 어울린다.

📌 클래스 만들기

- 1. 클래스 구상하기

  • 클래스를 만들 때는 클래스로 만든 객체를 중심으로 어떤 식으로 동작하게 할것인지 미리 구상을 해야한다.

- 2. 클래스 구조 만들기

  • 제일 먼저 할 일은 a = FourCal()처럼 객체를 만들수 있게 해야한다.
class FourCal(): # 클래스 만들기
    pass

a = FourCal() #a라는 객체를 만듬
print(type(a)) #객체 타입을 출력

# <class '__main__.FourCal'> -> FourCal 클래스 객체임을 확인 

- 3. 객체에 숫자를 지정하기

  • 생성된 객체 a는 아직 아무런 기능을 하지 못한다. 따라서 이제 더하기,빼기,곱하기,나누기 기능을 갖춘 객체를 만들어야한다. 이러한 기능을 갖춘 객체를 만들려면 a 객체에 사칙연산을 할때 사용할 2개의 숫자를 먼저 알려줘야한다. 연산을 수행할 대상 (4,2)를 객체에 지정할수 있게 해보자
a.setdata(4,2) #연산을 수행할 대상
class FourCal():
    # 위 문장을 수행하기 위해 위 코드에서 pass를 빼고 함수를 만듬
    def setdata(self,first,second): # 클래스안의 함수 = 메서드
        self.first = first
        self.second = second

a = FourCal()
print(a)

메서드 - 클래스 안에 구현된 함수를 메서드라고 부른다. 메서드는 클래스에 포함되어 있다는 점만 제외하면 일반 함수와 똑같다.

def 함수명(매개변수):
    수행할 문장
    ...
# 위 코드에서 메서드만 따로 가져옴.
# 클래스안의 함수 = 메서드
def setdata(self, first, second):   # ① 메서드의 매개변수
    self.first = first              # ② 메서드의 수행문
    self.second = second            # ② 메서드의 수행문

3-1) setdata 메서드의 매개변수

  • 위의 매서드의 매개변수는 self,first,second로 3개의 입력값을 가지고 있는데, 일반 함수와는 달리 메서드의 첫 번째 매개변수 self는 특별한 의미를 가진다.
class FourCal():
    def setdata(self,first,second): # 클래스안의 함수 = 메서드
        self.first = first
        self.second = second

a = FourCal() # a객체를 만들고, 
a.setdata(4, 2) # a객체를 통해 setdat메서드 호출 
# 객체를 통해 클래스의 메서드를 호출하려면 a.setdata(4,2)와 가이 도트(.)연산자를 이용해야함.


# but, setdata의 매개변수는 3개인데 두개만 전달함
# 그 이유는 a.setdata(4,2)처럼 호출하면 self에는 setdata메서드를 호출한 객체 a가 자동으로 전달된다. 
#따라서 관례적으로 파이썬 메서드의 첫 번째 매개변수이름은 객체를 호출할때 호출한 객체 자신이 전달되기 때문에 self를 사용한다. 

3-2) setdata 메서드의 수행문

  • a.setdata(4,2)처럼 호출하면 매개변수 first,second에 각각 4와 2가 전달된다.
self.first = 4
self.second = 2

# self는 전달된 객체 a이므로 이렇게 해석
a.fisrst = 4
a.second = 2

➡️ a.first = 4가 수행되면 a 객체에 객체변수 first가 생성되고 값 4가 저장된다. 마찬가지로 a.second= 2 문장이 수행되면 a객체에 객채변수 second가 생성되고 값 2가 저장된다.
(여기서 객체에 생성되는 객체만의 변수를 객체변수라고 부른다.)

# 확인하면 생성되었음을 확인할 수 있음. 
a = FourCal()
a.setdata(4, 2) #a객체를 통해 setdata메서드 호출 
print(a.first) #4
print(a.second) #2

➡️ 확인하면 a객체에 객체변수 first와 second가 생성되었음을 확인할 수 있다.

  • 이번에는 a와 b객체를 만들어보면
class FourCal():
    def setdata(self,first,second): # 클래스안의 함수 = 메서드
        self.first = first
        self.second = second

# a,b 객체 만들기 
a = FourCal()
b = FourCal()

a.setdata(4,2) 
print(a.first)# a객체의 객체변수 first 생성 #4
b.setdata(3,7)
print(b.first) #b객체의 객체변수 first 생성  #3

➡️ 이때 a.first는 4, b.first는 3으로 a객체의 first 값는 b 객체의 first값에 영향받지 않고 원래 값을 유지하고 있음을 확인할 수 있다. 즉! 클래스로 만든 객체의 객체변수는 다른 객체의 객체변수에 상관없이 독립적인 값을 유지한다.

  • id 함수를 사용해 객체변수가 독립적인 값을 유지한다는 점을 확인할 수 있다.
class FourCal():
    def setdata(self,first,second): # 클래스안의 함수 = 메서드
        self.first = first
        self.second = second


# id함수(객체의 주소를 돌려주는 파이썬 내장함수)사용하기
a = FourCal()
b = FourCal()
a.setdata(4,2)
b.setdata(3,7)
print(id(a.first))
print(id(b.first))

# 결과 -다른 주소를 보여줌. 

➡️ 이렇게 a 객체의 first 주소값과 b객체의 first 주소값이 서로 다르므로 각각 다른 곳에 그 값이 저장된다는 것을 알 수 있다. 객체변수는 그 객체 고유 값을 저장할 수 있는 공간이다. 즉 객체 변수는 다른 객체들 영향을 받지 않고 독립적으로 그 값을 유지한다. 꼭 기억하자!

- 4. 더하기 기능 만들기

  • 위에서 2개의 숫자값을 설정했으니 2개의 숫자를 더하는 기능을 클래스에 추가해야 한다. 밑의 코드의 연산이 가능한 클래스를 만들어야한다.
#이 연산이 가능하도록 해야함.
a = FourCal()
a.setdata(4,2)
print(a.add())
class FourCal():
    def setdata(self,first,second): # 클래스안의 함수 = 메서드
        self.first = first
        self.second = second
    def add(self): #add 메서드를 새로 만듬 
        result = self.first + self.second
        return result

➡️ 클래스 안에 add 메서드를 추가해주면, 위 코드를 실행했을 때 값 6이 출력된다. 출력되는 과정을 설명하면 add 메서드의 매개변수는 self이고 반환값은 result이다. a.add()와 같이 a 객체에 의해 메서드가 수행되면 add메서드의 self에는 객체 a가 자동으로 입력되므로 result = a.first + a.second같이 실행이 되고, 그 전에 a.setdata(4,2)에 의해 a.first = 4, a.second = 2라고 이미 설정되었기때문에 resulr = 4+2 가 되고 따라서 결국 6을 돌려준다.

- 5. 곱하기,빼기,나누기 기능 만들기

  • 위의 더하기 기능을 만든 것처럼 나머지 기능을 넣어주고 확인한다.
class FourCal(): # 클래스를 톧해 객체가 생기고 
    def setdata(self,first,second): # 객체에 숫자를 지정
        self.first = first # 객체변수가 생기고 
        self.second = second
    def add(self): # 객체 a가 입력되고
        result = self.first + self.second #위에서 입력된 숫자가 출력!!
        return result
    def mul(self): 
        result = self.first * self.second
        return result
    def sub(self): 
        result = self.first - self.second
        return result
    def div(self): 
        result = self.first / self.second
        return result


#동작하는지 확인하기
a = FourCal() # a객체 만들기
b = FourCal() # b객체 만들기
a.setdata(4,2) # 객체에 숫자 지정
b.setdata(3,9) # 객체에 숫자 지정

print(a.add()) #더하기 
print(a.sub()) #곱하기

print(b.add()) #더하기
print(b.div()) #나누기

0개의 댓글