연산자 중복 (Operator Overloading)
이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
                        잔재미코딩 소식 공유
				좀더 제약없이, IT 컨텐츠를 공유하고자, 자체 온라인 강의 사이트와 유투브 채널을
					오픈하였습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
				
				응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
●  잔재미코딩 유투브 오픈
					[구독해보기]
				
			9. 연산자 중복 정의(Operator Overloading)¶
- 객체에서 필요한 연산자를 재정의하는 것
- 연산자 중복을 위해 미리 정의된 특별한 메서드 존재: __로 시작 __로 끝나는 특수 함수
- 해당 메쏘드들을 구현하면, 객체에 여러가지 파이썬 내장 함수나 연산자를 재정의하여 사용 가능
- https://docs.python.org/3/reference/datamodel.html
Quadrangle + Figure = Quadrangle(widths, heights)¶
In [7]:
class Figure:
    def __init__(self, width, height):
        self.width = width
        self.height = height        
In [8]:
class Quadrangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    def __add__(self, second):    
        return Quadrangle(self.width + second.width, self.height + second.height)
In [9]:
rectangle1 = Quadrangle(2, 3)
figure1 = Figure(3, 4)
rectangle2 = rectangle1 + figure1
rectangle2.width
Out[9]:
In [16]:
class Quadrangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    def __add__(self, second):    
        return Quadrangle(self.width + second, self.height + second)
    
    # 연산자 곱셈    
    def __mul__(self, num):
        return Quadrangle(self.width * num, self.height * num)
    # 연산자 len() - 길이    
    def __len__(self):
        return self.width * 2 + self.height * 2
    # 연산자 A[index] - 리스트    
    def __getitem__(self, index):
        if index == 0:
            return self.width
        elif index == 1:
            return self.height
    # 연산자 str() - 문자열 변환           
    def __str__(self):
        return 'width : {}, height : {}'.format(self.width, self.height)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
                                                체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
                                            
초간단 연습11
아래 코드를 실행시키면서, 출력 값이 왜 이렇게 나왔는지 이해하기(연산자 오버로딩 이해)
아래 코드를 실행시키면서, 출력 값이 왜 이렇게 나왔는지 이해하기(연산자 오버로딩 이해)
rectangle1 = Quadrangle(2, 3) rectangle3 = rectangle1 + 4 print (rectangle3.width) print(rectangle3.width, rectangle3.height) rectangle4 = rectangle1 * 3 print(str(rectangle1)) print(str(rectangle4)) print(len(rectangle1))
객체 주소 확인하기와 is, == 연산자 이해하기 (심화)¶
- id(객체명): 객체가 가리키는 실제 주소값 
- ** is 와 == 연산자 차이** 
- is : 가리키는 객체 자체가 같은 경우 True
- == : 가리키는 값들이 같은 경우 True
In [137]:
class Figure(Quadrangle):
    pass
rectangle1 = Quadrangle(1, 2)
rectangle2 = Quadrangle(1, 2)
rectangle3 = rectangle1
print (id(rectangle1))
print (id(rectangle2))
print(rectangle1 is rectangle2)
print(rectangle1 is rectangle3)
print(rectangle1 == rectangle2)
print(rectangle1.width == rectangle2.width)
한발짝 더 나가보기!(심화 문제)
아래 코드를 실행시키면서, 위 코드 결과와 비교하며, 출력 값이 왜 이렇게 나왔는지 이해하기(연산자 오버로딩 이해)
아래 코드를 실행시키면서, 위 코드 결과와 비교하며, 출력 값이 왜 이렇게 나왔는지 이해하기(연산자 오버로딩 이해)
In [138]:
class Figure(Quadrangle):
    # 연산자 == 
    def __eq__(self, p):
        if ((self.width == p.width) and (self.height == p.height)):
            return True
        else:
            return False
rectangle1 = Figure(1, 2)
rectangle2 = Figure(1, 2)
rectangle3 = rectangle1
print (id(rectangle1))
print (id(rectangle2))
print(rectangle1 is rectangle2)
print(rectangle1 is rectangle3)
print(rectangle1 == rectangle2)
print(rectangle1.width == rectangle2.width)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
                                                가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
                                            
협업 과제(남에게 설명하면, 자신이 배운답니다.!)
2. 영어 단어 길이를 기준으로 리스트를 정렬하기
- \__len\__(self) 정의하기
- sorted 함수와 lambda 로 길이 순 정렬 기법
3. 영어 단어의 두 번째 알파벳을 기준으로 리스트를 정렬하기
- \__getitem\__(self, key) 정의하기
- 참고: sorted 함수와 lambda 로 리스트 정렬 기법
- 구글로 필요한 부분을 찾는 역량을 길러야 합니다. https://wayhome25.github.io/python/2017/03/07/key-function/
사전조건: Keyword 클래스를 생성
- 클래스 인자로 영어 단어 한 개를 받습니다.
- attribute: 영어 단어 
- method: 연산자 오버로딩 - len() : 영어 단어 길이 리턴 
프로그래밍
- Keyword 클래스로 10개의 임의 영어 단어를 가지고 각각 객체로 만들어서 하나의 리스트에 넣습니다.(위 예 참조)
2. 영어 단어 길이를 기준으로 리스트를 정렬하기
- \__len\__(self) 정의하기
- sorted 함수와 lambda 로 길이 순 정렬 기법
3. 영어 단어의 두 번째 알파벳을 기준으로 리스트를 정렬하기
- \__getitem\__(self, key) 정의하기
- 참고: sorted 함수와 lambda 로 리스트 정렬 기법
- 구글로 필요한 부분을 찾는 역량을 길러야 합니다. https://wayhome25.github.io/python/2017/03/07/key-function/
리스트변수명 = sorted(리스트변수명, key=lambda x:len(x))
In [104]:
class Keyword:
    def __init__(self, word):
        self.word = word
    # 연산자 len() - 길이    
    def __len__(self):
        return len(self.word)
    # 연산자 A[index] - 리스트    
    def __getitem__(self, index):
        return self.word[index]
    def get_word(self):
        return self.word
hi = Keyword('hi')
hello = Keyword('hello')
bye = Keyword('bye')
len(hi)
keywords = [hi, hello, bye]
keywords = sorted(keywords, key=lambda x:len(x))
for keyword in keywords:
    print (keyword.get_word())
keywords = sorted(keywords, key=lambda x:x[1])
for keyword in keywords:
    print (keyword.get_word())
In [249]:
class Keyword:
    def __init__(self, word):
        self.keyword = word
    def __len__(self):
        return len(self.keyword)
key1 = Keyword('hi')
key2 = Keyword('hello')
key3 = Keyword('bye')
In [250]:
keywords = [key1, key2, key3]
keywords = sorted(keywords, key=lambda x:len(x))
for keyword in keywords:
    print (keyword.keyword)
In [251]:
class Keyword:
    def __init__(self, word):
        self.keyword = word
    def __getitem__(self, index):
        return self.keyword[index]
key1 = Keyword('hi')
key2 = Keyword('hello')
key3 = Keyword('bye')
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
                                                체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
                                            In [252]:
keywords = [key1, key2, key3]
keywords = sorted(keywords, key=lambda x:x[1])
for keyword in keywords:
    print (keyword.keyword)
 
                                                    