1. 컴파일 언어와 인터프리터 언어의 차이점
컴퓨터는 고급 프로그래밍 언어를 직접 이해하지 못하고, 오직 기계어만을 실행할 수 있습니다. 따라서 고급 언어로 작성된 프로그램을 실행하려면 이를 기계어로 변환하는 과정이 필수적이며, 이 변환 방식에 따라 크게 두 가지로 나뉩니다.
컴파일 언어 (Compiled Language)
컴파일러(Compiler)라는 특별한 도구를 사용하여, 소스 코드 전체를 한 번에 해당 플랫폼의 기계어로 번역합니다. 번역된 결과는 실행 가능한 파일(예: Windows의 .exe) 형태로 생성됩니다.
핵심 특징:
- 실행 전에 전체 코드를 기계어로 미리 변환하므로, 이후 실행 시 추가 변환 작업 없이 바로 실행됩니다.
- 실행 속도가 매우 빠릅니다. (한 번 번역된 결과를 반복 사용)
- 특정 운영체제나 하드웨어에 종속적이어서, 다른 플랫폼으로의 이식이 어렵습니다.
- 대표적인 언어: C, C++, Go, Rust, Swift
인터프리터 언어 (Interpreted Language)
인터프리터(Interpreter)라는 도구가 소스 코드를 한 줄씩 읽어 즉시 기계어로 번역하고 실행합니다.
핵심 특징:
- 실행할 때마다 코드를 한 줄씩 번역하고 실행하므로, 컴파일 언어보다 실행 속도가 느립니다.
- 해당 플랫폼에 맞는 인터프리터만 있으면 어디서든 동일한 코드를 실행할 수 있어 이식성이 뛰어납니다.
- 별도의 컴파일 과정 없이 바로 실행 가능하여 개발 및 테스트가 빠릅니다.
- 대표적인 언어: Python, JavaScript, Ruby, PHP, Perl
2. Python 스크립트 실행 방법
Python 코드를 실행하는 방법은 두 가지입니다.
인터프리터 대화형 모드
터미널(또는 명령 프롬프트)에서 python 또는 python3 명령어를 입력하면 대화형 셸이 실행됩니다. 이 상태에서 코드를 한 줄씩 입력하면 즉시 결과를 확인할 수 있습니다.
# Windows / macOS / Linux
python
# 또는
python3
참고: 위 명령어를 실행하면 >>> 프롬프트가 나타납니다.
스크립트 파일 실행
코드를 .py 확장자로 저장한 후, 터미널에서 파일 이름을 인자로 전달하여 실행합니다.
# hello.py 파일 내용
print("안녕하세요, Python!")
# 실행 명령어
python hello.py
3. 주석 처리 방법
코드에 설명을 추가하거나 특정 코드를 실행에서 제외할 때 사용합니다.
- 한 줄 주석:
#기호를 사용하며, 해당 줄의#이후 내용은 모두 무시됩니다.# 이 줄은 주석입니다. print("실행됩니다.") # 이 부분도 주석입니다. - 여러 줄 주석: 작은따옴표 3개(
''') 또는 큰따옴표 3개(""")로 감싸서 사용합니다. 둘 간의 기능적 차이는 없습니다.''' 이것은 여러 줄 주석입니다. """ 이것도 여러 줄 주석입니다. """
4. 불리언(Boolean) 타입의 값
Python에서 참(True)과 거짓(False)을 나타내는 데이터 타입입니다. 조건문 등에서 매우 중요하게 사용됩니다. 다음 값들은 bool() 함수로 평가했을 때 False를 반환하며, 이를 제외한 모든 값은 True로 간주됩니다.
FalseNone- 숫자 0 (정수, 실수 등 모든 형태의 0)
- 빈 문자열:
"" - 빈 리스트:
[] - 빈 튜플:
() - 빈 딕셔너리:
{} - 빈 세트:
set()
5. 변수 명명 규칙
변수 이름을 지을 때는 다음 규칙을 반드시 따라야 합니다.
- 첫 글자는 반드시 문자(영문, _)로 시작해야 하며, 숫자로 시작할 수 없습니다.
- 이름은 영문자, 숫자, 밑줄(
_)만 사용할 수 있습니다. (공백이나 특수문자 사용 불가) - Python의 예약어(Keywords)는 변수 이름으로 사용할 수 없습니다. (예:
if,for,class,import등) - 대소문자를 구분하므로
myVar와myvar는 서로 다른 변수입니다.
권장하는 네이밍 컨벤션:
- 모듈 및 패키지: 소문자, 단어 사이는 밑줄 (
my_module) - 클래스: 각 단어의 첫 글자를 대문자로 (PascalCase,
MyClass) - 일반 변수 및 함수: 소문자, 단어 사이는 밑줄 (snake_case,
my_variable) - 상수: 모든 글자를 대문자, 단어 사이는 밑줄 (
MAX_COUNT) - 내부(Internal) 변수: 밑줄 하나로 시작 (
_internal_var) - 클래스 내부에서 외부 접근을 제한하려는 변수: 밑줄 두 개로 시작 (
__private_var) - 특수 메서드(매직 메서드): 밑줄 두 개로 시작하고 끝남 (
__init__). 사용자 정의시 이 형태는 피해야 합니다.
6. 변수의 메모리 주소 확인
id() 내장 함수를 사용하면 변수가 가리키는 객체의 고유한 메모리 주소(정수)를 반환받을 수 있습니다.
x = 10
print(id(x)) # 예: 140735276387728
7. 사용자 로그인 구현 (3회 재시도)
사용자로부터 이름과 비밀번호를 입력받아, 미리 정의된 사용자 목록과 비교합니다. 3번의 기회가 주어집니다.
import time
valid_users = ['seven', 'alex']
correct_password = '123'
attempts = 0
max_attempts = 3
while attempts < max_attempts:
attempts += 1
username = input("사용자 이름을 입력하세요: ")
password = input("비밀번호를 입력하세요: ")
if username in valid_users and password == correct_password:
print("로그인 성공!")
break
else:
if attempts == max_attempts:
print("3회 실패했습니다. 프로그램을 종료합니다.")
time.sleep(1)
else:
print(f"로그인 실패. 남은 기회: {max_attempts - attempts}번")
8. 반복문 연습 문제
다음 세 가지 문제를 while 반복문을 사용하여 해결하는 코드입니다.
# 1. 2-3+4-5+6...+100 의 합계 계산
def calculate_alternating_sum():
total = 0
number = 2
while number <= 100:
if number % 2 == 0: # 짝수면 더함
total += number
else: # 홀수면 뺌
total -= number
number += 1
return total
print(f"계산 결과: {calculate_alternating_sum()}")
# 2. 1부터 100까지의 모든 홀수 출력
def print_odd_numbers():
number = 1
odd_numbers = []
while number <= 100:
if number % 2 != 0:
odd_numbers.append(number)
number += 1
print(f"홀수 리스트: {odd_numbers}")
print_odd_numbers()
# 3. 1부터 100까지의 모든 짝수 출력
def print_even_numbers():
number = 1
even_numbers = []
while number <= 100:
if number % 2 == 0:
even_numbers.append(number)
number += 1
print(f"짝수 리스트: {even_numbers}")
print_even_numbers()
9. 고급 사용자 관리 시스템 (등록, 로그인, 계정 잠금)
텍스트 파일을 이용하여 사용자 정보를 저장하고, 로그인 실패 3회 시 계정을 잠그는 시스템입니다. 새 사용자 등록 기능도 포함됩니다.
import time
WHITE_LIST_FILE = "valid_users.txt"
BLACK_LIST_FILE = "locked_users.txt"
def load_users():
"""파일에서 사용자 정보를 로드하여 리스트로 반환합니다."""
users = []
try:
with open(WHITE_LIST_FILE, 'r') as file:
for line in file:
line = line.strip()
if ':' in line:
name, pwd = line.split(':', 1)
users.append({'name': name, 'password': pwd})
except FileNotFoundError:
pass # 파일이 없으면 빈 리스트 반환
return users
def load_locked_users():
"""잠긴 사용자 목록을 파일에서 로드합니다."""
locked = []
try:
with open(BLACK_LIST_FILE, 'r') as file:
for line in file:
locked.append(line.strip())
except FileNotFoundError:
pass
return locked
def register_user(users):
"""새 사용자를 등록하고 파일에 저장합니다."""
for _ in range(3):
new_name = input("생성할 사용자 이름: ")
if new_name in [u['name'] for u in users]:
print("이미 존재하는 사용자입니다.")
continue
pwd1 = input("비밀번호: ")
pwd2 = input("비밀번호 확인: ")
if pwd1 == pwd2:
with open(WHITE_LIST_FILE, 'a') as file:
file.write(f"{new_name}:{pwd1}\n")
print("사용자 등록이 완료되었습니다!")
return
else:
print("비밀번호가 일치하지 않습니다.")
print("등록 시도 횟수를 초과했습니다.")
exit()
def login_user(users, locked_users):
"""사용자 로그인 로직을 처리합니다."""
for _ in range(6):
name = input("사용자 이름: ")
password = input("비밀번호: ")
if name in locked_users:
print("이 계정은 잠겼습니다. 관리자에게 문의하세요.")
exit()
found_user = next((u for u in users if u['name'] == name), None)
if found_user:
if found_user['password'] == password:
print("로그인 성공!")
print("=" * 30)
print("환영합니다!")
print("=" * 30)
return
else:
print("비밀번호가 틀렸습니다.")
user_fails = sum(1 for a in range(3) if name == found_user['name'])
if user_fails >= 2: # 예시 로직: 특정 사용자만 카운트하여 잠금
with open(BLACK_LIST_FILE, 'a') as file:
file.write(f"{name}\n")
print("3회 실패로 계정이 잠겼습니다.")
exit()
else:
print("존재하지 않는 사용자입니다.")
print("로그인 시도 횟수를 초과했습니다.")
exit()
def main():
users = load_users()
locked_users = load_locked_users()
while True:
action = input("1. 등록\n2. 로그인\n선택: ")
if action == '1':
register_user(users)
users = load_users() # 업데이트된 사용자 목록 다시 로드
elif action == '2':
login_user(users, locked_users)
break
else:
print("잘못된 입력입니다.")
if __name__ == "__main__":
main()