BACK END/Python

4일(10.07) 파일입출력 과제풀이, 클래스

라미보 2022. 10. 7. 12:45

 

 

 

💻08_파일입출력

💾Ex05_허보람.py

 

 

아래와 같이 콘솔창에서 입력하고 출력할 수 있도록 한다.

 

 

메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 1
단어 :sky
뜻:하늘
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 1
단어 :snow
뜻:눈
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 5
단어/뜻
cat/고양이
sky/하늘
snow/눈
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 2
검색할 단어 :sky
sky 의 뜻 :  하늘

메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 2
검색할 단어 :desk
찾는 단어 없음

메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 3
수정할 단어 입력 : dd
수정할 단어 없음

메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 3
수정할 단어 입력 : sky
수정할 뜻 입력 : 땅
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 4
삭제할 단어 입력 : aa

삭제할 단어 없음

메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 4
삭제할 단어 입력 : snow

메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 5
단어/뜻
cat/고양이
sky/땅
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 7
1~6만 입력 가능

메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >> 6
프로그램 종료

 

#_*_coding:utf-8
'''
Created on 2022. 10. 6.

@author: admin
'''

#Ex05_허보람.py

#scanner input 사용입력, 입력한 값을 사전에 등록한다.(파일에 추가), 출력누르면 파일에 있는것 콘솔창에 보여주기, 수정을 누르면 수정되어서 파일에서 바뀐다. 삭제할 단어를 입력하면 파일에서 지워진다.

#swich-case문 사용?, dict, 'a'mode로 수정, remove로 삭제?

'''
내가 한것

d={}

while True:
    print()
    num = int(input('메뉴션택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >>'))
    
    if num == 1 :
        word = input('단어: ')
        mean = input('뜻: ')
        d[word]=mean
            
    elif num == 2:
        word =input('검색할 단어:')
        if d.get(word) != None:
            print(word ,'의 뜻 :', d.get(word))
        else :
            print('찾는 단어 없음')
    
    elif num == 3:
        word = input('수정할 단어: ')
        if word in d :
            mean = input('수정할 뜻: ')
            d[word]=mean
        else :
            print('수정할 단어 없음')
            
            
    elif num == 4:
        word = input('삭제할 단어: ')
        if word in d :
            del d[word]
        else :
            print('삭제할 단어 없음')
    
    
    
    elif num == 5:
        if len(d) != 0:
            print('단어 뜻:')
        for i,j in d.items():
            print(i,'', j)
        else :
            print('입력한 단어 없음')   
      
        
    elif num ==6:
        print('종료')
        break
    
    else :
        print('1~6까지 입력하세요.')

    fw = open('dict.txt','a')
    for i,j in d.items() :
        fw.write(i+' '+j+'\n')
        print(i+' '+j) 
    fw.close()

print('프로그램을 종료합니다.')
'''


#풀이
while True:
    num = int(input('메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >>'))
    
    if num == 1:
        f = open('word.txt','a')
        word = input('단어:')
        mean = input('뜻:')
        f.write(word+"/"+mean+"\n")
        f.close()
        
    elif num == 2: 
        flag = False
        search_word = input('검색할 단어:')
        f = open('word.txt','r')#읽기 위한 오픈
        for line in f:
            line_split = line.split('/') #'/'로 구분되어서 리스트형태로 나온다.
            # print(line_split)
            if line_split[0] == search_word :
                print(search_word,'의 뜻:',line_split[1])
                flag = True
                
        #여기
        if flag == False :
            print('찾는 단어 없음')
                
        f.close()


    #한쌍(key,value)으로 처리할때는 사전으로 처리하는것이 편하다
    elif num == 3: # 수정
        list_word=[] #단어만 넣는다.['rose','cat','desk']
        list_mean=[] #뜻만 넣는다.['장미'~]
        f = open('word.txt','r') #먼저 전체 읽어온다.
        for line in f :
            line_split = line.split('/') #[rose, 장미 \n] 방 2개짜리 리스트가 생긴다.
            list_word.append(line_split[0]) # ['rose','cat','desk']
            list_mean.append(line_split[1].strip()) # ['장미'~] '/'로 분리시켜서 list_mean에 넣는다.
            
            d = dict(zip(list_word,list_mean)) #zip이라는 함수로 묶어서 dict함수를 사용해서 사전으로 만든다.
            print('d:',d)
        
     #사전에서 수정할 단어를 찾는다.
        update_word = input('수정할 단어 입력:')
        
        if d.get(update_word) == None:
            print('수정할 단어 없음')
            continue #수정할 단어 없으면 밑에를 만나면 안되므로 continue 를 사용하여 멈추도록 한다.
            
        update_mean = input('수정할 뜻 입력:')
        d[update_word] = update_mean
        f = open('word.txt','w')
        for k in d : #key만 반복해서 들어간다.
            f.write(k+'/'+d[k]+'\n')            
        f.close()
    
    elif num == 4: # 삭제
        list_word=[] # ['rose','cat','desk']
        list_mean=[] # ['장미'~]
        f = open('word.txt','r') 
        for line in f :
            line_split = line.split('/')
            list_word.append(line_split[0]) # ['rose','cat','desk'] # ['rose','cat','desk'] 단어를 분리하여 list_word에 넣는다.
            list_mean.append(line_split[1].strip()) # ['장미'~] '/'로 분리시켜서 list_mean에 넣는다.
            
            d = dict(zip(list_word,list_mean)) #{rose:장미}
        
        delete_word = input('삭제할 단어 입력:')
        if d.get(delete_word) == None :
            print('삭제할 단어 없음')
            continue #삭제할 단어가 없는데 삭제하는함수를 만나면 안돼므로 continue를 사용한다.
            
        del d[delete_word]
        
        f = open('word.txt','w')
        for k in d :
            f.write(k+'/'+d[k]+'\n')            
        f.close()
           
    elif num == 5:  
        f = open('word.txt','r')
        print('단어/뜻')
        
        for line in f : #[rose/장미, cat/고양이, dog/개]
     #[단어/뜻, 단어/뜻..] 이런식으로 리스트형태로 넘어온다. f는 readline이 생략 되어있다.
            #line에 단어/뜻 하나가 들어온다.
            print(line,end='')
        
        f.close()
        
    elif num == 6:
        print('프로그램 종료')
        break
    else:
        print('1~6만 입력 가능')

 

 

 

 

 

while True:
    num = int(input('메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >>'))
    

- if num == '1' : 

1을 문자열로 했다면, 

num = input('메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력,  6:종료) >>') 

이렇게 해도 된다.


    if num == 1:
        f = open('word.txt','a')  -쓰기위한 파일을 연다. 추가가 되어야 하므로 'a' mode를 쓴다.
        word = input('단어:')
        mean = input('뜻:')
        f.write(word+"/"+mean+"\n")
        f.close()
        
    elif num == 2: 
        flag = False
        search_word = input('검색할 단어:')
        f = open('word.txt','r') - 읽기 위한 오픈
        for line in f:
            line_split = line.split('/')   -  '/'로 구분되어서 리스트형태로 나온다.
            # print(line_split)
            if line_split[0] == search_word :
                print(search_word,'의 뜻:',line_split[1])
                flag = True
                
        - 여기 for문이 끝나고 작성한다. 반복문 안에 작성하면 안된다.
        if flag == False :
            print('찾는 단어 없음')
                
        f.close()


    - 한쌍(key,value)으로 처리할때는 사전으로 처리하는것이 편하다
    elif num == 3: # 수정
        list_word=[] #단어만 넣는다.['rose','cat','desk']
        list_mean=[] #뜻만 넣는다.['장미'~]
        f = open('word.txt','r') #먼저 전체 읽어온다.
        for line in f :
            line_split = line.split('/') #[rose, 장미 \n] 방 2개짜리 리스트가 생긴다.
            list_word.append(line_split[0]) # ['rose','cat','desk']
            list_mean.append(line_split[1].strip()) # ['장미'~] '/'로 분리시켜서 list_mean에 넣는다.
            
            d = dict(zip(list_word,list_mean)) #zip이라는 함수로 묶어서 dict함수를 사용해서 사전으로 만든다.
            print('d:',d)
        
     - 사전에서 수정할 단어를 찾는다.
        update_word = input('수정할 단어 입력:')
        
        if d.get(update_word) == None:
            print('수정할 단어 없음')
            continue #수정할 단어 없으면 밑에를 만나면 안되므로 continue 를 사용하여 멈추도록 한다.
            
        update_mean = input('수정할 뜻 입력:')
        d[update_word] = update_mean
        f = open('word.txt','w')
        for k in d : #key만 반복해서 들어간다.
            f.write(k+'/'+d[k]+'\n')            
        f.close()
    
    elif num == 4:  - 삭제
        list_word=[] # ['rose','cat','desk']
        list_mean=[] # ['장미'~]
        f = open('word.txt','r') 
        for line in f :
            line_split = line.split('/')
            list_word.append(line_split[0]) # ['rose','cat','desk'] # ['rose','cat','desk'] 단어를 분리하여 list_word에 넣는다.
            list_mean.append(line_split[1].strip()) # ['장미'~] '/'로 분리시켜서 list_mean에 넣는다.
            
            d = dict(zip(list_word,list_mean)) #{rose:장미}
        
        delete_word = input('삭제할 단어 입력:')
        if d.get(delete_word) == None :
            print('삭제할 단어 없음')
            continue #삭제할 단어가 없는데 삭제하는함수를 만나면 안돼므로 continue를 사용한다.
            
        del d[delete_word]
        
        f = open('word.txt','w')
        for k in d :
            f.write(k+'/'+d[k]+'\n')            
        f.close()
           
    elif num == 5:  
        f = open('word.txt','r')
        print('단어/뜻')
        
        for line in f : #[rose/장미, cat/고양이, dog/개]
     #[단어/뜻, 단어/뜻..] 이런식으로 리스트형태로 넘어온다. f는 readline이 생략 되어있다.
            #line에 단어/뜻 하나가 들어온다.
            print(line,end='')
        
        f.close()
        
    elif num == 6:
        print('프로그램 종료')
        break
    else:
        print('1~6만 입력 가능')

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

💻09_클래스

💾Ex05

 

#_*_coding:utf-8
'''
Created on 2022. 10. 6.

@author: admin
'''

class Super:
    def __init__(self):
        print("Super init")
    def show(self):
        print("Super show")

#자바와의 차이점은 자바에는 쓰지 않아도 부모의 생성자를 호출하는  super()가 자동으로 생성된다. super의 위치는 항상 맨위 처음에 있어야 한다.
#파이썬에서는 자동으로 생성되지 않으므로 부모의 생성자를 호출하고 싶다면 직접 작성해줘야 한다. super의 위치가 맨위에 있지 않아도 된다.

#class Sub extends Super:
class Sub : # Super는 부모가 되고, Sub는 자식이 된다.
    def __init__(self):
        print("Sub init")
        super().__init__() #숨어있는 object라는 클래스를 상속을 받는다(모든 클래스가 자바처럼) 아무것도 없어서 에러날것이 없다 
        #Super.__init__(self) #부모의 생성자를 호출하려면 작성을 해줘야만 한다. 자동으로 호출안됨, 위치가 맨위에 있지 않아도 된다.
    def show(self):
        Super.show(self) #부모가 물려준 show 를 작성해주면 출력해볼수있다. 부모의 show를 호출해라
        #상속관계가 아니더라도 다른클래스의 메서드를 호출할수있다
        print("Sub show")

class Sub2(Super):
    pass #자기 생성자(Sub2)를 따로 만들지 않으면, 부모생성자가 자동으로 호출이 된다.


class Sub3(Super):
    def __init__(self):
        #Super.__init__(self)
        super().__init__()
        print("Sub3 init")
    def show(self):
        #Super.show(self)
        super().show() #부모의 show를 호출하고싶다. 부모의 super().를 사용해서 생성자나 메서드를 사용할때는 self를 넘기면 안돼고, 부모의 이름을 직접사용 Super. 로 사용할때는 self를 써서 직접 넘겨줘야한다.
        print("Sub3 show")

#super() - 부모의 생성자에 접근하는 방식
#super. -부모의 변수나 부모의 메서드에 접근하는 방식

s3 = Sub3() #객체를 만들면 생성자로 넘어간다.
s3.show()
print()

s1 = Super()
s1.show()
print()

#자식의 생성자가 있으면, 부모의 생성자가 호출이 될 수도 있고 안될수도있다.
s2 = Sub()
s2.show()
print()
#부모가 물려준 생성자와 show() 그리고 자기생성자와 자기show()까지 출려된다

s3 = Sub2() #Super init -부모의생성자가 호출되어 출력된다.
s3.show() #Super show -부모의 show를 호출하여 출력

 

 

 

- 자바와의 차이점은 자바에는 쓰지 않아도 부모의 생성자를 호출하는  super()가 자동으로 생성된다. super의 위치는 항상 맨위 처음에 있어야 한다.
- 파이썬에서는 자동으로 생성되지 않으므로 부모의 생성자를 호출하고 싶다면 직접 작성해줘야 한다. super의 위치가 맨위에 있지 않아도 된다.

 

 

class Super:
    def __init__(self):
        print("Super init")
    def show(self):
        print("Super show")


#class Sub extends Super:
class Sub :   -  Super는 부모가 되고, Sub는 자식이 된다.
    def __init__(self):
        print("Sub init")
        super().__init__()  - 숨어있는 object라는 클래스를 상속을 받는다(모든 클래스가 자바처럼) 아무것도 없어서 에러날것이 없다 
        #Super.__init__(self)   - 부모의 생성자를 호출하려면 작성을 해줘야만 한다. 자동으로 호출안됨, 위치가 맨위에 있지 않아도 된다.
    def show(self):
        Super.show(self)   - 부모가 물려준 show 를 작성해주면 출력해볼수있다. 부모의 show를 호출해라
                                      - 상속관계가 아니더라도 다른클래스의 메서드를 호출할수있다
        print("Sub show")

class Sub2(Super):
    pass     - 자기 생성자(Sub2)를 따로 만들지 않으면, 부모생성자가 자동으로 호출이 된다.


class Sub3(Super):
    def __init__(self):
        #Super.__init__(self)
        super().__init__()
        print("Sub3 init")
    def show(self):
        #Super.show(self)
        super().show()

        - 부모의 show를 호출하고싶다. 부모의 super().를 사용해서 생성자나 메서드를 사용할때는 self를 넘기면 안돼고,                  부모의 이름을 직접사용 Super. 로 사용할때는 self를 써서 직접 넘겨줘야한다.
        print("Sub3 show")

 

 

#super() - 부모의 생성자에 접근하는 방식
#super. -부모의 변수나 부모의 메서드에 접근하는 방식

 


s3 = Sub3()   - 객체를 만들면 생성자로 넘어간다.
s3.show()
print()

s1 = Super()
s1.show()
print()

-  자식의 생성자가 있으면, 부모의 생성자가 호출이 될 수도 있고 안될수도있다.
s2 = Sub()
s2.show()
print()
 -  부모가 물려준 생성자와 show() 그리고 자기생성자와 자기show()까지 출려된다

s3 = Sub2()   -  Super init -부모의생성자가 호출되어 출력된다.
s3.show()   -  Super show -부모의 show를 호출하여 출력

 

 

 

 

 

 

 

 

 

 

 

 

💾Ex06

#_*_coding:utf-8
'''
Created on 2022. 10. 7.

@author: admin
'''




#생성자 통해서 
#출력하는 함수를 통해서 이름과 나이를 출력한다.

class Person:
 
    def __init__(self,name,age=None): #age=10을 넣어서 초기화하여 기본값이 10이 되게한다, 기본값 설정안하려면 age=None 뭐라도 넣어줘야한다.
        print('Person생성자')
        self.name = name
        self.age = age

    def show(self):
        print(self.name,self.age)
        
    def __str__(self):  # __str__ 이라고 함수를 정의하면 , 메서드 호출하지 않아도 자동으로 호출된다 show=str 같은 기능을 가진함수이다
        return "Person %s %s" % (self.name,self.age)


#Person클래스 상속받음
class Employee(Person):
    def __init__(self,name,age,position,salary):
        super().__init__(name, age)
        #Person.__init__(self, name, age) 부모의 이름을 가져와서 써도 된다.
        self.position = position
        self.salary = salary
    
    def __str__(self):
        #return "Employee %s %s %s %s" % (self.name,self.age,self.position,self.salay) 이렇게 해도 되지만 부모의 str을 상속받는 방법을 쓴다.
        #return super().__str__()+" Employee %s %d" % (self.position,self.salary) 상속을 받아서 사용하는 방법
        return Person.__str__(self)+" Employee %s %d" % (self.position,self.salary) #부모의 이름을 쓸때는 self를 꼭 쓴다

p1 = Person('수지', 30)
p1.show()
print('p1:',p1.__str__()) #p1.__str__() = __str__()함수를 생략해도 된다. (=자바의 toString)
print(p1.name)
print(p1.age)

p2 = Person('박보검')  #기본 나이 10살로 설정되게 한다.
p2.show()
print('p2:',p2)

print('--------------')

e1 = Employee('윤아',20,'대리',200)

e2 = Employee('정국',40,'과장',300)


print('e1:', e1) #윤아',20,'대리',200 이대로 나올수 있도록 해본다.
print('e2:', e2) #'정국',40,'과장',300


- 생성자 통해서 
- 출력하는 함수를 통해서 이름과 나이를 출력한다.

class Person:
 
    def __init__(self,name,age=None): 

       - age=10을 넣어서 초기화하여 기본값이 10이 되게한다, 기본값 설정안하려면 age=None 뭐라도 넣어줘야한다.
        print('Person생성자')
        self.name = name
        self.age = age

    def show(self):
        print(self.name,self.age)
        
    def __str__(self):   

-   __str__ 이라고 함수를 정의하면 , 메서드 호출하지 않아도 자동으로 호출된다 show=str 같은 기능을 가진함수이다
        return "Person %s %s" % (self.name,self.age)


#Person클래스 상속받음
class Employee(Person):
    def __init__(self,name,age,position,salary):
        super().__init__(name, age)
        #Person.__init__(self, name, age)    -  부모의 이름을 가져와서 써도 된다.
        self.position = position
        self.salary = salary
    
    def __str__(self):
        #return "Employee %s %s %s %s" % (self.name,self.age,self.position,self.salay) 

           - 이렇게 해도 되지만 부모의 str을 상속받는 방법을 쓴다.(상속 안받은 방법)
        #return super().__str__()+" Employee %s %d" % (self.position,self.salary)      -  상속을 받아서 사용하는 방법
        return Person.__str__(self)+" Employee %s %d" % (self.position,self.salary)   -  부모의 이름을 쓸때는 self를 꼭 쓴다

p1 = Person('수지', 30)
p1.show()
print('p1:',p1.__str__())      -  p1.__str__() = __str__()함수를 생략해도 된다. (=자바의 toString)
print(p1.name)
print(p1.age)

p2 = Person('박보검')  #기본 나이 10살로 설정되게 한다.
p2.show()
print('p2:',p2)


e1 = Employee('윤아',20,'대리',200)

e2 = Employee('정국',40,'과장',300)


print('e1:', e1) #윤아',20,'대리',200 이대로 나올수 있도록 해본다.
print('e2:', e2) #'정국',40,'과장',300

 

 

 

 

 

 

 

 

💾Ex07

#_*_coding:utf-8

'''
Created on 2022. 10. 7.

@author: admin
'''
#자바에서는 한번에 상속을 받을 수 없다. 대를 거쳐러 조상-부모-자식 이렇게는 상속을 여러개 받을 수 있다.
#파이썬은 한번에 다중상속이 가능하다!

class Tiger:
    def jump(self):
        print('호랑이 jump')
        
    def cry(self):
        print('호랑이 어흥')
        
        
class Lion:
    def bite(self):
        print('사자 bite')
    def cry(self):
        print('사자 으르렁')
        
        
class Liger(Tiger,Lion):
    def play(self):
        print('라이거와 놀기')
l = Liger()
l.play()
l.jump()
l.bite()
l.cry() # Tiger,Lion 에 cry가 둘다 있을때, 먼저 상속받은 부모의 cry가 호출이 된다.


#자바에서는 한번에 상속을 받을 수 없다. 대를 거쳐러 조상-부모-자식 이렇게는 상속을 여러개 받을 수 있다.
#파이썬은 한번에 다중상속이 가능하다!

class Tiger:
    def jump(self):
        print('호랑이 jump')
        
    def cry(self):
        print('호랑이 어흥')
        
        
class Lion:
    def bite(self):
        print('사자 bite')
    def cry(self):
        print('사자 으르렁')
        
        
class Liger(Tiger,Lion):
    def play(self):
        print('라이거와 놀기')
l = Liger()
l.play()
l.jump()
l.bite()
l.cry() # Tiger,Lion 에 cry가 둘다 있을때, 먼저 상속받은 부모의 cry가 호출이 된다.
        
        

 

 

 

 

 

 

 

💾Ex08

#_*_coding:utf-8
'''
Created on 2022. 10. 7.

@author: admin
'''
# 연산자 오버로딩
class NumBox:
    def __init__(self,num):
        self.num = num
        self.num2 = num
        
    def __add__(self,num):
        self.num += num
        return '더하기(add)' +str(self.num)
    
    
    def __radd__(self,num):
        self.num += num
        return '더하기(radd)' +str(self.num)
    
    
    def __sub__(self,num):
        self.num -= num
        return '빼기(sub)' +str(self.num)
    
num = NumBox(40) #num변수가 관리하는곳에 num,num2가 있다
print(num.num) #40 , num.num =참조변수이다.
print(num.num+50) #90
print(num+50) # num은 참조변수 + 숫자 : __add__함수가 자동으로 호출이 되어 내가 넘기는 50이 add함수의 num으로 들어가서 더해져(str문자열로 바꿔) self.num=90된다.
print(10 + num.num)
print(10 + num) #숫자+참조변수 :뒤에 참족변수가 있으면__radd__ 가 호출이 되어 더해져 100이 된다.
# +가 더하기가 아닌 함수를 부르는 기능, =연산자 오버로딩

print(num.num-3)
print(num-3)


# 연산자 오버로딩
class NumBox:
    def __init__(self,num):
        self.num = num
        self.num2 = num
        
    def __add__(self,num):
        self.num += num
        return '더하기(add)' +str(self.num)
    
    
    def __radd__(self,num):
        self.num += num
        return '더하기(radd)' +str(self.num)
    
    
    def __sub__(self,num):
        self.num -= num
        return '빼기(sub)' +str(self.num)
    
num = NumBox(40) #num변수가 관리하는곳에 num,num2가 있다
print(num.num) #40 , num.num =참조변수이다.
print(num.num+50) #90
print(num+50) # num은 참조변수 + 숫자 : __add__함수가 자동으로 호출이 되어 내가 넘기는 50이 add함수의 num으로 들어가서 더해져(str문자열로 바꿔) self.num=90된다.
print(10 + num.num)
print(10 + num) #숫자+참조변수 :뒤에 참족변수가 있으면__radd__ 가 호출이 되어 더해져 100이 된다.
# +가 더하기가 아닌 함수를 부르는 기능, =연산자 오버로딩

print(num.num-3)
print(num-3)