Super Kawaii Cute Cat Kaoani

Python/Python Study

파이썬 추가적인 개념 - 1

zozni 2021. 1. 9. 22:26
728x90
반응형
SMALL

클래스, 모듈, 패키지, 예외 처리, 내장/외장 함수에 대해 공부한다.

 

 

클래스

-> 반복되는 변수 & 메소드(함수)를 미리 정해높은 틀(설계도)

 

 

클래스가 왜 필요한가?

 

두개의 계산을 각각 하고 싶을 때!

이런식으로 함수를 여러번쓰면 굉장히 귀찮다. 똑같은 기능을 여러번써야하잖아.

그래서 클래스를 사용한다.

 

클래스라는 것을 만들고 그 클래스를 이용해서 똑같이 생긴거는 여러개 instance라고 찍어낼 것이다.

 

 

<클래스의 개념>

클래스는 함수랑 변수가 똑같은 구조를 계속 여러번 써야하니까 그냥 하나로 묶어서 설계도로 만들어보자.

클래스는 class Calculator: 처럼 맨 앞을 대문자로 쓰는 것이 정석이다.

add라는 것을 클래스를 이용해서 한번만 정의를 해놓으면 이걸 계속 찍어낼 수 있다.

-> __init__은 처음에 이 클래스가 만들어 질 때 어떤 값으로 설정할지를 정하는 부분.

 

클래스를 쓰는 방법!

1. class를 입력하고

2. 대문자로 시작하는 클래스의 이름을 작성

3. 안에 들어갈 함수와 변수 설정

 

파이썬 프로그래밍의 핵심, 클래스

비유하자면 

클래스는 과자 틀, 과자는 객체.

 

사칙연산 클래스 만들기(+,-,*,/)

a라는 변수에 설계도(클래스)로 찍어낸 결과물(과자)을 저장.

 

self -> 클래스 안에 있는 함수(메소드)이기 때문에 a에 있는 함수를 쓰겠다.

클래스 개념에서는 맨앞에 (a)객체가 self로 들어간다. self는 a이다. 

 

 

클래스를 처음 만들 때 FourCal이라는 클래스로 뭔가를 찍어내서 결과를 만들 때 __init__을 무조건 처음으로 수행하게 된다. 찍어내자마자 __init__이 수행된다. (무조건 고정되어 있는 값: 예약어) -> "생성자"라고 한다.

 

이거를 쓰면 이런 기능을 해라~! 라고 이미 정해놓은 것이다.

a = FourCal()에 빨간 밑줄이 생긴다. 

생성자를 실행하려면 first와 second가 있어야 한다. 

그래서 a = FourCal(1,2)라고 해줘야 한다.

 

__init__을 맨처음 시작하고 a에는 first에는 1, second에는 2 이렇게 담겨져서 시작을 하게 된다.

 

클래스로 만든 instance를 찍어낼 때 __init__을 실행하면서 시작하게 된다.

 

 

클래스의 상속

계산기를 이용해서 공학용 계산기를 만들고 싶어. 공학용 계산기는 기본 계산기에 좀 더 복잡한 기능을 넣은 것이다.

그러면 기본 계산기에 이미 구현되어 있는 기능을 그대로 쓰고 추가적인 것만 추가하면 되는 것.

기본 계산기를 상속받아서 추가 기능을 넣어서 공학용 계산기를 만드는 것이다. 

 

상속을 사용하는 이유 : 기존에 짠 class를 그대로 활용하기 위함.

부모가 만든거는 자식이 상속 받으면 다 똑같이 쓸 수 있다.

출력 결과는 6

+ 자식에게도 __init__함수는 동일하게 동작한다.

+ __init__은 한번만 써주면 된다.

 

메소드 추가

자식에 있는 함수는 새로 추가해서 쓸 수 있다.

 

메소드 오버라이딩

부모에도 메소드 있는데 자식에도 같은 기능의 메소드가 있다. 이런 경우

자식의 메소드가 우선시 된다. (자식 이기는 부모 없다라고 생각하면 편함.)

부모의 함수를 덮어 쓴다. -> 오버라이딩

 

 

클래스 변수, 객체 변수

클래스 변수는 클래스에 공통적으로 적용되는 변수이다. 클래스에 미리 선언해놓은 변수를 클래스 변수라고 한다.

즉, FourCal을 여러개 찍어도 (a=FourCal()) 이미 클래스에서 정의해놓은 변수이기 때문에 결과는 같다.  2 2로 출력됨.

 

+추가적인 예제

출력결과는 박박박.

공통으로 사용할 때는 클래스 변수를 쓰고,

각각 객체마다 다르게 줘야할 때는 객체 변수를 쓴다.

 

 

모듈

모듈이란? 

=> 미리 만들어 놓은 .py 파일 (함수, 변수, 클래스)

-> 미리 만들어 놓은 파이썬 파일인데 함수랑 변수, 클래스를 미리 파이썬 파일 하나에 만들어 놓고

    얘를 그냥 가져다가 쓰겠다.

 

mod1.py 파일을 만들어 놓고

 

만든 걸 가져다가 이렇게 그대로 쓸 수 있다.

mod1use.py의 실행결과는 3이 나온다. 

add라는 기능을 정의하지도 않았는데 다른 파일에 이미 써 놓은 함수를 import를 통해서 사용할 수 있다.

 

 

from 모듈이름 import 모듈함수 -> 골라서 가져오기

함수가 으엄청 엄청 많아. 근데 그중에 add만 가져오고 싶다.

그러면 

mod1에서 add라는 것만 가져오고 싶다. 라는 뜻의

from mod1 import add 를 써준다. 

=> 이렇게 사용하면 속도가 더 향상된다. 

 

 

 

if __name__ == "__main__" : 의 의미

이렇게 두 파일이 있는 상태에서 아래걸 실행했는데 출력이 5 6이 나왔다. import밖에 안했는데 연산이 수행된것.

 

print를 mod1에서 찍어놨기 때문에 mod1을 불러오면서 저 코드까지 실행이 된 것이다.

이런걸 막기 위해서 if __name__ == "__main__" : 를 사용한다.

 

저번에 봤던 것처럼 __init__ , __name__과 같이 언더바 두개가 왜 붙어있냐면 좀 특별한 것이다.

 

__main__이 실행하는 함수. 

위 예제에서는 from.py가 main이 되고 

mod1.py는 그냥 mod1.py이다. 

 

if __name__ == "__main__" : 은 

__name__이 __main__이 이어야만 안에 내용을 실행한다. 이렇게 정의가 되어있는 것이다.

(__name__이랑 __main__이 일치할 때) 

 

따라서

이 상태로 from.py를 실행하면 아무것도 출력되지 않는다. 

지금 내가 실행을 시작하려는 파일이 main이라는 이름으로 시작을 한다. 

즉, main으로 실행을 했기 때문에 두 개가 일치해서 mod1.py에서 print가 실행되서 5랑 6이 나왔는데 

from.py 파일은 mod1.py를 가져오는 파일일 뿐이다. 

 

mod1이라는 게 있으면 from.py를 실행하면 이게 main이 된다.

근데 가져다 쓸 때는 메인이 아니고 파일 이름이 돼서 그냥 if~~ 만 걸어놓으면

mod1.py에 있는 print가 실행이 안되게 막을 수 있다.

 

 

import를 하는데 같은 경로에 있으면 괜찮다! 

from.py가 mod1을 import할 수 있는 이유는 같은 경로에 있기 때문이다.

근데 이 두 파일이 다른 폴더에 들어있으면 그냥 import했을 때 파일을 찾을 수가 없다.

다른 서브폴더에 있는 걸 찾으려면 path에 추가를 해줘야 한다. (sys.path.append)

 

내가 import하려는 거는 subfolder 안에 있다라고 알려줘야 한다.

출력 결과는 7

 

 

패키지 = 라이브러리

패키지란?    모듈 여러 개를 모아놓은 것.

파일 여러개를 모아서 이걸 패키지로 만들어서 제공을 해준다. 

가상의 game 패키지 예는 다음과 같다.

이렇게 똑같이 만듬!

이렇게 만든 것을 패키지라고 부른다. 

__init__.py 는 패키지를 표현하는 파이썬 파일이다. 이게 파이썬 관련 설정하는 곳이다. 

__init__.py을 써서 패키지를 구성해서 여기에 파이썬 설정들을 해놓는 것이다.

 

+ __init__은 파이썬 3.3 버전 이후로는 굳이 안 써도 된다!

+ 예전 버전과의 호환을 위해서 해준다!

 

 

그렇다면 

패키지를 가져왔을 때는 어떻게 실행해야 할까?

 

 

패키지 안의 함수 실행하기

패키지인데 폴더니까 import하고 하나씩 들어가야 한다.

모듈이었으면 import echo 하면되는데

패키지이니까 import game.sound.echo 이렇게 하나씩 들어가서 불러온다.

출력 결과

game 안에 sound 안에 echo 안에 echo_test라는 함수가 있었음.

실행 결과가 나옴.

이런 방법이 있고

 

+ 또 다른 방법으로는

이렇게 쓸수도 있다. 위와 동일한 출력값을 얻는다.

 

 

+ 또 다른 방법으로는 

이렇게 쓸수도 있다. 위와 동일한 출력값을 얻는다.

 

패키지를 불러오는 다양한 방법들이다.

 

+ 추가

echo_test 다 쓰기 귀찮으니까 별명 키워드 as를 사용해서 e로 줄여서 사용이 가능하다.

 

 

__all__

그냥 이렇게만 쓰면 오류가 발생한다.

__init__.py에 *을 쓰게 되면 뭘 가져올 건지에 대해 기록을 해야 한다.

출력 결과

 

 

 

relative 패키지

graphic안에 있는 render.py 파일은 game 안쪽에 있는 모듈 중에 하나였음.

근데 여기서 sound 안에 있는 echo.py를 불러오고 싶어.

 

그러면 이렇게 쓸 수 있다.

from ..sound.echo import echo_test

 

../../ -> 이런 식으로 쓰게 되면 상대경로에서 이전 폴더로 돌아간다는 의미이다.

지금 graphic 폴더 안에 render에 위치해있음.

거기서 이전 폴더니까 game이다. 

game에서 sound로 들어가고 거기서 echo로 들어가고 그 중에서 echo_test를 import한다.

 

 

728x90
반응형
LIST

'Python > Python Study' 카테고리의 다른 글

파이썬 프로그램 - 1  (0) 2021.01.14
파이썬 추가적인 개념 - 2  (1) 2021.01.14
파이썬 입출력  (0) 2021.01.09
파이썬 제어문  (0) 2020.12.28
파이썬 자료형-2  (0) 2020.12.27