TIL08.점프 투 파이썬(3)

Jaeyeon·2020년 12월 28일
0

class의 기본 형식

class 클래스이름:
def 메서드(self):
return 코드

ex)
class Person:
	def greeting(self):
    		print('hello')
            
james = Person()		#james는 클래스에 속해있다.(클래스에 있는 함수 사용가능)

>>>james.greeting()
hello

객체와 인스턴스의 차이?

a=Cookie()를 예를 들어 설명하자면
a는 객체이고 a는 Cookie의 인스턴스이다.
결론적으로 a하나만 보고 얘기를 할 때는 객체라는 표현이 맞는 말이고
Cookie 기준에서 얘기를 하면 a는 Cookie의 인스턴스라는 표현이 맞는 말이다.

setdata()를 이용하여 합/차/곱/분 구하기

class Cal:
	def setdata(self,first,second):
    		self.first = first
            	self.second = second
        def add(self):
        	return self.first + self.second
        def mul(self):
        	return self.first * self.second
        def sub(self):
        	return self.first - self.second
        def div(self):
        	return self.first / self.second
       
a = Cal()			#a를 Cal()의 멤버로 껴주기
a.setdata(4,2)			#4랑 2로 데이터 맞춰놓을게!
a.add()				#설정 해놓은 값으로 더하기 할게!
6
a.mul()				#설정 해놓은 값으로 곱하기 할게!
8
            

생성자(__init__)를 이용하여 합/차/곱/분 구하기

근데 쓰다보니까.. 무지하게 귀찮다.
한번 할때도
a = Cal()
a.setdata(4,2)
이걸 계속 설정 해줘야 되다니..

더 간단하게 사용 할 수 있는 방법 없을까??!

생성자를 사용해보자!

생성자를 사용하면 객체가 생성되는 시점에 자동으로 호출이 되기 때문에 번거로움을 조금이나마 줄일 수 있다!


class Cal:
	def __init__(self,first,second):		#setdata를 __init__으로만 바꿨을 뿐..
    		self.first = first
            	self.second = second
        def add(self):
        	return self.first + self.second
        def mul(self):
        	return self.first * self.second
        def sub(self):
        	return self.first - self.second
        def div(self):
        	return self.first / self.second
            
 a = Cal(4,3)
 a.add()
 7
 a.mul()
 12
            

이렇게만 하면 신세계가 펼쳐진다.

코드를 한줄 줄일 수 있어 더욱 읽기 쉬운 코드를 만들어 낼 수 있다!

class의 상속

내가 엄마 아빠 밑에서 태어나 엄마 아빠와 닮은 점이 있듯이
코드도 상속을 받는다.

class Morecal(Cal):
	pass

이렇게만 적어도 아까 내가 땀 뻘뻘 흘려 적었던 Cal의 메서드 함수를 다 갖고 온것..!

상속은 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않을 때 아주 유용하게 쓸 수 있다.

그럼 심심한데 아까 Cal 클래스에서 제곱을 추가 할 수 있는 클래스를 만들어 볼까?

class Morecal(Cal):
	def pow(self):			#생성자 마저 부모 클래스에 있기 때문에 안써도 됨!!
    		return self.first ** self.second
            

a = Morecal(4,2)
a.add()
6
a.mul()
8
a.pow()
16

이렇게 기존 클래스에 추가하여 새로운 클래스를 생성 할 수있다!!

메서드 오버라이딩

오버라이딩 이라고 하면 뭔가 있어보이지만... 별거 아니였다.
별 것 아닌만큼 덮어쓰기 라는 표현이 뭔가 나한테는 더 확 와닿는다.
기존 Cal 클래스에서 self.first가 4이고 self.second가 0인 상태에서 나눗셈을 진행한다면??
파이썬은 융통성이 없어 오류가 발생 한다..
이러한 오류가 있는 메서드를 보완하고 다시 만드는 것을 오버라이딩 이라고 한다.
쉽게 말하자면 카톡 구 버전(ver1.0.2)에서 개발자들이 오류를 발견하고
고친 후에 신 버전(ver1.0.3)으로 사용자들이 업데이트 하는 느낌 일까?
클래스 이름은 새로 바꾸되(카톡도 버전이름이 새로 바뀌듯이) 문제가 있는 부분만 수정하면 된다.

class SafeCal(Cal):
	def div(self):
    		if self.second == 0:
            		return 0
                else
                	self.first / self.second
                    
                    
a = SafeCal(4,0)
a.div()
0
 

이렇게 보완할 수 있다!

모듈이란?

  • 각종 변수, 함수, 클래스를 담고 있는 파일을 말한다.
  • IDLE 에디터 모드에서 코드를 짜고 다른 창에서 그 파일(모듈)을 불러 올때 주로 쓴다.

모듈 불러오기

  • import mod1
    = mod1 이라는 모듈 불러올게
    mod1.add(3,4)
  • import mod1 as m
    = mod1이라는 모듈 불러오는데 지금부터 그것을 m이라고 말할게
    m.add(3,4)

    쓸 때 마다 mod1.뭐시기 m.뭐시기 쓰려니까 귀찮네..
    더 간결하게 해보자!
  • from mod1 import add
    = mod1이라는 모듈에서 add라는 메서드만 사용할게
    add(3,4)
  • from mod1 import *
    = mod1이라는 모듈에서 모든 메서드 다 쓸거야!
    add(3,4)
    mul(3,5)
    div(3,1)

if__name__ == "__main__": 의 의미

인터넷에서 떠돌아 다니는 코드를 보다보면 위와 같은 코드를 참 많이 보게 된다.

무슨 의미 일까?

먼저 답 부터 말하자면 현재 스크립트 파일이 프로그램의 시작점인지를 판가름 하는 의미이다.

일단 코드 하나를 예로 들겠다.

#mod2.py
 def add(a,b):
 	return a+b
 def sub(a,b):
 	return a-b
    
if__name__ =="__main__":
	add(1,4)
    	sub(4,2)
        
      

이것을 그대로 실행 시키면?!
5
2
이렇게 결과값이 나온다.

하지만! 이것을 저장 시키고

다른 모듈에서 mod2를 불러온다면?

from mod2 import *
add(1,2)
sub(6,3)

결과값은
3
3
이 나온다.

즉,if__name__ == "__main__": 이 친구의 의미는

내가 시작점이면 내 밑에 꺼를 실행해줘, 시작점이 아니라면 내가 정의(def)한 것만 사용해줘

라는 의미로 해석 할 수 있다!

패키지란?

  • 패키지는 여러 모듈들의 묶음이라고 생각하면 된다.

여러 형식들을 갖고 있는 패키지

형식이 모듈과 많이 흡사하다.

  • import 패키지.모듈

  • import 패키지.모듈1, 패키지.모듈2

  • 패키지, 모듈, 변수

  • 패키지, 모듈, 함수()

  • 패키지, 모듈, 클래스()

    이러한 형식들도 있고

  • from 패키지.모듈 import 변수

  • from 패키지.모듈 import 함수

  • from 패키지.모듈 import 클래스

  • from 패키지.모듈 import 변수, 함수, 클래스

  • from 패키지.모듈 import *

.(온점)을 '~안에'로 해석 하면 쉬울 것 같다.
ex) 패키지 안에 모듈 / 패키지 안에 모듈 안에 함수 / 패키지 안에 모듈안에 클래스

profile
생각하는 개발자 되기

0개의 댓글