비슷한 용어도 나오고 새 용어 계속 나오는데 헷갈리죠.
실제로도 그게 그거예요. 비슷하지만 좀더 좋은 걸로 쓰는 거죠.
지금은 일단 모르면 아는 데까지만 쓰면 됩니다.
더 배우는 건 좀더 효율적으로 쓰고, 성능 좋게 쓰려고 하는 거죠.
많이 알면 알수록 더 잘 만들 수 있습니다.
코드 읽고 이해하면 갖다 쓸 수 있게 됩니다. 자동차와 비슷해요.
직접 수리하는 카센터에 취직하느냐, 사용할 줄 아는 운전자가 되느냐.
이쯤 되면 운전 면허 정도는 딸 수 있습니다. 이제 도로주행을 연습하면서 실력을 늘리면 됩니다.
실력을 키울 때는 목표 지점을 잡고 갈 수도 있습니다. 일단은 1번을 진행하고 있고요.
2번, 3번도 순차적으로 진행하면 됩니다.
1. 인공지능 학습을 시키기 좋은 데이터로 정리해서 만들 수 있는 실력을 얻는다
2. 인공지능 개발의 방법을 이해하고 실습해 본다
3. 원하는 작업에 따라서 특화된 공부를 진행한다
객체 지향 프로그래밍 OOP, object oriented programming
전 세계에서 사용되는 프로그래밍 패러다임으로 모든 것을 객체로 보고 프로그래밍 하는 것
python, JAVA, C++, C# 등 다양한 언어에서 사용하는 방법론이다.
객체와 객체 사이의 상호작용으로 프로그램을 구성하는 프로그래밍 패러다임
객체지향의 특징
추상화 공통된 속성이나 기능 도출 member, method 주요 특징만 남기는 것
캡슐화 데이터의 구조와 연산을 결합시킨다.
클래스 안에 특징들을 데이터(변수)와 연산(함수)을 같이 들어있게 만든다.
상속 상위 개념의 특징이 하위 개념에 전달된다. 있는 거 갖다 쓸 수 있어 효율성 올라간다.
다형성 유사 객체의 사용성을 그대로 유지 다른 기능을 추가하거나 달라질 수 있다.
객체는 추상화와 캡슐화의 결과이며, 객체는 데이터 필드와 메소드를 가진다. class안에 데이터(변수)와 연산(함수)을 합쳐 놓은 것.
클래스 class(붕어빵틀)는 객체(붕어빵)를 정의한 것(객체의 설계도)
데이터 필드 data field (멤버 변수, 객체 속성, atribute) : 객체가 가지고 있는 변수
메소드 method : 객체가 가지고 있는 함수
class 클래스이름:
클래스멤버변수
메소드
# 클래스 이름도 변수 이름 규칙 지켜야 함
# 클래스 이름 컨벤션(관용: 에러는 안나지만 다들 지키고 있고 지켜야 편하고 좋음)
## 첫 글자 대문자
## 언더바(_) 안 쓰기
## 단어 구분될 때 대문자
class Car:
def move(self):
print("move")
# class Car 안에서 정의된 move 라는 함수는 Car()라고 하는 클래스를 통해서만 호출할 수 있다.
# 클래스가 가지고 있는 함수, 클래스 안에 있는 함수를 메소드라고 한다. (메소드, 멤버스)
my_car = Car() # my_car 변수를 생성하여 객체가 된 "Car()"객체를 할당해 준다.
my_car.move()
instance 인스턴스
이제 클래스를 통해 생성된,
# 메모리 형태로 데이터에 저장되어 있겠죠.
# 인스턴스와 객체 같은 건데, class에서 정의된 특정한 객체를 인스턴스라고 한다.
# my_car는 Car() 클래스의 인스턴스
# my_car 인스턴스, Car()클래스, my_car변수 등 모두 my_car에 들어 있는 값을 말한다.
. 객체 멤버 접근 연산자
객체를 통해서 함수를 호출해라
# 클래스 등 객체 안에 있는 멤버에 접근하기 위한 연산자.
# 리스트도 객체임. .을 통해 멤버에 접근하는 거..
파이썬에서는 모든 것이 객체다. 리스트도, 함수도 객체, 모든 게 다 객체다..
print(type(li)) # <class 'list'>
n = 10
print(type(n)) # <class 'int'>
print(type("hello")) # <class 'str'>
OOP Object-Oriented Programming
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 쉽게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점이 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.
특징
객체 지향 프로그래밍의 특징은 기본적으로 자료 추상화, 상속, 다형 개념, 동적 바인딩 등이 있으며 추가적으로 다중 상속 등의 특징이 존재한다. 객체 지향 프로그래밍은 자료 추상화를 기초로 하여 상속, 다형 개념, 동적 바인딩이 시스템의 복잡성을 제어하기 위해 서로 맞물려 기능하는 것이다.
사람이 말로 표현 가능한 모든 것을 객체라 할 수 있다.
소프트웨어 공학의 관점에서 볼 때 S/W의 질을 향상하기 위해 강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 지향해야 하는데, OOP의 경우 하나의 문제 해결을 위한 데이터를 클래스에 모아 놓은 데이터형을 사용함으로써 응집력을 강화하고, 클래스간에 독립적인 디자인을 함으로써 결합력을 약하게 한다.
자료 추상화
자료 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통해서 자료형의 정보를 은닉할 수 있다. 객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴스를 객체, 추상 자료형에서 정의된 연산을 메소드(함수), 메소드의 호출을 생성자라고 한다.
상속
상속은 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스를 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상속을 통해서 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다.
다중 상속
다중 상속은 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능이다. 클래스들의 기능이 동시에 필요할 때 용이하나 클래스의 상속 관계에 혼란을 줄 수 있고(예: 다이아몬드 상속) 프로그래밍 언어에 따라 사용 가능 유무가 다르므로 주의해서 사용해야 한다. 자바는 지원하지 않는다.
다형성 개념
다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)이나 오버로딩(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.
동적 바인딩
동적 바인딩은 실행 시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩으로 컴파일 시간에 완료되어 변화하지 않는 정적 바인딩과 대비되는 개념이다. 동적 바인딩은 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다.
(위키백과)
type()
타입을 알아보는 내장 함수
print(type(li)) # <class 'list'>
n = 10
print(type(n)) # <class 'int'>
print(type("hello")) # <class 'str'>
■ str(문자열) 객체 메소드 함수
upper()
모두 대문자로 변경
s = "Hello"
print(s.upper())
lower()
모두 소문자로 변경
s1 = "Hello"
print(s1.lower())
strip()
문자열 양쪽 끝의 특정 문자를 제거
s2 = " Hello "
print(s2.strip())
lstrip(), rstrip()
왼쪽 오른쪽 끝의 특정 문자 제거
print(s2.lstrip())
print(s2.rstrip())
split()
구분자로 분할하여 리스트로 반환. 잘 쓰임.
s3 = "Hello,World,Python"
print(s3.split())
replace()
처음에는 바꾸고 싶은 문자, 뒤에는 바꿔 넣고 싶은 문자
원본 수정한 게 아니라 새로운 문자열을 만들어 내는 것이다. immutable 리턴값을 출력한 거임.
string은 immutable이라 수정이 안된다.
재할당은 화살표 바꾼 것
수정은 그 위치의 데이터 자체를 변경한 것
print(s3.replace(',', ' ')) # Hello World Python 새로운 데이터를 만들어냈다.
print(s3) # Hello,World,Python 이렇게 원본은 그대로 있다.
s4 = "Hello"
s5 = s4.lower() ### s5 = s4.replace("H", "h") ### 이렇게 해도 같다. 얘들은 재할당이에여
print(s5)
self 매개변수(parameter)
모든 메소드의 첫번째 매개변수
메소드의 정의에는 사용되지만, 호출에는 사용되지 않음
객체 자신을 참조하여(class안에서) 클래스에 정의된 멤버에 접근할 때 사용.
class에서 객체를 만들고 변수에 넣고, 변수.메소드() 로 호출합니다.
호출할 때는 메소드의 변수 안에 표시한 self라는 파라미터는 넣지 않아요
class Person:
def say(self):
self.name = "사람1"
print("Hello")
def move(self):
pass
def eat(self, food):
print(f"{food}을 먹었습니다.")
def sleep(self):
print(f"{self.name}이 잠을 잤습니다.")
person1 = Person()
person1.say()
person1.eat("밥")
person1.sleep()
initializer 초기자
initialize : 초기 내용을 설정하다
초기화 할 때 하는 일들을 정의하는 것.
instance를 initialize한다. 값을 가지게 한다.
instance가 생성될 때, 변수에 객체의 값을 할당할 때 생긴다.
class의 초기값 입력받을 때 사용됨
멤버 변수를 사용할 때 self.변수에 prameter 값 받아서 사용하고
초기자에서 정의한 값을 다른 메소드에서 활용하는 것도 일반적이다.
class Person:
def __init__(self, name, age, gender, phone): # initialize할 때 자동 호출되는 함수
self.name = name
self.age = age
self.gender = gender
self.phone = phone
print("initialize")
def say_name(self):
print(self.name)
print("before")
person2 = Person("이름", 20, "남자", "010-1234-5678")
print("after")
person2.say_name()
Person 클래스에 introduce 메소드(클래스 안에 있는 함수)를 추가하고
이름, 나이, 성별을 print하는 메소드
class Person:
def __init__(self, name, age, gender, phone): # initialize할 때 자동 호출되는 함수
self.name = name
self.age = age
self.gender = gender
self.phone = phone
print("initialize")
def say_name(self):
print(self.name)
def introduce(self):
print(f"안녕하세요. 저는 {self.name}입니다.")
print(f"나이는 {self.age}살이고, 성별은 {self.gender}입니다.")
print(self.name, self.age, self.gender)
print("before")
person2 = Person("김땡땡", 20, "남자", "010-1234-5678")
print("after")
person2.say_name()
# 멤버 변수를 사용할 때 self.를 사용하고.
# 다른 메소드에서는 초기화에 정의한 것을 사용하는 게 일반적이다.
person2.introduce()
# 안녕하세요. 저는 김땡땡입니다.\n
#나이는 20살이고, 성별은 남자입니다.\n김땡땡 20 남자 # 이렇게 출력됨
공통된 요소를 사용하여 데이터를 손쉽게 가공할 수 있다.
관계형 데이터 베이스 (표의 형태로 저장되어 있음)
객체 관계형 데이터 베이스 : 한 줄씩 추상화해서 일반화하니까 객체화해서 사용할 수 있다.
같은 형식으로 만들고 같은 동작으로 움직이게 만들면 프로그래밍해서 사용하기 좋다.
다른 많은 프로그래밍 언어에서도 관계형 데이터 베이스 사용함
나중에 데이터 베이스 할 때 여러가지 개념을 배울 것임 protected private bector sector ...
Relational Data base 관계형 데이터 베이스
(컴퓨터인터넷IT용어대사전, 2011. 1. 20., 전산용어사전편찬위원회)
relational data base의 약어. 데이터를 계층 구조가 아닌 단순한 표(릴레이션 ; 관계)로 표현하는 형식의 데이터 베이스. 종래 CODASYL형의 데이터 베이스의 경우, 데이터끼리를 관계지은 포인터 등을 더듬어 찾지만, 관계(형) 데이터 베이스에서는 그럴 필요가 없고, 표(table)로 자유롭게 가로세로의 항목(item)을 액세스할 수 있도록 되어 있다. 이용자는 「표」의 분할, 결합을 자유롭게 할 수 있고, 표로의 추가, 변경도 다른 영향을 받지 않게 행할 수 있다. IBM 산노제 연구소의 E.F. Codd가 70년대 초에 제안한 것으로 그 후 대학과 연구소에서 실용화로의 시도가 계속되어 왔다. 대표적인 것으로 IBM의 DB2가 있다. 종래의 데이터 베이스에서는 논리적 데이터 구조(logical data structure)를 의식해서 프로그램을 만들었는 데 비해서 릴레이셔널 데이터 베이스에서는 데이터 항목의 그룹은 집합론이라는 「관계」의 개념에 따라서 정의된다. 데이터 독립성이 높으며, 결합(join), 제약(restriction), 투영(projection) 등 관계 조작에 의해서 비약적으로 표현 능력을 높게 할수 있다. 또 이들의 관계 조작에 의해서 자유롭게 구조를 바꿀 수 있는 것이 관계형 데이터 베이스의 특징이다.

(IT용어사전, 한국정보통신기술협회)
관계형 모델(relational model)에 따라 키(key)와 값(value)을 표(table) 형태로 구성한 데이터베이스.
관계형 데이터베이스(RDB: Relational DataBase)는 1970년대 IBM의 에드거 F. 커드(E. F. Codd)가 제안한 관계형 모델(relational model)을 바탕으로 개발되었다. 관계형 모델은 실제 세계의 데이터를 수학적 논리 관계 개념을 사용하여 행(row)과 열(column)로 표현한 표(table)와 행과 열의 상관관계로 정의하는 데이터 모델이다.
- 표(table): 데이터를 저장하는 객체로서 관계형 데이터베이스의 기본 단위
- 행(row): 가로 방향으로 이루어진 연결된 값
- 열(column): 세로 방향으로 이루어진 특정 속성 값(더이상 나눌 수 없는 특성)
표(table)는 각 행과 열에 대응하는 값(value)을 가지며, 행(row)의 검색을 위해 식별자로 사용되는 열을 키(key)라고 한다.
이전 데이터베이스는 응용 프로그램에 따라 특화된 구조를 갖도록 개발되어 응용 프로그램별로 서로 다른 구조를 가져 비효율적이며 유지·관리가 어려웠다. 이와는 다르게 관계형 데이터베이스(RDB)는 스프레드시트(spreadsheet)와 유사하게 데이터를 단순한 표(table) 형태로 저장하여 일반적으로 사용자가 이해하기 쉽다. 또한 구조화된 질의 언어(SQL: Structured Query Language)를 이용하여 저장된 데이터를 관리(검색, 추가, 갱신, 삭제)함으로써 데이터를 쉽게 이용하고, 응용 프로그램의 변경 없이도 데이터 항목을 쉽게 확장할 수 있다는 장점이 있다. 그뿐만 아니라 특정 표(table)에 대한 접근 권한 관리 등 다양한 보안 기능을 제공하여 데이터 공유 환경에서 효과적이다. 반면 처음에 설계했던 데이터베이스 구조가 시간이 지남에 따라 확장, 변경되면서 이를 최적화하거나 유지하고, 관리하는 데 상대적으로 많은 비용이 든다.
상용 프로그램으로는 오라클(Oracle), 마이크로소프트의 SQL server, IBM의 DB2 등이 가장 많이 사용되고 있으며, 프리웨어로는 MariaDB, PostgreSQL, SQLite 등이 있다.
inheritance 상속
class Animal:
def __init__(self, name): # initialize 메소드 매개 변수 name 값 입력받음
self.name = name # 멤버 변수에 저장. 위 아래 name은 값이 같은 다른 변수!
print(f"{self.name}가 생성되었습니다.")
def say(self):
print("")
class Dog(Animal): # 부모 클래스인 Animal class 객체를 상속받아서 Dog class 객체를 만들겠다.
# 상속받은 인스턴스의 메소드 재정의, 메소드 오버라이딩 method overriding(덮어쓰기)
def say(self):
print("멍멍")
my_dog = Dog("백구")
my_dog.say()
class Cat(Animal):
def say(self):
print("야옹")
my_cat = Cat("달래")
my_cat.say()
class Student:
def __init__(self, name, age, school, grade):
# 이름, 나이, 학교, 학년을 멤버변수로 저장하는 메소드를 만드세요..
self.name = name
self.age = age
self.school = school
self.grade = grade
def introduce(self):
# 이름, 나이, 학교, 학년을 print하는 method를 정의하세요.
print(f"{self.name}, {self.age}, {self.school}, {self.grade}")
stu1 = Student("홍길동", 20, "서울대학교", 1)
stu2 = Student("손흥민", 21, "서울대학교", 2)
stu3 = Student("류현진", 22, "서울대학교", 3)
stu_list = [stu1, stu2, stu3]
for stu in stu_list:
stu.introduce()
# MyCalculator 클래스로 만들어보세요.
# add, sub, mul, div 메소드
class MyCalculator:
def __init__(self):
pass
def add(self, n1, n2):
print(f"{n1} + {n2} = {n1+n2}")
def sub(self, n1, n2):
print(f"{n1} - {n2} = {n1-n2}")
def mul(self, n1, n2):
print(f"{n1} * {n2} = {n1*n2}")
def div(self, n1, n2):
print(f"{n1} / {n2} = {n1/n2}")
my_calculator = MyCalculator()
while True:
print("""
계산기 표시
1: +
2: -
3: *
4: /
q: 종료
""")
operator = input("원하는 계산을 입력하세요.")
n1 = int(input("정수 1: "))
n2 = int(input("정수 2: "))
if operator == 'q':
break
if operator == "1":
my_calculator.add(n1, n2)
elif operator == "2":
my_calculator.sub(n1, n2)
elif operator == "3":
my_calculator.mul(n1, n2)
elif operator == "4":
my_calculator.div(n1, n2)
else:
print("잘못 입력하였습니다.")
Module 모듈
파이썬 모듈 뜻 : 함수, 변수, 클래스 모아놓은 파이썬 파일이나 모듈. 코드 묶음
다른 파이썬 프로그램에서 불러와서 사용
import 명령어로 불러옴
import 모듈이름
모듈 [module]
소프트웨어나 하드웨어의 일부로, 큰 전체 시스템 및 체계 중 다른 구성 요소와 독립적인 하나의 구성 요소를 말한다. 컴퓨터 분야에서의 모듈이란 독립적인 하나의 소프트웨어 혹은 하드웨어 요소를 말하며, 각각 다음과 같은 개념을 의미한다.
1) 소프트웨어 모듈
프로그램의 기능을 독립적인 부품으로 분리한 것을 모듈이라고 하며, 모듈화 프로그래밍이란 이러한 분리를 강조하여 유지 보수와 타 프로그램에서의 코드 재사용을 손쉽게 하는 소프트웨어 설계 기법을 말한다. 모듈은 일반적으로 서브루틴과 데이터 구조의 집합체로서, 그 자체로서 컴파일 가능한 단위이며, 재사용 가능하고 동시에 여러 다른 모듈의 개발에 사용될 수 있다. 모듈의 인터페이스는 모듈에 의해 제공되거나 필요로 되는 요소들을 표현한다. 모듈의 개념을 명시적으로 지원하는 언어로는 Ada, FORTRAN, Pascal, Python, Ruby 등이 있으며, 일반적으로 프로그래밍 언어에 따라 모듈의 개념을 패키지라 부르기도 하며 그 규모도 언어마다 상이하다.
2) 하드웨어 모듈
컴퓨터 하드웨어나 전자공학에서의 모듈은 컴퓨터 내에서 기본적인 기능을 제공하기 위해 하나의 회로 보드로 패키지화 된 독립적인 전자 회로, 혹은 큰 장치 내에서 독립적으로 설치 및 교체되고 사용되도록 설계된 작은 구성요소를 말한다. 예를 들어 NOT 게이트와 같이 더 큰 논리 유닛을 만들기 위한 기본 논리 회로나, RAM과 같은 메모리 모듈을 모두 하드웨어 모듈이라 볼 수 있다.
(두산백과 두피디아, 두산백과)
import
아래 코드의 첫 행은 my_module이라는 모듈 자체를 호출함. .py(파이썬 파일)나 module 불러옴
두 번째 세 번째 행에서는 my_module 안에 있는 add()와 sub() 메소드를 호출한다.
import my_module
my_module.add(1, 2)
my_module.sub(1, 2)
from ~ import
"모듈이름"이라는 모듈안에 있는 "모듈함수"나 "모듈함수1", "모듈함수2"를 골라서 가져올 수 있다.
import * 으로 전체를 다 가져오는 경우
호출한 파일에 있는 모든 실행 코드가 실행되면서 불필요한 연산이 있을 수 있다.
from 모듈이름 import 모듈함수
from 모듈이름 import 모듈함수1, 모듈함수2
from 모듈이름 import * # 전체 다 가져오겠다.
모듈에서 특정 함수만 호출함
from my_module import add, sub # add, sub 메소드만 가져옴
add(1, 2)
sub(1, 2)
from my_module import * # 모듈 내용 전체를 가져옴
add(1, 2)
sub(1, 2)
모듈 내용을 모두 가져옴
이럴 때 가져오는 파일의 실행 부분까지 자동으로 실행될 수 있다.
import my_module
가져오고 싶은 파일의 실행 부분을 import 했을 때 자동실행되지 않도록 아래의 구문을 넣어준다.
아래 코드는 import 당하는 대상인 my_module.py 파일의 내용이다.
if __name__ == "__main__":
만약 main과 name이 같지 않다면 아래의 코드를 실행하지 않는다.
저장해 둔 코드를 재사용할 때 결과값이 출력되도록
호출하는 파일이나 모듈이 어디서 왔는지 구분하기 위해 사용하는 명령어
파이썬은 특별한 변수들에 __ 언더바 두개로 표시를 해 주었다. A라는 파일에서 B(파일이나 모듈)를 import 했을 때, import 코드를 적어서 불러오는 파일 A / 프로그램 실행하는 자리의 이름은 메인(__main__)이 되고, 불러온 파일의 이름은 B라는 파일 이름이 된다. 파이썬 프로그램 실행 시 실행됨
def add(a, b):
return a + b
def sub(a, b):
return a - b
if __name__ == "__main__":
print(add(1, 2))
print(sub(1, 2))
다른 파이썬 모듈(파일이나 모듈)에서 호출하는 MyCalculator 인스턴스는 무사히 받아올 수 있도록
반드시 실행 부분만 if __name__ == "__main__": 안에 넣어 줄 것
class MyCalculator:
def __init__(self):
pass
def add(self, n1, n2):
print(f"{n1} + {n2} = {n1+n2}")
def sub(self, n1, n2):
print(f"{n1} - {n2} = {n1-n2}")
def mul(self, n1, n2):
print(f"{n1} * {n2} = {n1*n2}")
def div(self, n1, n2):
print(f"{n1} / {n2} = {n1/n2}")
if __name__ == "__main__": # 실행 부분만 들여줘야 한다.
my_calculator = MyCalculator()
while True:
print("""
계산기 표시
1: +
2: -
3: *
4: /
q: 종료
""")
operator = input("원하는 계산을 입력하세요.")
n1 = int(input("정수 1: "))
n2 = int(input("정수 2: "))
if operator == "q":
break
if operator == "1":
my_calculator.add(n1, n2)
elif operator == "2":
my_calculator.sub(n1, n2)
elif operator == "3":
my_calculator.mul(n1, n2)
elif operator == "4":
my_calculator.div(n1, n2)
else:
print("잘못 입력하였습니다.")
예외 처리
아래와 같이 오류가 발생할 때, 오류 발생을 잡아내서 예외 처리하는 것
IndexError: list index out of range
li = [1, 2, 3, 4, 5]
li[100]
ZeroDivisionError: division by zero
100 / 0
FileNotFoundError: [Errno 2] No such file or directory: '없는파일'
f = open("없는파일", "r")
try ~ except ~ else
try안의 코드가 오류를 발생시키는 것이 확인되면
Exception이 어떤 에러든 예외 처리하며 에러 발생 메시지 "division by zero"를 출력하고
그 다음 작업을 진행하여 "에러 발생 후"도 출력됨
try:
100 / 0
except Exception as e: # Exception 에러객체를 이용하여 에러발생 하면 에러 메시지를 출력해줌
print(e)
print("에러 발생 후")
try안의 코드가 오류를 발생시키는 것이 확인되면
ZeroDivisionError가 해당 에러를 예외 처리하며 에러 발생 메시지 "division by zero"를 출력하고
그 다음 작업을 진행하여 "에러 발생 후"도 출력됨
try:
100 / 0
except ZeroDivisionError as e:
print(e)
print("에러 발생 후")
try안의 코드가 오류를 발생시키는 것이 확인되면
ZeroDivisionError가 해당 에러와 달라서 예외 처리하려다 실패함
(try에 넣은 코드가 일으키는 에러는 IndexError이다.)
터미널 창에 IndexError에러 메시지가 뜨고 프로그램 진행은 멈추므로,
그 다음 작업인 "에러 발생 후" 출력도 진행되지 않는다.
# 에러남
try:
[1, 2, 3, 4, 5][100]
except ZeroDivisionError as e:
print(e)
print("에러 발생 후")
try안의 코드가 오류를 발생시키는 것이 확인되면
여러 개를 넣어주면 try 안에서 발생한 에러와 맞아 떨어지는 예외처리 구문이 실행되어
에러 발생 메시지 "list index out of range 인덱싱할 수 없습니다."를 출력하고
그 다음 작업을 진행하여 "에러 발생 후"도 출력됨
try:
[1, 2, 3, 4, 5][100]
except ZeroDivisionError as e:
print(e)
except IndexError as e:
print(e)
print("에러 발생 후")
finally
예외 발생 여부와 상관없이 항상 수행해야하는 코드
try:
f = open("없는 파일", "r")
except:
print("에러 발생")
finally:
f.close()
else
오류가 발생하지 않으면 실행되는 코드
try:
age = int(input("나이: "))
except:
print("입력이 잘못 되었습니다.")
print("숫자를 입력해주세요.")
else:
if age >= 20:
print("성인입니다.")
else:
print("미성년입니다.")
raise NotImplementedError
아직 개발하지 않은 곳에서 일부러 에러를 발생시킨다. 아직 구현하지 않은 부분이라는 메세지를 강제로 발생시킴.
class Bird:
def fly(self):
raise NotImplementedError # raise 뒤에는 에러 객체 NotImplementedError가 와야 한다.
my_bird = Bird()
my_bird.fly()
※ calculator파일 , module파일을 실행하면서 cash파일 자동으로 생성됨
빠르게 실행시키려고 처음 파이썬 언어로 읽은 후, 바이트 언어(기계어) 파일로 번역해 저장해 두는 거..
다음에는 바이트로 읽음 그래서 처리속도 빠름.