python 상속, 오버로딩

강정우·2022년 7월 20일
0

python

목록 보기
12/13
post-thumbnail

상속

  • 다른 클래스의 변수나 함수를 사용할 수 있도록 해주는 것.
  • java의 extends 포지션 하지만 java와 다르게 python은 다중상속이 가능함.

1. 클래스 상속

  • super class의 field value와 method를 sub class에 물려주는 것.
  • python은 C++과 같이 다중상속이 가능한 언어
  • 여기서 단점은 같은 method나 field값이 있을 때 어디서 오는지 모르게 됨.

인스턴스화 후 상속

# 상위 클래스 정의
class CarClass:
    speed = 0
    
    def drive(self):
        print("운전 : ", self.speed)
        
# 상속을 받지 않고 다른 클래스에 접근 
class TaxiClass:
    c = CarClass()
    c.speed = 100
    
    c.drive()
  • 객체를 인스턴스화에서 접근, c는 instance이다.

일반 상속

# super class
class CarClass:
    speed = 0
    
    def drive(self):
        print("운전 : ", self.speed)

# sub class
class TaxiClass2(CarClass):
    def __init__(self, speed):
        self.speed = speed
        
# sub class의 객체 생성
tc = TaxiClass2(200)
tc.drive()
  • 본인에게 없는 method도 사용 가능하다.

다중 상속

# super class 1
class CarClass:
    speed = 0
    
    def drive(self):
        print("운전 1 : ", self.speed)
        
# super class 2        
class CarClass2:
    def stop(self):
        print("정지")
        
    def drive(self):
        print("운전 2 : ", self.speed)        
        
# 다중 상속을 받은 sub class 생성        
class TaxiClass3(CarClass, CarClass2):
    def __init__(self, speed):
        self.speed = speed        
  • 상속 순서에 따라 달라진다.
  • 다중상속받는 클래스에 동일한 변수나 함수가 있는 경우 먼저 상속받는 클래스의 변수나 함수를 실행.
  • 즉, 순서를 막 적으면 안 되고 우선시 되는 super class부터 상속해야 한다.

추가

  • super class에 있는 생성자들은 객체를 생성하기위해 존재함 하지만 우리는 이것을 상속을 받아 자원을 끌어다 쓰기 위함이지 생성자를 굳이 생성할 필요가 없다. 따라서 __init__은 꼭 써야하는 method가 아니다.
  • class 별로 data만 저장하는 class, method만 저장하는 클래스 이렇게 나눠서 관리해도 좋은 방법 중 하나이다.

DAO(Data Access Object)

데이터베이스의 data에 접근하기 위한 객체입니다. DataBase에 접근 하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용합니다.

DTO(Data Transfer Object)

계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)입니다.

  • 유저가 입력한 데이터를 DB에 넣는 과정을 보겠습니다.
  • 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송합니다.
  • 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣습니다.

VO(Value Object)

값 오브젝트로써 값을 위해 쓰입니다. read-Only 특징(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)을 가집니다.
DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있습니다.

2. 연산자 오버로딩

  • 거의 안 쓰임

3. 접근제한자의 상속

  • 결론부터 말하면 불가.
# 접근 제한자는 상속이 안 된다 즉 java의 private와 같은 개념이다.

class Class1:
    __name ="고길동"
    
class TestClass(Class1):
    pass

tc = TestClass()
print(tc.__name)
  • 따라서 getter, setter method를 이용하여 접근.
class Class1:
    __name ="고길동"
    
    def getName(self):
        return self.__name
    
class TestClass(Class1):
    pass

tc = TestClass()
print(tc.getName())
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글