Language/Python

Python - 클래스

괘창 2024. 5. 7. 22:39

● 클래스(class) 와 객체

https://wikidocs.net/28 참고

 

과자 틀 = 클래스
과자 틀로 찍어 낸 과자 = 객체

 

객체 지향언어는 클래스를 가지고 있다. 

클래스라는 틀을 통해서 객체를 생성하게 된다.
많이 사용하는 기능을 클래스로 정의하여 코드의 재사용성을 높인다. 
클래스를 통해서 생성된 객체들은 각각 독립적이다.

** instace : 메모리에 생성된 객체

 

객체와 인스턴스의 차이

클래스로 만든 객체를 '인스턴스'라고도 한다.

객체와 인스턴스의 차이는 무엇일까?
a = Cookie()로 만든 a는 객체이고 a 객체는 Cookie의 인스턴스다.
즉, 인스턴스는 객체(a)가 어떤 클래스(Cookie)의 관계 위주로 설명할 때 사용한다.
a = Cookie의 경우 'a는 Cookie의 인스턴스'라 표현

클래스 예시)

** Calculator 클래스로 만든 계산기로 결과값과 상관 없이 독립적인 값을 유지한다.

** 계산기 대수가 늘어나도 객체를 생성하면 되기 때문에 간단하게 프로그램 작성이 가능하다.


- 사칙연산 클래스 만들기

- 함수를 만들 때 소스 코드 작성 방법
def 함수이름(매개변수):
      수행문
      ...

 

class FourCal:
   def setdata(self, first, second):     #메소드 매개 변수
      self.first = first                               # 메소드 수행문
      self.second = second                   # 메소드 수행문

** 클래스 안에 구현된 함수는 메소드(method)라 한다.
** setdata 메소드는 매개변수로 self, first, second 3개 입력값을 받는다.
** 메소드의 첫 번째 매개변수 self는 특별한 의미 갖는다.

 


a = FourCal()
a.setdata(4,2)

** 객체를 이용해 클래스의 메소드를 호출하기 위해선 a.setdata(4,2)와 같이 도트(.) 연산자 사용 필요

 

※ setdata 메소드에는 self, first, second 총 3개의 매개 변수가 필요하나 실제로 전달된 값은 a.setdata(4,2)처럼

2개의 값만 전달하였는데 사유는 아래 이미지를 확인하면 쉽게 알 수 있다.

https://wikidocs.net/28 참고

**  a.setdata(4,2)는 첫 번째 매개변수 self에 setdata 메소드를 호출한 객체 a가 자동으로 전달 된다.

** self가 아닌 다름 이름을 사용해도 상관 없다.


https://wikidocs.net/28 참고

 

** FourCal클래스 : 두 수를 입력 받아서 , + - * / 를 처리하고 리턴하는 역할

1. 두수를 입력받는 메소드  setData(a,b)
2. + 연산을 처리하는 메소드 add()
3.  - 연산을 처리하는 메소드 sub()
4.  * 연산을 처리하는 메소드 mul()
5.  / 연산을 처리한느 메소드 div()

 

class FourCal:
     def setdata(self, first, second):
         self.first = first # 자바의 this.first = first 같은 개념
         self.second = second
     def add(self):
         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() #FourCal클래스 타입의 객체 생성
b = FourCal()
a.setdata(4, 2) #(self=a객체, first=4, second=2)
b.setdata(3, 8)

a.mul()

● 생성자

객체가 생성될 때 딱 한 번 동작하여 객체를 생성시키는 메소드
생성자가 하는 역할 : 멤버변수의 초기화, 부모 클래스의 초기화 호출

 

class FourCal:		
    def __init__(self, first, second): #생성자  __init__(self, 매개변수):
        self.first = first
        self.second = second
    def setData(self, first, second):
        self.first = first # 자바의 this.first = first 같은 개념
        self.second = second
    def add(self):
        result = self.first + self.second # result = a.first 4 + a.second 2
        return result # 6
    def sub(self):
        result = self.first - self.second 
        return result
    def mul(self):
        result = self.first * self.second
        return result
    def div(self):
        result = self.first / self.second
        return result

a = FourCal(4,2)
a.add() # 6
a.setData(8,4)
a.add() # 12

** __init__ 메소드의 매개변수에도 self, first, second 값이 전달되어야 한다.


- 자바 클래스 이름과 동일한 리턴형이 없는 메서드
   

 pulbic FourCal(int first, int second){
        this.first = first;
        this.second = second;
    }


● 클래스의 상속

상속(Inheritance)이란 '물려받다'란 뜻으로 '재산을 상속받다'와 같은 의미
class 클래스명(상속할 클래스명)

 

class MoreFourCal(FourCal):
	    def pow(self):
	        result = self.first ** self.second ##제곱
	        return result
a = MoreFourCal(4, 2)
a.pow()+

** 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.


● 메소드 오버라이딩

부모 클래스(상속한 클래스)에 있는 메소드를 동일한 이름으로 다시 만드는 것
즉 부모의 메소드를 자식의 필요에 맞게 메소드를 재정의 하는 방법
** 함수의 구현부만 다르게 정의한다.

 

class SafeFourCal(FourCal):	
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second
a = SafeFourCal(4,0)
a.div() # 0

** 0으로 나눌 경우 기본적으로 ZeroDivisionError가 발생하나,

if self.second==0: return 0 으로 인해 오류가 발생하지 않고 0값 리턴