• upper() – 대문자로 변경
      • “Hello World”.upper() = “HELLO WORLD”
    • lower() – 소문자로 변경
      • “Hello World”.lower() = “hello world”
    • swapcase() – 대문자는 소문자로, 소문자는 대문자로 변경
      • “Hello World”.swapcase() = “hELLO wORLD”
    • capitalize() – 첫 글자만 대문자로 변경
      • “hello WORLD”.capitalize() = “Hello world”
    • title() – 단어 별 첫 글자만 대문자로 변경
      • “hello WORLD”.title() = “Hello World”
    • count(char [, start, end]) – 문자열 index가 start이상 end미만인 위치에 char가 몇 개 있는지 반환
      • “hello world”.count(‘l’) = 3
      • “heLLo world”.count(‘l’) = 1
      • “hello world”.count(‘l’,3) = 2
      • “hello world”.count(‘l’,3,9) = 1
    • find(char[, start, end]) – 문자열 index가 start이상 end미만인 위치에 char의 인덱스를 반환
      • 내부에 char가 여러 개인 경우 첫 인덱스를 반환
      • char가 없으면 -1 반환
      • “hello world”.find(‘rl’) = 8
      • “hello world”.find(‘rl’,3) = 8
      • “hello world”.find(‘rl’,3,9) = -1
    • index(char[, start, end]) – 기본 사용법은 find와 같음
      • 리스트와 튜플에서도 사용 가능
      • 내부에 char가 없으면 ValueError발생
      • (“hello”, “world”).index(“world”) = 1
    • rfind(char[, start, end]) – 문자열 index가 start이상 end미만인 위치에 char의 인덱스를 반환
      • 내부에 char가 여러 개인 경우 마지막 인덱스를 반환
      • char가 없으면 -1 반환
      • “hello world”.rfind(‘o’) = 7
      • “hello world”.rfind(‘o’,8) = -1
      • “hello world”.rfind(‘o’,3,7) = 4
    • center(length [,fillChar] ) – length 길이에서 중앙 정렬. fillChar로 나머지 부분 채움(생략 시 공백)
      • length가 문자열보다 작은 숫자일 때, 문자열을 그대로 반환한다.
      • 좌 우 fillChar 갯수가 다른 경우, 오른쪽이 하나 더 많게 반환한다.
      • “hello world”.center(16,’*’) = “**hello world***”
    • strip() – 문자열 양쪽의 공백을 제거한다.
      • ” hello world “.strip() = “hello world”
    • rstrip() – 문자열 우측의 공백을 제거한다.
      • ” hello world “.rstrip() = ” hello world”
    • lstrip() – 문자열 좌측의 공백을 제거한다.
      • ” hello world “.lstrip() = “hello world “
    • replace(old, new [,count] ) – old를 new로 변경. 앞에서부터 count갯수 만큼
      • “su su su super nova”.replace(‘su’,”*”) = “* * * *per nova”
      • “su su su super nova”.replace(‘su’,”*”,2) = “* * su super nova”
    • split(sep=None, maxsplit=-1) – 문자열을 sep기준으로 나누어 배열로 반환. 분할 횟수는 maxsplit이며 해당 옵션이 -1인 경우 모두 분할한다.
      • sep이 None인 경우 공백(스페이스, 탭, 줄 바꿈)을 기준으로 분할한다.
      • sep으로 지정한 문자(문자열)는 사라진다.
      • “hello world”.split() = [“hello”, “world”]
      • “hello world hello world hello world”.split(‘hello’,2) = [”, ‘ world ‘, ‘ world hello world’]

  • 테이블의 생성(CREATE TABLE)

    CREATE TABLE 테이블명(
        컬럼1 데이터타입 제약조건,
        컬럼2 데이터타입 제약조건,
        ....
        PRIMARY KEY 컬럼명
    );

    테이블의 삭제(DROP TABLE)

    DROP TABLE 테이블명;

    CRUD – Create(생성), Read(조회), Update(수정), Delete(삭제)

    • Create (생성: INSERT)
      • INSERT INTO 테이블명 (컬럼1, 컬럼2 … ) VALUES (값1, 값2 … );
      • 테이블에 새로운 행(row)을 추가
      • (컬럼 1, 컬럼2 .. )를 생략하면 모든 컬럼의 값을 추가
    • Read(조회: SELECT)
      • SELECT 컬럼1, 컬럼2 … FROM 테이블명 ( WHERE 조건 ) ;
      • 테이블에서 원하는 데이터를 조회
      • 모든 컬럼 선택은 * 기호로 가능
    • Update(수정: UPDATE)
      • UPDATE 테이블명 SET 컬럼1 = 값1, 컬럼2 = 값2 WHERE 조건;
      • WHERE절을 생략하면 모든 row의 값이 변경됨
    • Delete(삭제: DELETE)
      • DELETE FROM 테이블명 WHERE 조건;
      • WHERE절을 생략하면 모든 row가 삭제됨

    데이터베이스는 진입장벽이 낮아, 테이블 생성과 CRUD만 사용이 가능해도 기본적인 데이터베이스를 사용하는것이 가능하다.

    물론 “잘” 사용하는 것과는 별개의 이야기이다.

  • PuTTy, mobaXterm, secureCRT.. 등 수많은 ssh 접속 프로그램들이 각기 자신만의 장단점을 가지고 있다.

    Tabby는 적은 수의 서버에 접속할 때, 가볍지만 강력하게 사용할 수 있는 프로그램이다.

  • 주로 웹 서버(web server)를 위한 웹 프레임워크(web framework) 라이브러리

    장점: 가볍다.

    단점: 대규모 프로젝트에 한계가 있다.

    1. 설치
    pip install Flask
    2. 기본 사용법
    from flask import Flask
    
    # Flask 객체 생성. __name__은 현재 모듈의 이름
    app = Flask(__name__)
    
    @app.route('/') # 해당 경로에서 실행
    def main():
        # 브라우저에 반환할 내용
        return 'Hello, World!'
    
    # 서버 실행
    # 이 스크립트가 직접 실행될 때만 (import될 때가 아닌) 서버를 구동
    if __name__ == '__main__':
        app.run(debug=True)
    3. 라우팅 (Routing)
    1. 기본 라우팅
    @app.route('/about')
    def about_page():
        return '이것은 About 페이지입니다.'
    2. 동적 라우팅
    @app.route('/user/<username>')
    def show_user_profile(username):
        # f-string을 사용하여 변수를 출력
        return f'사용자: {username}'
    
    @app.route('/post/<int:post_id>')
    def show_post(post_id):
        # <int:post_id>처럼 데이터 타입을 지정할 수 있습니다.
        return f'게시글 번호: {post_id}'
    3. GET, POST 지정
    from flask import request
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            # 폼(Form) 데이터를 처리하는 로직
            username = request.form.get('username')
            return f'{username}님, 로그인 성공!'
        else:
            # 로그인 폼을 보여주는 로직 (일반적인 GET 요청)
            return '여기는 로그인 페이지입니다. 폼을 보여줄 예정.'
    
    4. 템플릿 (Templates)

    templates 폴더에서 템플릿 파일 사용 ( ex: templates/index.html )

    render_template 함수 임포트 및 사용

    from flask import Flask, render_templateapp = Flask(__name__)
    return render_template('index.html', name=name)
    탬플릿 문법
    문법용도예시
    {{ expression }}변수 또는 표현식의 값을 출력<h1>Hello, {{ name }}!</h1>
    {% statement %}조건문(if), 반복문(for) 등의 제어 구조{% if user %}…{% endif %}
    {# comment #}주석 (HTML 출력에 포함되지 않음){# 이 부분은 사용자에게 보이지 않음 #}
    5. 정적 파일 (Static Files)
    1. 정적 파일 저장:
      • static/css/style.css
      • static/images/logo.png
    2. 템플릿에서 정적 파일 링크:HTML 템플릿 내에서 Flask의 내장 함수 url_for()를 사용하여 정적 파일의 URL을 생성
      • <link rel=”stylesheet” href=”{{ url_for(‘static’, filename=’css/style.css’) }}”>
      • <img src=”{{ url_for(‘static’, filename=’images/logo.png’) }}” alt=”로고”>
    6. 데이터베이스 연동 (Flask-SQLAlchemy)

    설치: pip install Flask-SQLAlchemy

    설정: 애플리케이션에 데이터베이스 연결 URI를 설정 (예: SQLite, PostgreSQL, MySQL)

    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
    db = SQLAlchemy(app)

    모델 정의: 데이터베이스 테이블에 해당하는 파이썬 클래스를 정의

    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(80), unique=True, nullable=False)

    데이터 조작: 세션(Session)을 사용하여 데이터 CRUD

    # 데이터 추가
    new_user = User(username='test_user')
    db.session.add(new_user)
    db.session.commit()
    
    # 데이터 조회
    all_users = User.query.all()
    specific_user = User.query.filter_by(username='test_user').first()

    마이그레이션 (Migration): Flask-Migrate를 사용하여 데이터베이스 스키마(테이블 구조) 변경을 관리

    설치: pip install Flask-Migrate

    7. 폼 (Flask-WTF)

    설치: pip install Flask-WTF

    폼 클래스 정의
    from flask_wtf import FlaskForm
    from wtforms import StringField, PasswordField, validators
    class LoginForm(FlaskForm):
        username = StringField('아이디', [validators.DataRequired()])
        password = PasswordField('비밀번호', [validators.DataRequired()])
        submit = SubmitField('로그인')
    템플릿 렌더링: 렌더링 및 CSRF 보호를 위해 {{ form.hidden_tag() }}를 추가
    데이터 처리
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        form = LoginForm()
        if form.validate_on_submit(): # 유효성 검사 성공 시 데이터 처리
            print(f'사용자 이름: {form.username.data}')
            return redirect(url_for('home'))
        return render_template('login.html', form=form)
    사용자 인증

    설치: pip install Flask-Login

    설정: LoginManager를 초기화하고 애플리케이션과 연결

    User 모델 통합: Flask-SQLAlchemy로 정의한 사용자 모델에 UserMixin을 상속받아 Flask-Login이 필요로 하는 속성(예: is_authenticated)을 추가

    사용자 로더: 세션에 저장된 사용자 ID를 기반으로 실제 사용자 객체를 로드하는 함수를 정의

    인증 로직:

    • 로그인: login_user(user) 함수를 호출하여 사용자를 로그인 상태로 만듬
    • 페이지 보호: @login_required 데코레이터를 사용하여 특정 라우트 함수에 로그인 필터링을 적용
    from flask_login import login_user, login_required, current_user
    
    @app.route('/dashboard')
    @login_required # 로그인한 사용자만 접근 가능
    def dashboard():
        return f'환영합니다, {current_user.username}님!'
    8. 세션, 쿠키 (Session, cookie)

    1. 세션 (Session)

    Flask의 세션은 쿠키를 사용하여 데이터를 저장하지만, 실제 데이터는 서명(Signed)되어 브라우저에 저장. 세션을 사용하려면 반드시 SECRET_KEY가 설정되어야 함.

    A. 세션 설정

    세션을 사용하기 위해 애플리케이션에 비밀 키를 설정합니다.

    from flask import Flask, session, redirect, url_for, escape, request
    
    app = Flask(__name__)
    # 세션 데이터를 안전하게 서명하는 데 필수적입니다.
    # 실제 배포 시에는 복잡하고 무작위적인 문자열을 사용해야 합니다.
    app.config['SECRET_KEY'] = 'my_super_secret_key_1234'
    
    B. 세션 데이터 조작
    작업설명예시 코드
    저장세션에 데이터를 저장합니다.session[‘user_id’] = 101
    조회세션에서 값을 가져옵니다.user_id = session.get(‘user_id’)
    제거특정 세션 값을 삭제합니다.session.pop(‘user_id’, None)
    전체 초기화모든 세션 데이터를 삭제합니다.session.clear()
    C. 세션 예시 코드
    @app.route('/login', methods=['POST'])
    def login():
        # 로그인 성공 가정 후, 사용자 ID를 세션에 저장
        if request.form.get('password') == '1234':
            session['username'] = request.form.get('username')
            session['logged_in'] = True
            return '로그인 성공. 세션 저장됨.'
        return '로그인 실패'
    
    @app.route('/whoami')
    def who_am_i():
        # 'logged_in' 키를 확인하여 로그인 상태 체크
        if session.get('logged_in'):
            # escape()로 출력하여 XSS 공격을 방지합니다.
            return f'현재 사용자: {escape(session.get("username"))}'
        return '로그인되지 않았습니다.'
    
    @app.route('/logout')
    def logout():
        # 세션에 저장된 모든 정보를 삭제
        session.clear()
        return redirect(url_for('who_am_i'))
    

    2. 쿠키 (Cookie)

    Flask에서 쿠키를 설정할 때는 응답(Response) 객체, 읽을 때는 요청(Request) 객체를 사용.

    A. 쿠키 설정 (저장)
    from flask import make_response
    
    @app.route('/set_cookie')
    def set_cookie():
        response = make_response('쿠키가 설정되었습니다.')
        
        # 1. 일반 쿠키 설정 (보안에 취약)
        response.set_cookie('last_visit', '2025-10-26', max_age=60*60*24*7) # 7일 유지
        
        # 2. Signed 쿠키 설정 (위변조 방지)
        # secure=True로 설정하면 브라우저는 HTTP 환경에서 이 쿠키를 서버에 전송하지 않습니다.
        response.set_cookie('preference', 'dark_mode', max_age=3600, httponly=True, samesite='Lax')
        
        return response
    
    • max_age: 쿠키의 유효 기간(초 단위) 설정 (기본값: 브라우저 종료 시 삭제)
    • httponly: JavaScript 접근을 막아 XSS 공격 방어에 도움을 줌. (권장)
    • secure: HTTPS 연결에서만 쿠키를 전송하도록 설정
    B. 쿠키 읽기, 삭제
    from flask import request
    
    @app.route('/get_cookie')
    def get_cookie():
        # request.cookies.get()을 사용하여 쿠키 값을 가져옵니다.
        last_visit = request.cookies.get('last_visit')
        
        if last_visit:
            return f'마지막 방문일: {last_visit}'
        return '방문 쿠키가 없습니다.'
    
    @app.route('/delete_cookie')
    def delete_cookie():
        response = make_response('쿠키가 삭제되었습니다.')
        
        # max_age를 0으로 설정하여 쿠키를 즉시 만료시키고 삭제
        response.set_cookie('last_visit', '', max_age=0) 
        
        return response
    

    3. 세션 vs 쿠키 요약(권장)

    특징세션 (session)쿠키 (cookie)
    보안높음 (데이터 서명 및 암호화)낮음 (일반 텍스트로 저장)
    사용 목적인증 상태 (로그인 여부), 민감하지 않은 사용자 데이터개인 설정 (테마, 언어), 방문 기록
    저장 방식서버에서 생성, 서명된 쿠키로 브라우저에 저장서버에서 생성, 일반 텍스트 쿠키로 브라우저에 저장
    설정SECRET_KEY가 필수응답 객체를 사용하여 수동 설정

  • 1. 기본 사용법

    가장 기본적인 try except 구문

    try:
        # 1. 예외(오류)가 발생할 가능성이 있는 코드 블록
        # 이 코드가 실행됩니다.
        pass
    except 예외_유형:
        # 2. 'try' 블록에서 지정된 '예외_유형'의 예외가 발생했을 때 실행될 코드 블록
        # 예외 처리 코드가 들어갑니다.
        pass
    

    2. 다양한 사용 방법

    A. 특정 예외 처리

    특정 오류 유형에 대해서만 처리

    try:
        number = int("abc")  # ValueError 발생
    except ValueError:
        print("오류: 유효하지 않은 값입니다. 숫자로 변환할 수 없습니다.")
    
    # 출력: 오류: 유효하지 않은 값입니다. 숫자로 변환할 수 없습니다.
    
    B. 여러 개의 예외 처리

    하나의 try 블록에서 발생 가능한 여러 종류의 예외를 각각 다르게 처리

    try:
        result = 10 / 0  # ZeroDivisionError 발생
        my_list = [1, 2]
        print(my_list[5]) # IndexError 발생
    except ZeroDivisionError:
        print("오류: 숫자를 0으로 나눌 수 없습니다.")
    except IndexError:
        print("오류: 리스트 인덱스 범위를 벗어났습니다.")

    참고: 예외는 발생 시점에 즉시 처리되므로, 위 예시에서는 ZeroDivisionError가 먼저 발생하여 해당 except 블록만 실행되고 IndexError가 발생하는 코드는 실행되지 않음

    C. 발생한 예외 객체 얻기

    as 키워드로 발생한 예외 객체에 접근할 수 있음

    try:
        result = 10 / 0
    except ZeroDivisionError as e:
        print(f"발생한 예외 객체: {e}")
    
    # 출력: 발생한 예외 객체: division by zero
    
    D. 모든 예외 처리 (권장하지 않음)

    예외 유형을 명시하지 않고 모든 예외를 포괄적으로 처리할 수 있습니다. 일반적으로는 Exception 클래스를 사용해 처리합니다.

    try:
        # 어떤 코드가 실행됨
        pass
    except Exception:
        print("예상치 못한 오류가 발생했습니다.")
    # 또는
    except:  # 디버깅이 어려워져 'Exception'을 사용하는 것이 더 권장됨
        print("모든 종류의 오류를 잡습니다.")
    

    3. else와 finally 블록 (선택 사항)

    else 블록

    예외가 발생하지 않았을 때 실행

    try:
        file = open("data.txt", "r")
    except FileNotFoundError:
        print("파일을 찾을 수 없습니다.")
    else:
        print("파일을 성공적으로 열었습니다. 이제 파일 내용을 처리합니다.")
        file.close()
    
    finally 블록

    try 블록을 떠날 때 항상 실행 (파일, 네트워크 연결 등을 닫거나 정리하는 코드를 많이 사용)

    try:
        # 리소스 사용 시작
        x = 10 / 2
    except ZeroDivisionError:
        print("오류 발생")
    finally:
        print("이 코드는 오류 유무와 관계없이 항상 실행됩니다. (리소스 정리 등)")
    

    최종 정리

    try:
        # 1. 예외 발생 가능 코드
        pass
    except 예외_유형_1:
        # 2. 예외_유형_1 처리 코드 (예외 발생 시 실행)
        pass
    except 예외_유형_2:
        # 3. 예외_유형_2 처리 코드 (예외 발생 시 실행)
        pass
    else:
        # 4. 예외가 발생하지 않았을 때만 실행
        pass
    finally:
        # 5. 예외 유무와 관계없이 항상 마지막에 실행
        pass
  • 명령어를 모아보기 편하도록 생략한 옵션이 많습니다. 자세한 옵션은 개별정리 된 글을 참고 부탁드립니다.

    • ls : 현재 디렉토리의 파일 및 디렉터리 목록 출력
      • -a : 숨김파일 포함한 모든 파일 출력
      • -l : 긴 포맷으로 출력
      • -r : 반대 순서로 출력
      • -h : K,M,G 형식의 size 표기
      • -t : 파일이 생성(수정)된 순서로 출력한다(새로운것이 위로)
      • -R : 하위 디렉토리 목록도 출력
    • uptime : 현재 시간, 동작 시간, 접속중인 유저, CPU 사용량을 출력
      • -p : 동작 시간만 출력
      • -s : 부팅 시간만 출력
    • pwd : 현재 위치한 디렉토리 출력
    • touch : 파일 생성 < touch [options] [fileName1] ([fileName2] …) >
    • mkdir : 디렉토리 생성 < mkdir [options] [directoryName1] ([directoryName2] …) >
      • -m : 퍼미션 설정 < 예: mkdir -m 755 [directoryName] >
      • -p : 중첩된 디렉토리 동시 생성 < 예: mkdir -p test1/test2/test3 >
    • cp : 파일(디렉토리) 복사 < cp [options] [원본파일] [사본파일] >
      • 여러 파일 복사 < cp [원본파일1] [원본파일2] … [targetDirectory] >
      • -f : 사본 위치에 동일 파일명이 있으면 덮어쓰기
      • -r : 하위 디렉토리까지 모두 수행
    • rm : 파일(디렉토리) 삭제 < rm [options] [fileName] >
      • -f : 강제 수행
      • -r : 하위 디렉토리까지 모두 수행
    • mv : 파일(디렉토리) 이동 < mv [options] [targetFile] [targetDirectory] >
      • -f : 사본 위치에 동일 파일명이 있으면 덮어쓰기
      • -r : 하위 디렉토리까지 모두 수행
    • cat : 파일 내용 전체 출력 < cat [options] [fileName] ( [fileName2] [fileName3] … ) >
      • cat > [fileName] : 파일 생성 or 덮어쓰기 (종료: ctrl + d)
      • cat [targetFile] > [newFile] : targetFile 내용으로 파일 생성
      • cat >> [fileName] : 파일생성 or 이어쓰기 (종료: ctrl + d)
      • cat [targetFile] >> [oldFile] : oldFile 끝에 targetFile 내용 이어쓰기
      • -n : 문자 줄번호 표시
      • -s : 여러줄 공백라인을 하나의 공백라인으로 표시
    • head : 파일 내용 처음 부분 출력 < head [options] [fileName] ( [fileName2] [fileName3] … ) >
      • -숫자 : 처음부터 숫자행 만큼 출력
    • tail : 파일 내용 마지막 부분 출력 < tail [options] [fileName] ( [fileName2] [fileName3] … ) >
      • -숫자 : 마지막부터 숫자행 만큼 출력 (역순 아님. 마지막 줄이 마지막)
    • grep : 특정 문자열 검색 < grep [options] pattern [file…] >
      • 사용법이 너무 다양하므로, 별도 문서를 찾아보시길 권장드립니다.
    • find : 파일(디렉토리) 검색 < find [options] [표현식] [표현식2].. >
      • 표현식 -name [문자열] : 파일명에 문자열을 포함한 파일 검색
      • 표현식 -empty : 빈 디렉터리나 size가 0일 파일 검색
      • 표현식 -delete : 검색된 파일(디렉터리) 삭제
      • 표현식 -exec [명령] : 검색된 파일에 지정된 명령 실행
      • 표현식 -type [타입] : 해당 타입의 파일 검색
        • b : 블록 특수 파일
        • c : 캐릭터 특수 파일
        • d : 디렉토리
        • f : 일반 파일
        • l : 심벌릭 링크
        • p : 파이프
        • s : 소켓
    • chmod : 파일(디렉토리) 권한변경 < chmod [options] [mode] [fileName] >
      • u : 소유자, g : 그룹, o : 그 외 사용자, a : 모든 사용자
      • + : 권한 추가, – : 권한 제거, = : 현재 유지
      • r : 읽기 권한, w : 쓰기 권한, x : 실행 권한
        • ex1) chmod u=rw [fileName]
        • ex2) chmod g-x [fileName]
        • ex3) chmod ug=rwx [fileName]
      • 8진수 방식 : 유저 rwx, 그룹 rwx, 그 외 사용자 rwx를 권한 없음 0, 권한 있음 1로 표기
        • ex1) chmod 775 [fileName]
        • 유저 7, 그룹 7, 그 외 사용자 7
        • 7은 이진수로 111, 5는 이진수로 101
        • 유저 rwx, 그룹 rwx, 그 외 사용자 r-x (그 외 사용자는 쓰기 권한 없음)
    • —————————– 아래 정리중 ————————————–
    • chown : 파일(디렉토리) 소유자(그룹) 변경
    • ps : 실행중 프로세스 목록 출력
    • top : 실시간 자원 사용량 및 프로세스 정보 출력
    • kill : 프로세스 종료
    • df : 디스크 사용량 확인
    • du : 디렉토리 용량 확인
    • free : 메모리 사용량 확인
    • ping : 네트워크 연결상태 확인
    • ssh : 원격 서버 터미널 연결
    • history : 이전 입력 명령어 목록 출력
    • clear : 터미널 화면 지우기

  • 단축키기능
    Win시작 메뉴 열기 또는 닫기
    Win + D바탕 화면 표시/숨기기 (모든 창 최소화/이전 상태로 복원)
    Win + E파일 탐색기 열기
    Win + LPC 잠금 또는 사용자 전환
    Win + R실행 대화 상자 열기
    Win + I설정 앱 열기
    Win + A알림 센터 (Windows 10) 또는 빠른 설정 (Windows 11) 열기
    Win + S검색 상자 열기
    Win + Tab작업 보기 열기 (가상 데스크톱 및 타임라인)
    Win + Ctrl + D새 가상 데스크톱 만들기
    Win + Ctrl + ← 또는 →가상 데스크톱 간 전환
    Win + Ctrl + F4현재 사용 중인 가상 데스크톱 닫기
    Win + ↑활성 창 최대화
    Win + ↓활성 창 최소화 또는 복원
    Win + ← 또는 →활성 창을 화면의 왼쪽 또는 오른쪽 절반에 스냅
    Win + Shift + S화면 캡처 및 클립보드에 저장 (화면 영역 선택 가능)
    Win + GXbox Game Bar 열기
    Win + V클립보드 기록 열기
    Win + M모든 열린 창 최소화
    Win + Shift + M최소화된 창 복원
    Win + Pause/Break시스템 속성 대화 상자 열기
    Win + X시작 버튼 고급 메뉴 (전원 사용자 메뉴) 열기
    Win + 숫자(1∼9)작업 표시줄에서 해당 숫자 위치의 앱 실행 또는 활성화
    Win + ;이모지 입력

  • 1. for 루프

    A. 순회 (Iteration)

    컬렉션의 각 요소에 접근하며 블록을 실행합니다.

    # 리스트 순회 예시
    fruits = ["apple", "banana", "cherry"]
    for fruit in fruits:
        print(fruit)
    

    B. 횟수 반복 (Using range())

    range() 함수를 사용하여 지정된 횟수만큼 반복할 수 있습니다.

    • range(n): 0부터 n-1까지 반복 ( return값 = [0, 1, 2, … n-2, n-1] )
    • range(a, b): a부터 b-1까지 반복 ( return값 = [a, a+1, a+2, … b-2, b-1] )
    • range(a, b, s): a부터 b-1까지 s 간격으로 반복 ( return값 = [a, a+s, a+2s, … b-2s, b-s] )
    # 5번 반복 예시 (0, 1, 2, 3, 4)
    for i in range(5):
        print(i)
    

    2. while 루프

    while 루프는 특정 조건이 참(True)인 동안 코드 블록을 계속 반복 실행합니다. 조건이 거짓(False)이 되는 순간 반복이 멈춥니다.

    ⚠️ 주의: 반복문 내에서 조건이 언젠가는 거짓이 되도록 하는 코드가 반드시 포함되어야 합니다. 그렇지 않으면 **무한 루프(Infinite Loop)**에 빠지게 됩니다.

    # 조건이 참인 동안 반복하는 예시
    count = 0
    while count < 3:
        print(f"Count: {count}")
        count += 1  # count를 1 증가시켜 언젠가 조건이 거짓이 되게 함
    

    3. 흐름 제어문 (Control Flow Statements)

    키워드용도설명
    break반복문 즉시 종료현재 실행 중인 가장 가까운 for 또는 while 루프를 빠져나옵니다.
    continue현재 순회 건너뛰기루프의 나머지 부분을 건너뛰고, 즉시 다음 반복(순회)을 시작합니다.
    pass아무것도 하지 않음문법적으로 무언가가 필요하지만, 실제로 실행할 코드가 없을 때 사용하며, 루프를 건너뛰지 않고 계속 진행합니다.
    for x in range(10):
        if x == 3:
            continue  # x가 3일 때는 print를 건너뛰고 다음 반복으로
        if x == 7:
            break     # x가 7일 때는 루프를 완전히 종료
        print(x)  # 출력: 0, 1, 2, 4, 5, 6
    

    4. else (Loop else Clause)

    for 루프와 while 루프 모두 else 절을 가질 수 있습니다.

    • for 루프의 else: 루프가 정상적으로 (즉, break 없이) 완료되었을 때 실행됩니다.
    • while 루프의 else: 루프 조건이 거짓이 되어 정상적으로 종료되었을 때 실행됩니다. (break로 종료되면 실행되지 않음)
    for i in range(3):
        print(i)
    else:
        print("루프 정상 완료!") # 출력됨

  • 명령어설명예시
    if가장 기본적인 조건문.
    조건이 True면 코드 실행.
    if score >= 60:
    elifelse if의 줄임말
    이전의 if 또는 elif 조건이 False일 때,
    새로운 조건을 확인하여 True면 실행
    elif score >= 80:
    else위의 모든 조건(if, elif)이 False라면 실행else:
    pass문법적으로 코드가 필요하지만,
    실행할 동작이 없을 때 사용
    (조건문, 반복문 등을 미완성 상태로 둘 때 유용)
    if condition: pass
    is두 객체가 동일한 객체인지 비교
    (값이 아닌 메모리 주소가 같으면 True)
    if x is y:
    is not두 객체가 동일한 객체가 아닌지 비교if x is not None:
    in특정 이 시퀀스(리스트, 튜플, 문자열 등) 또는
    컬렉션에 포함되어 있는지 확인.
    if 'apple' in fruits:
    not in특정 이 시퀀스 또는 컬렉션에
    포함되어 있지 않은지 확인.
    if 5 not in numbers:
    and두 조건이 모두 True일 때 True. (논리 곱)if a > 0 and b < 10:
    or두 조건 중 하나라도 True일 때 True. (논리 합)if day == 'Sat' or day == 'Sun':
    not조건의 논리 값을 반전
    (True를 False로, False를 True로).
    if not is_valid:
    삼항 연산자한 줄로 간결하게 조건에 따라 값을 할당
    TrueValue if (조건) else FalseValue
    result = 'Pass' if score >= 70 else 'Fail'

  • 1. 산술 연산자 (Arithmetic Operators)

    가장 익숙한 연산자들로, 숫자 값을 대상으로 수학적 계산을 수행합니다.

    연산자이름설명예시결과
    +더하기 (Addition)두 값을 더합니다.5 + 38
    -빼기 (Subtraction)왼쪽 값에서 오른쪽 값을 뺍니다.10 - 46
    *곱하기 (Multiplication)두 값을 곱합니다.2 * 612
    /나누기 (Division)왼쪽 값을 오른쪽 값으로 나눕니다.
    (결과는 실수형)
    10 / 33.333...
    //몫 (Floor Division)나눗셈의 정수 몫만 반환합니다.10 // 33
    %나머지 (Modulus)나눗셈의 나머지를 반환합니다.10 % 31
    **거듭제곱 (Exponentiation)왼쪽 값을 오른쪽 값만큼 거듭제곱합니다.2 ** 416

    2. 할당 연산자 (Assignment Operators)

    변수에 값을 할당하는 데 사용되며, 특히 기존 값에 연산을 수행한 후 다시 할당할 때 축약해서 사용됩니다.

    연산자설명정규 표현축약 표현
    =값을 할당합니다.a = 10a = 10
    +=덧셈 후 할당a = a + 5a += 5
    -=뺄셈 후 할당a = a - 2a -= 2
    *=곱셈 후 할당a = a * 3a *= 3
    /=나눗셈 후 할당a = a / 4a /= 4
    **=거듭제곱 후 할당a = a ** 2a **= 2

    3. 비교 연산자 (Comparison Operators)

    두 값의 크기 또는 같음/다름을 비교하여 True 또는 False 값을 반환합니다.

    연산자이름설명예시결과
    ==같다 (Equal)두 값이 같으면 True5 == 5True
    !=같지 않다 (Not equal)두 값이 다르면 True5 != 3True
    >크다 (Greater than)왼쪽 값이 크면 True5 > 3True
    <작다 (Less than)왼쪽 값이 작으면 True5 < 3False
    >=크거나 같다왼쪽 값이 크거나 같으면 True5 >= 5True
    <=작거나 같다왼쪽 값이 작거나 같으면 True5 <= 3False

    4. 논리 연산자 (Logical Operators)

    True 또는 False 값을 가진 조건들을 조합하거나 반전시키는 데 사용됩니다. 주로 조건문 (if)에서 여러 조건을 동시에 검사할 때 쓰여요.

    연산자이름설명예시
    and그리고두 조건이 모두 True일 때만 True 반환(5 > 3) and (10 < 20) -> True
    or또는두 조건 중 하나라도 True이면 True 반환(5 < 3) or (10 > 20) -> False
    not아니다조건의 부울 값을 반전시킵니다.
    (TrueFalse, FalseTrue)
    not (5 == 3) -> True

    5. 멤버십 연산자 (Membership Operators)

    특정 값이 시퀀스(Sequence, 리스트, 튜플, 문자열 등) 안에 포함되어 있는지 확인합니다.

    연산자설명예시결과
    in포함되어 있으면 True 반환'a' in 'banana'True
    not in포함되어 있지 않으면 True 반환'z' not in 'banana'True

    6. 아이덴티티 연산자 (Identity Operators)

    두 변수가 같은 객체(Object)를 참조하고 있는지 확인합니다.

    (주의: 같은 값이 아닌 같은 메모리 주소를 가지고 있는지 확인함)

    연산자설명예시
    is두 변수가 같은 객체를 참조하면 True 반환a = [1, 2]; b = a; a is b -> True
    is not두 변수가 다른 객체를 참조하면 True 반환a = [1, 2]; c = [1, 2]; a is c -> False (값은 같으나 다른 객체임)