PYTHON/문법

예외처리, 모듈, 클래스

sshhhh 2023. 9. 15.

#예외처리

프로세스가 더 이상 동작하지 못하는 상황일 때 예외가 발생한다.

(내부적으로 raise 구문으로 예외 발생시킨 것임)

try:

 실행할 코드

except 예외1:

 예외(=에러)가 발생했을 때 처리하는 코드 -

else:

 예외가 발생하지 않았을 때의 처리

finally:

 예외가 발생하든 하지 않든 반드시 해야하는 처리

 

-예제1

num1 =int(input("정수입력"))
num2 =int(input("정수입력"))
try:
  print(num1/num2)
except:
  print("에러")
else:
  print("에러x")
finally:
  print("반드시 처리")
  
  """
정수입력4
정수입력2
2.0
에러x
반드시 처리
-------------
정수입력3
정수입력0
에러
반드시 처리
  """

-2

#예외를 발생시키기

def getSum(start,end,step=1):
  if start > end:
    raise ValueError #예외를 발생시킨다
  s=0
  
  for i in range(start,end+1,step):
    s+=i
  return s
  
  try:
   print(getSum(2,10))
   print(getSum(10,2))
except:
  print("예외발생")
  
  """
  54
  예외발생
  """

 

#모듈

특정 목적을 위한 코드를 하나의 소스 파일에 정의한 것 => 관련있는 형식이나 기능을 모아서 정의한 코드 집합 

함수나 변수 또는 클래스를 모아 놓은 파일이다.

.py 는 모두 모듈

- Abcd.py 파일이 있을 때 모듈 이름은 Abcd

- Abcd 모듈에 있는 것을 사용하고자 할 때 : import Abcd

- Abcd 모듈에 foo 함수가 있을 때 Abcd.foo() 와 같은 형태로 사용할 수 있다.

- 축약해서 사용할 때, from Abcd import foo foo() 처럼 사용할 수 있다.

- 모듈 이름을 축약(별칭) import Abcd as A A.foo() 처럼 사용할 수 있다.

 

 

#__name__

- 파이썬이 내부적으로 사용하는 특별한 변수 이름

- main이라 이해하면 된다 ->즉 프로그램 진입점 entty point

- __main__의 값을 가진다.

- __name__== __main__

 

 

 

#클래스 캡슐화

- 프로그램에서 관리할 데이터 등을 개발자가 형식으로 정의하여 사용할 수 있다.

- 클래스를 이용하면 멤버 필드와 멤버 메서드를 캡슐화할 수 있다.

- 클래스의 파생 문법을 이용하면 기반 형식의 멤버를 상속받을 수 있다.

- 기반 형식에 정의한 메서드를 파생 형식에서 다시 정의하면 재정의로 취급한다.

  멤버 이름에 __로 시작하면 가시성이 차단(private)

 

#생성자

클래스 이름과 같은 함수

 

class 클래스 이름:

    def __init__(self , 추가적인 매개변수):  //self : 자기자신을 나타내는 딕셔너리 

 

class Student: #현재 접근하고 있는 학생은 self
  def __init__(self,num,name): #__init 초기화함수, 생성자함수, 생성메소드다. 학생이 만들어질 때 실행하는 함수
    self.num = num #나의 이번호
    self.name = name
    self.iq=0
  def introduce(self): #멤버메소드
    print(f"번호는 {self.num}, 이름은 {self.name} 아이큐는 {self.iq} 입니다.")
  def study(self): #멤버메소드
    self.iq+=1
    print(f"{self.name} : 밥먹자")'
    

s1 = Student(1, "독고길동")  #번호,이름 넣기
s1.introduce()
s1.study()
s1.study()
s1.introduce()

"""
번호는 1, 이름은 독고길동 아이큐는 0 입니다.
독고길동 : 밥먹자
독고길동 : 밥먹자
번호는 1, 이름은 독고길동 아이큐는 2 입니다.

study() 두번 호출해서 아이큐 +2

"""

#정보은닉

캡슐화 과정에서 특정 멤버의 가시성을 차단하는 방법 -> 멤버 앞에 __를 붙이면 은폐(private)

사용하는 곳에서 직접 사용하지 못하며 형식 내부에서만 사용하게 하는 기법

데이터 신뢰성을 높이는 방법으로 사용한다.

#시나리오 S:
#     학생이 연속으로 5회 공부하면 아이큐가 1 올라간다.
class Student:
  def __init__(self, name):
    self.name=name 
    self.iq=100
    self.__scnt=0 #연속으로 공부한 횟수
  def study(self):
    self.__scnt+=1
    if self.__scnt==5: #정보 은닉한 멤버에는 접근할 수 없다. -> 객체 외부에서 수정불가
      self.iq+=1 #iq에만 직접적으로 접근 가능하다.
      self.__scnt=0
  def introduce(self): 
    print(f"이름은 {self.name} 이고 아이큐는 {self.iq} 입니다. SCNT 는 : {self.__scnt}")
s1 = Student("남궁길동")
s1.introduce()
s1.study()
s1.study()
s1.study()
s1.study()
print(s1.iq)
s1.iq=10293
s1.scnt=45 #정보은닉되어서 먹히지 않음
s1.introduce()

"""
이름은 남궁길동 이고 아이큐는 100 입니다. SCNT 는 : 0
100
이름은 남궁길동 이고 아이큐는 10293 입니다. SCNT 는 : 4
"""

 

#생성자, 소멸자

개체를 생성할 때 생성자 (init)을 호출한다.

해당 개체를 소멸하는 것은 garbage 수집기가 알아서 수행한다.

#시나리오 S:
#     학생이 연속으로 5회 공부하면 아이큐가 1 올라간다.
class Student:

  def __init__(self):
    print("__init__")
  def __del__(self):
    print("__del__")
    
    
print("===1===")
s1 = Student()
print("===2===")
s2 = Student()
print("===3===")
s3 = Student()
print("========")
exit(0)


"""
===1===
__init__
===2===
__init__
===3===
__init__
========

"""

 

#데이터 신뢰성을 높이는 멤버 - 설정자, 접근자

멤버 필드의 가시성을 차단하고 필요하면 설정자와 접근자를 제공하자.

설정자 - 멤버 필드에 값을 설정하는 메소드,

           set_멤버필드명 접근자 - 멤버 필드에 값을 확인하는 메소드, get_멤버필드명

class Student: 
  def __init__(self,name,num):
    self.__name = name
    self.__num = num
    self.__korea = 0
    self.__eng = 0
    self.__math = 0
  def get_name(self):
    return self.__name
  def get_num(self):
    return self.__num
  def set_korea(self, score):
    self.__korea = score
  def set_eng(self, score):
    self.__eng = score
  def set_math(self, score):
    self.__math = score
  def get_korea(self):
    return self.__korea
  def get_eng(self):
    return self.__eng
  def get_math(self):
    return self.__math
  def tostr(self):
    return f"이름: {self.__name}, 번호: {self.__num}, 국어: {self.__korea}, 영어: {self.__eng}, 수학: {self.__math}"
s1 = Student("선우길동", 3)
print(s1.tostr())
s1.set_korea(90)
s1.set_eng(100)
s1.set_math(89)
print(s1.tostr())

"""
이름: 선우길동, 번호: 3, 국어: 0, 영어: 0, 수학: 0
이름: 선우길동, 번호: 3, 국어: 90, 영어: 100, 수학: 89

"""

 

'PYTHON > 문법' 카테고리의 다른 글

파이썬 - 반복문(리스트,튜플)  (0) 2023.09.15

댓글