728x90
반응형
1. 잡담
- Java보단 Python이 점점 중요해지고 있다.
- ChatGPT가 프로그램에 들어간다면 ? Python을 사용할 줄 알아야한다.
- OpenAI기능을 가져오거나 open source를 활용하려면 Python 코드를 활용할 줄 알아야한다.
- 앞으로 개발자는 Java, Python, C#등 다양한 언어를 모두 알아야 되는 환경이다.
2. 패키지
- 파이썬에서 패키지(packages)란 관련 있는 모듈의 집합을 말한다. 패키지는 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해 준다.
- 모듈이란 .py파일이다. (자바에는 .class나 .java가 있다. 조금 다른 개념이다.)
2.1 패키지 import, from 예제
- 모듈을 import해도 해당 경로를 닷으로 입력해줘야 메서드를 불러와 사용할 수 있다.
- 그냥 사용하려고하면 구현되지 않았다는 오류가 나온다.
- from을 사용하면 좀더 간략하게 경로를 닷으로 입력해줄 수 있다.
- from 상위경로 디렉토리 import 하위경로(패키지)
- 메서드를 바로 import 시켜주면 경로없이 사용가능하다.
- from 상위경로(디렉토리, 패키지 경로) import 메서드명(콤마를 사용해 여러개 입력 가능)
최상위 디렉토리인 game을 import하면 모든 디렉토리에 접근할 수 있을 거 같지만 안된다. 세부 경로까지 import 해주자.
2.2 __init__.py의 용도
- 해당 디렉터리가 패키지의 일부임을 알려 주는 역할을 한다.
- 만약 game, sound, graphic 등 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않는다.(빈 디렉터리로 인식)
- __init__.py 파일은 패키지와 관련된 설정이나 초기화 코드를 포함할 수 있다.(설정이나 초기화 할 것이 없더라도 해당 디렉토리 내에 패키지를 import하여 사용하고 싶다면 __init__.py 파일을 만들어주자)
main.py에서 game 디렉토리(__init__.py 패키지는 따로 import 안함)를 import했지만 game 디렉토리 내의 __init__.py 메서드나 변수를 사용할 수 있다.
2.2 __init__.py 예제
- game 디렉토리의 __init__.py에 미리 import시키면 main.py에서 game만 임포트해도 해당 메서드를 사용할 수 있다.
- 모듈을 미리 import한다.
- __init__.py 파일에 패키지 내의 다른 모듈을 미리 import하여 모듈를 사용하는 코드에서 간편하게 접근할 수 있게 한다.
2.3 패키지 초기화
요약
- game 디렉토리 또는 game 하위 디렉토리를 import할 때 초기화 하고 싶은 코드가 실행된다.
- 초기화 코드는 한 번만 실행한다.
- sound 디렉토리의 echo, wav 모듈은 불러오지 못한다. *는 메서드를 불러올 때 사용한다.
- 특정 디렉터리 내ㅅ의 모듈을 *로 import하고 싶으면 디렉터리 내 __init__.py 모듈에 __all__키워드를 사용해서 정의해준다.
- __init__.py를 활용하는 방법이다. 이니트 레벨에서 미리 초기화해서 import하면 메서드를 불러와 사용할 수 있다.
- 그때 사용하는 키워드가 __all__이다.

2.4 상대경로
- . 닷 하나는 본인 위치
- .. 닷 두개는 상위 위치
- 리눅스나 파이썬, 명령프롬프트에서 사용한다.
from game.sound.echo import echo_test를 from ..sound.echo import echo_test로 수정했다. 여기에서 ..은 render.py 파일의 부모 디렉터리를 의미한다. 따라서 render.py 파일의 부모 디렉터리는 game이므로 위와 같은 import가 가능한 것이다.
render.py 파일의 현재 디렉터리는 graphic, 부모 디렉터리는 game이다.
3. 예외처리
3.1 오류와 예외의 차이점은 ? Throwable (error, exception)
- 오류는 컴파일 단계에서 문제가 생겨서 실행조차 안되는 에러
- 예외는 문법상에 문제는 없어서 컴파일이 되고 실행은 되지만 에러도 안뜨고 원하는 실행이 되지 않는 경우. 예를들어 파일을 불러오려고했는데 해당 파일이 없다거나, 나누는 값 입력이 0가 들어와 실행이 안될 경우.
- >>파이썬의 경우 안정성이 떨어지는 이유가 문법상으론 문제가 없어 실행은 할 수 있지만 원하는 값이 안나오고 예외가 나오는 경우가 많다.
- Try, Catch는 구문에러에는 사용할 수 없고 예외에만 사용할 수 있다.(구문 에러는 컴파일러 단계에서 실행이 안 됨)
- 서버관리 및 데이터 입출력에선 수 많은 예외가 발생한다.(오류가 아님)
- except [발생오류 [as 오류변수]]:
- 오류 변수를 출력하여 어떤 예외사항인지 확인 할 수 있다.
- exception에서 ZeroDiviosionError가 아니라 FileNotFoundError이므로 try exception 구문이 제대로 실행되지 않아 print문이 출력되지 않는다.
- try ~ eception 구문이 제대로 실행된다면 그 이후 코드도 계속해서 실행된다.
- 실무에선 예외가 생길 경우 로그나 경고창을 해당 관리자에게 전송하는 작업이 필요하다.(유지보수를 위해)
- Exception : 에러 클래스의 최상위 클래스(최상위 클래스를 사용하면 모든 예외를 처리하므로 해당 예외를 확인 후 그 예외만 따로 처리하는 것이 좋다)
- 파이썬 메소드의 매개변수에 초기값을 주고 싶을 경우 해당 매개변수를 제일 뒤쪽으로 보내야 에러가 생기지 않는다.
3.2 try-finally 문
- try 문에는 finally 절을 사용할 수 있다. finally 절은 try 문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다. 보통 finally 절은 사용한 리소스를 close해야 할 때 많이 사용한다.
# try_finally.py
try:
f = open('foo.txt', 'w')
# 무언가를 수행한다.
(... 생략 ...)
finally:
f.close() # 중간에 오류가 발생하더라도 무조건 실행된다.
3.3 여러 개의 오류 처리하기
try 문 안에서 여러 개의 오류를 처리하려면 다음과 같이 사용해야 한다.
# many_error.py
try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다.")
- a는 2개의 요솟값을 가지고 있으므로 a[3]이 IndexError를 발생시켜 "인덱싱할 수 없습니다."라는 문자열을 출력할 것이다. 인덱싱 오류가 먼저 발생했으므로 4 / 0에 따른 ZeroDivisionError 오류는 발생하지 않는다.
3.4 try-else 문
try 문에는 다음처럼 else 절을 사용할 수도 있다.
try:
...
except [발생오류 [as 오류변수]]:
...
else: # 오류가 없을 경우에만 수행
...
3.5 오류 일부러 발생시키기
파이썬은 raise 명령어를 사용해 오류를 강제로 발생시킬 수 있다.
# error_raise.py
class Bird:
def fly(self):
raise NotImplementedError
3.6 raise 키워드
- Exception 클래스 또는 Exception을 상속받는 서브 클래스를 실행시킨다.
- 다른 자료형 또는 클래스를 뒤에 기입하면 구문오류가 발생한다.(except 뒤에도 Exception 클래스 또는 서브 클래스만 올 수 있다)
# error_make.py
class MyError(Exception):
pass
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nick("천사")
say_nick("바보")
except MyError:
print("허용되지 않는 별명입니다.")
- 하지만 프로그램을 실행해 보면 print(e)로 오류 메시지가 출력되지 않는 것을 확인할 수 있다. 오류 메시지를 출력했을 때 오류 메시지가 보이게 하려면 오류 클래스에 다음과 같은 __str__ 메서드를 구현해야 한다. __str__ 메서드는 print(e)처럼 오류 메시지를 print 문으로 출력할 경우에 호출되는 메서드이다.
class MyError(Exception):
def __str__(self):
return "허용되지 않는 별명입니다."
__str__메서드는 Ecxeption 클래스의 __str__메서드릐 오버로딩이며, 이런 특수한 메서드는 파이썬에 여러개 존재한다.(ex __name__, __main__와 같음)
댓글