language/Python

[python] 클래스(class), 객체(object), 인스턴스(instance), 매개변수 self, 생성자(constructor), 상속(inheritance), 오버라이딩(overriding)

스파이디웹 2021. 11. 29. 10:53
728x90

1. 클래스란(class)?

  • python은 객체지향을 지원하고, 함수형 프로그래밍도 가능한 언어
  • class는 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의
  • *객체를 정의하기 위한 상태(*멤버 변수)와 *메서드(함수)로 구성

함수와 비교했을 때, 클래스 사용의 장점

  • 함수가 점차적으로 늘어 나게 된다면 무슨 역할을 하는지 의미를 파악하기 어려워지므로, 클래스를 통해 메소드를 구현하게 되면, 비슷한 역할을 하는 것을 한 곳에 모을 수 있게됨
  • 재사용이 가능하다는 것이 가장 큰 장점

*객체 vs 인스턴스

  • 객체란 클래스로 규정된 인스턴스, 변수 대신 실제값을 가짐
  • 인스턴스란 클래스로 만든 객체
  • 인스턴스는 특정 객체가 어떤 클래스의 객체인지를 관계 위주로 설명할 때 사용
  • a = Cookie() 에서 a는 객체, a객체는 Cookie의 인스턴스

*멤버 변수란

  • 특정 객체와 연결된 변수의 하나, 해당 변수의 모든 메소드(멤버 함수)에 접근이 가능
  • 클래스 기반 언어에서는 2종류로 구별
  • 클래스 변수(정적 멤버 변수): 모든 인스턴스의 클래스와 공유되는 변수의 사본이 하나만 있는 경우
  • 인스턴스 변수: 클래스의 각 인스턴스가 자신만의 변수 복사본을 소유하고 있는 경우

*메소드란

  • 클래스 내에 구현된 함수
  • 일반 함수와 기능적으로 다를 것이 없다.
  • 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용
  • 객체를 호출할 때 호출한 자신이 전달되기 때문에 self라는 관례적인 이름을 사용, (다른 이름을 사용해도 상관x)
  • #다음과 같이 클래스를 통해 메소드를 호출할 수도 있음
    #하지만 클래스 이름.메소드 형태로 호출할 때는 객체 a를 첫 번째 매개변수 self에 꼭 전달해야 함
    객체 = 클래스()
    클래스.메소드(객체, 인수1, 인수2)
    
    #반면에 객체.메소드 형태로 호출할 때는 self를 반드시 생략해서 호출해야 함
    객체 = 클래스()
    객체.메소드(인수1, 인수2)

2. 생성자란(constructor)?

  • 객체에 초깃값을 설정해야 할 필요가 있을 때 생성자로 구현
  • 객체가 생성될 때 자동으로 호출되는 메서드
  • __init__(self, 매개변수1, 매개변수2, ...):
        self.매개변수1 = 매개변수1
        self.매개변수2 = 매개변수2
        print("객체 초기화완료")


3. 상속이란(Inheritance)?

  • 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만듬
  • 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용
  • 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황일 때 사용
class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second

    def setdata(self, first, second):
        self.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


class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result


a = MoreFourCal(4, 2)
print(a.pow())
#>> 16 출력

4. 메소드 오버라이딩(method overriding)

  • 부모 클래스(상속한 클래스)에 있는 메소드를 동일한 이름으로 다른 기능으로 구현하는 것(덮어쓰기)
  • 부모 클래스의 메소드 대신 오버라이딩한 메소드가 호출됨
class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second
    def setdata(self, first, second):
        self.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

class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:  # 나누는 값이 0인 경우 0을 리턴하도록 수정
            return 0
        else:
            return self.first / self.second

a = SafeFourCal(4, 0)
print(a.div())
#>> 0출력

참조:

https://wikidocs.net/28

https://wikidocs.net/16071

https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9E%98%EC%8A%A4_(%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D) 

 

728x90