while
조건이 참인 동안에 명령을 반복해서 수행
반복할 명령은 들여 쓰기로 구분, 조건이 거짓이면 들여 쓰기로 구분되어 있는 반복 구문을 탈출
while 구문 :
pass # 수행할 문장
while문은 조건을 먼저 선언해야 함
+ while로 무한반복
= while 문의 조건이 항상 True이면 무한 반복을 만들 수 있음
실행을 중지시키려면 colab에 정지버튼 or Ctrl(Command)+C를 눌러 수동으로 중지
= 종료 조건을 명확하게 설정하여 무한 반복이 일어나지 않도록 해야 함
중첩 while문
while문 안에 while문을 포함 (for문과 마찬가지로 예를 들어 구구단, 별 찍기 등이 있음)
i = 2
while i < 10 :
j = 1
while j < 10 :
print(f'{i} X {j} = {i * j}')
j += 1
i += 1
왈러스 (Walrus, :=) 연산자
할당 표현식(assignment expressions)을 사용하게 해주는 연산자
한국어로는 바다코끼리
연산자는 변수에 값을 할당하고 그 값을 평가
x = (n := 10) * 2
print(x)
print(n)
+ n := 10은 10을 n에 할당, 그 값을 10으로 평가하여 반환한 결과에 2를 곱한 값이 x에 할당
while문, for문에서도 사용 가능함
+ while loop에서의 활용
왈러스 연산자 사용 시 random.randint(0, 10)을 한 번만 호출하면서 결과를 x에 할당하고 그 값을 조건문에 바로 사용 가능
+ 왈러스 연산자 주의사항
복잡한 표현식 내에서 왈러스 연산자의 남용을 피해야 함
복잡한 한 줄 코드보다 여러 줄에 걸친 명확한 코드가 유지보수와 이해(가독성)에 더 좋을 수 있음
break
반복문(while, for)을 실행 중에 중단하고 나오기 위해 사용되는 명령
break는 for문이나 while문에만 탈출
x = 0
while x < 10:
print(x)
if x == 5 :
break
x += 1
+ 9까지 출력하지 않았음에도 x == 5 조건을 만나 break 됨
중첩 반복문에서도 탈출 가능
continue
반복문이 실행하는 코드 블록의 나머지 부분을 실행하지 않고 다음 반복으로 건너게 흐름을 조정
잘못 사용하게 되면 무한반복에 빠질 수 있음
pass
아무런 동작을 하지 않고 다음 코드를 실행
아무런 동작도 하지 않고 지나쳐서 에러가 나지 않도록 해주는 역할
모든 반복문 한 번에 탈출
변수를 하나 더 두어 여러 반복문을 탈출
= 이 방법은 반복문이 더 중첩될 경우 코드의 복잡도가 올라갈 수 있음
+ try와 except는 예외처리를 하는 구문으로 예외를 발생시켜 전체 구문을 탈출하게 하는 방법
else
if문 뿐만 아니라 while, for 문에서도 else문을 사용할 수 있음
if에서의 else처럼 '그렇지 않으면'이라는 의미보다는 '그런 다음'이라는 의미가 더 강하기 때문에 than으로 쓰여야 된다는 논의가 있었음
정상적으로 반복이 종료된 후 특정 코드를 실행하게 해야 할 때 while~else, for~else를 사용할 수 있음
for, else
for문에서의 else는 루프가 정상 종료되었을 때나 처음부터 자료형이 비어있었을 때 실행
중간에 break문을 만나면 else 문은 실행하지 않음
for 변수 in 범위 :
pass # 반복 실행할 코드
else :
pass # 반복문이 모두 실행되어 종료되고 실행할 코드
for문이 종료된 후 else문이 실행
(break문 없이 정상 종료되었을 때에는 else문이 실행, break문이 있을 경우에는 else문을 실행하지 않음)
while, else
for와 마찬가지로 while문에서도 else는 정상 종료되었을 때 실행
처음부터 while의 조건문이 False일 경우에도 실행
while 조건 :
pass # 반복 실행할 코드
else :
pass # while 반복문이 모두 실행되어 종료되고 실행할 코드
클래스 (Class)
클래스는 데이터(멤버 또는 애트리뷰트, 변수)와 기능(메서드, 함수)을 가지고 있는 일종의 설계 도면
객체를 표현하기 위한 문법 (특정한 개념이나 모양을 존재하는 것을 객체(object)라 함)

클래스 변수
클래스 변수는 클래스 바로 하위에 자리하고 있는 변수들
클래스 이름, 인스턴스 이름을 통해서 접근할 수 있음
클래스 변수는 해당 클래스를 통해 만들어진 모든 인스턴스 객체들이 공유하는 변수 값
+ 각 인스턴스 객체들 각자가 관리하고 있는 변수는 인스턴스 변수
인스턴스 변수
self가 위치한 어디서나 선언이 가능하지만 보통 __init__ 메서드 안에서 선언
__init__ 메서드는 다른 프로그래밍 언어에서 생성자(constructor)라 불림
언더바가 2개 앞 뒤로 있는 메서드는 매직 메서드, 던더 함수
이 메서드는 인스턴스 객체를 생성할 때 자동으로 실행
+ 인스턴스 객체가 모두 공통으로 공유하는 값이 클래스 변수라면,
인스턴스 변수는 각 인스턴스 객체가 가지고 있는 값으로 인스턴스 내부에서만 사용이 가능
self가 있는 곳에서 선언된 변수들은 인스턴스의 영역으로 간주되어 dot으로 호출할 수 있음
다른 인스턴스와 메모리 영역을 공유하지 않고 추가 또는 변경이 될 수 있음
다른 자료형의 인스턴스 변수 변경
+ 함수도 class인데 인스턴스 변수를 생성할 수 있을까?
def hello() :
print('hello world')
print(type(hello))
# 출력: <class 'function'>
hello.hi = 'hi, world'
hello.hi
# 출력: hi, world
1. 함수는 일종의 객체로 취급, 변수에 할당/인자로 전달/다른 객체처럼 속성을 가질 수 있음
2. 함수의 타입은 function : type(hello)를 출력했을 때 <class 'function'>이라는 결과, 이는 hello가 함수 타입
3. 함수에 새로운 속성을 추가할 수 있음, 예제에서는 hello.hi = 'hi, world'라는 코드를 통해 hello 함수에 hi라는 속성을 추가
4. 추가한 속성은 함수 내에서 사용 가능, hello.hi를 호출하면 'hi, world'가 출력
5. 이러한 속성 추가는 모든 객체에 허용되지 않음, 기본적으로 내장된 자료형(예: 정수, 문자열)은 속성을 추가할 수 없음
클래스, 인스턴스 변수 추가설명
클래스 변수
정의 : 클래스 변수는 클래스 정의 내에 선언되며, 클래스의 모든 인스턴스 간에 공유
클래스 변수는 클래스가 메모리에 로드될 때 생성
용도 : 클래스 변수는 해당 클래스의 모든 인스턴스에서 공통적으로 사용되는 값을 저장하는 데 사용
ex) 모든 Car 객체에 공통적으로 적용되는 기본 속도 설정과 같은 경우에 사용
접근 방법 : 클래스 이름을 통해 접근하거나 self를 통해 인스턴스를 통해서도 접근할 수 있음
ex) Car.default_speed
특징 : 클래스 변수의 값을 변경하면, 해당 클래스의 모든 인스턴스에 대해 변경사항이 적용
인스턴스 변수
정의 : 인스턴스 변수는 클래스의 각 인스턴스(객체)에 속하는 변수
이 변수들은 각 인스턴스마다 별도로 존재하며, 인스턴스 생성 시에 만들어짐
용도 : 인스턴스 변수는 개별 객체의 상태를 저장하는 데 사용
ex) 여러 Car 객체가 있을 때 각 Car의 속도나 색상 같은 고유한 속성을 인스턴스 변수로 저장 가능
접근 방법 : self 키워드를 사용하여 인스턴스 내에서 이 변수에 접근하고 수정
ex) self.speed = 200
특징 : 각 인스턴스의 변수는 서로 독립적
한 인스턴스에서 변수의 값을 변경해도 다른 인스턴스의 동일한 변수에는 영향을 주지 않음
(modelx, modely가 있는데 modelz의 speed 300 → 500)


클래스는 왜 써야 할까?
1. 속도
클래스를 사용하여 구조적으로 다시 설계
사용하는 변수 외 메서드를 최소화하여 메모리 구조를 최적화하고, 구조적으로 빠른 속도를 실현하게 구현
2. 재사용성
한 번 클래스를 작성하면, 그 클래스를 기반으로 여러 객체를 만들 수 있음
반복적으로 만들어야 하는 여러 객체를 구조적으로 만들 수 있음

에러 종류
1. 문법 에러(Syntax Error) : 코드 작성 시 오타나 문법적인 오류가 있을 경우 발생
2. 이름 에러(Name Error) : 정의되지 않은 변수나 함수를 호출했을 때 발생
3. 타입 에러(Type Error) : 서로 다른 타입의 변수 간 연산이나 함수 호출 시 발생
4. 인덱스 에러(Index Error) : 리스트나 튜플 등의 시퀀스 타입에서 존재하지 않는 인덱스를 호출했을 때 발생
5. 키 에러(Key Error) : 딕셔너리에서 존재하지 않는 키를 호출했을 때 발생
6. 값 에러(ValueError) : 내장 함수나 메서드의 인자로 전달된 값의 타입이나 값이 유효하지 않을 때 발생
7. 제로 나누기 에러(ZeroDivisionError) : 0으로 나누기 연산을 수행할 때 발생
8. 어트리뷰트 에러(Attribute Error) : 객체에 존재하지 않는 속성이나 메서드를 호출했을 때 발생
9. 인자 개수 에러(TypeError) : 함수나 메서드에 전달된 인자의 개수가 맞지 않을 때 발생
10. 파일 입출력 에러(File I/O Error) : 파일을 열거나 쓰거나 읽을 때 발생할 수 있음, 파일이 존재하지 않거나 권한이 없는 경우
예외 처리
= 예외 상황을 처리하는 방법
google convention에서는 try와 except를 최소 단위로 사용하길 권고
예외
= 프로그램이 실행 중 예기치 않은 상황이 발생하여 프로그램이 종료
Python에서는 try except 구문을 사용하여 예외 처리를 할 수 있음
1. try + except
try :
# 예외가 발생할 가능성이 있는 코드
except :
# 예외 처리 코드
2. try + except + else
try :
# 예외가 발생할 가능성이 있는 코드
except :
# 예외 처리 코드
else :
# 예외가 발생하지 않을 때 실행되는 코드
3. try + finally
try :
# 예외가 발생할 가능성이 있는 코드
finally :
# 예외 발생 여부와 상관없이 항상 실행되는 코드
4. try + except + finally
try :
# 예외가 발생할 가능성이 있는 코드
except :
# 예외 처리 코드
finally :
# 예외 발생 여부와 상관없이 항상 실행되는 코드
5. try + except + else + finally
try :
# 예외가 발생할 가능성이 있는 코드
except :
# 예외 처리 코드
else :
# 예외가 발생하지 않을 때 실행되는 코드
finally :
# 예외 발생 여부와 상관없이 항상 실행되는 코드
+ try~except~else문에서 else는 예외가 발생하지 않을 때 쓰임
로깅 (Logging)
경고, 접근, 에러, 예외 처리, 특정 함수 사용 등에 대한 기록을 남기는 행위
주로 화면에 출력하거나 DB 또는 일반 plane text로 남기는 방식을 사용
로그기록이 너무 많을 경우 시스템에 부하를 줄 수 있으며, 일반적인 편집기가 읽지 못할 수 있음
logging 모듈을 사용하면 다양한 레벨의 로그를 남길 수 있음
을 끝으로 오늘 반복문과 클래스에 대해 알아보고 예외처리에 대해서도 공부하였습니다.
클래스는 정리하면서도 헷갈리는 부분이 많네요 :(
따로 더 공부해서 필기를 업로드하도록 해보겠습니다!
그리고 오늘 할 일 목록 만들기를 진행하여서 사진으로 첨부합니다 :)
+ 할 일 목록 실습



자세한 파일은 제 GitHub 참고 하시면 될 것 같아요.
https://github.com/soohyun020812/ormcamp
GitHub - soohyun020812/ormcamp: 오름캠프 교육에서 활용한 실습 내용들 정리
오름캠프 교육에서 활용한 실습 내용들 정리. Contribute to soohyun020812/ormcamp development by creating an account on GitHub.
github.com