Rookies 3일차: Python 개념 학습 1
☀️공지 사항☀️ 해당 게시글은 SK 쉴더스 루키즈, 생성형AI 활용 사이버보안 전문인력 양성과정 을 수업을 듣고 정리한 글입니다. 자세한 교육 정보는 SK 쉴더스 홈페이지 를 확인해주세요.
학습 내용 요약 (25/10/27)
📝 파이썬 기본 문법 및 자료형 총정리
1. 변수와 선언 규칙
| 주제 | 핵심 내용 | 추가 개념 |
|---|---|---|
| 변수 기본 규칙 | 숫자로 시작 불가. 언더바(_)와 달러 기호($) 허용. 예약어(keyword) 사용 불가. | 식별자(Identifier) 규칙: 변수, 함수, 클래스 등을 구분하는 이름. 대소문자를 구분하며 유니코드 문자도 사용 가능하다. |
| 변수 선언 방식 | Camel Case (변수/함수, 현업 권장), Pascal Case (클래스), Snake Case (비추천) | 동적 타입(Dynamic Typing): 파이썬은 변수 선언 시 타입을 명시할 필요 없이, 값이 할당되는 순간 자동으로 타입이 결정된다. |
2. 파이썬 내장 자료형 (Built-In Types) 및 불변성/가변성
파이썬 자료형에서 가장 중요한 개념 중 하나는 **불변성(Immutable)과 가변성(Mutable)**이다.
2.1. 불변형 (Immutable Types)
객체가 생성된 후 내부 값을 변경할 수 없는 자료형이다. 값을 변경하려 하면 새로운 객체가 생성된다.
- Numeric:
int,float - Text Sequence:
str(문자열) - Sequence:
tuple - Bool:
True,False
2.2. 가변형 (Mutable Types)
객체가 생성된 후 내부 값을 변경할 수 있는 자료형이다. 값을 변경해도 동일한 객체를 유지한다.
- Sequence:
list - Mapping:
dict - Set:
set
| 분류 | 자료형 | 표현식 | 인덱싱/슬라이싱 | 불변성(Immutable) 여부 |
|---|---|---|---|---|
| Numeric | int, float |
❌ 불가능 | ❌ 불변형 (Immutable) | |
| Text Sequence | str (문자열) |
'', "" |
✅ 가능 | ❌ 불변형 (Immutable) |
| Sequence | tuple |
() |
✅ 가능 | ❌ 불변형 (Immutable) |
| Sequence | list |
[] |
✅ 가능 | ✅ 가변형 (Mutable) |
| Mapping | dict (딕셔너리) |
{} |
Key로 접근 | ✅ 가변형 (Mutable) |
| Set | set (집합) |
{} |
❌ 불가능 | ✅ 가변형 (Mutable) |
3. Sequence 및 Mapping/Set 심화 활용
| 자료형 | 핵심 특징 | 필수 추가 개념 |
|---|---|---|
| List | 순서 있고, 가변적이다. | 배열(Array)과의 차이: List는 다양한 타입의 요소를 저장할 수 있어 배열보다 유연하다. |
| Tuple | 순서 있고, 불변적이다. | Packing & Unpacking: a, b = 10, 20과 같이 여러 값을 변수에 동시에 할당하는 기능. 함수에서 여러 값을 반환할 때 유용하다. |
| Dictionary | Key-Value 쌍, 가변적이다. | Key의 조건: Key는 불변형(Immutable) 객체만 사용할 수 있다 (str, int, tuple 등). List는 Key로 사용 불가능하다. |
| Set | 순서 없고, 중복 불가, 가변적이다. | 빈 Set 생성: empSet = set()을 사용해야 한다. 단순한 {}는 빈 Dictionary를 생성한다. |
4. Boolean과 논리 연산자
| 개념 | 핵심 내용 | 추가 개념 (논리 연산자) |
|---|---|---|
| Boolean | True, False 두 값만 존재한다. |
AND (and): 두 피연산자가 모두 True일 때만 True. |
| Trusy/Falsy | Falsy 값 (0, '', [], {}) 외에는 모두 Trusy로 간주된다. |
OR (or): 두 피연산자 중 하나라도 True이면 True. |
| 형 변환 | int(True)는 1, int(False)는 0이다. |
NOT (not): 피연산자의 논리 값을 반전시킨다. |
5. 출력 형식 및 로깅 (보안적 관점)
| 출력 방식 | 문법 (예시) | 보안 및 추가 활용 개념 |
|---|---|---|
| F-string | f"{변수:포맷지정}" |
가장 안전하고 권장되는 방법. % 연산자의 Format String Vulnerability (포맷 스트링 취약점) 발생 위험이 없어 보안성이 높다. |
repr() 함수 |
print(repr(data)) |
로깅 시 필수 함수. 문자열 내부의 이스케이프 문자(\n, \t)까지 그대로 출력하여, 로그 데이터의 변조 여부나 실제 값을 디버깅하는 데 매우 유용하다. |
| 로그 포맷팅 | f"[ALERT] User={...}..." |
로그 파싱 용이성: 로그 메시지를 규칙적인 형식(e.g., Key=Value)으로 출력하여, SIEM이나 로그 분석 도구에서 데이터를 쉽게 분리하고 탐지 규칙을 생성할 수 있도록 한다. |
고급 활용
1. 출력 함수 (print)의 활용
파이썬의 print() 함수는 sep (Separator, 구분자) 옵션을 사용하여 출력되는 인수들 사이의 기본 공백을 다른 문자로 변경할 수 있다. 이는 데이터를 특정 형식으로 구조화할 때 유용하다.
| 옵션 | 설명 |
|---|---|
sep |
여러 인수를 출력할 때, 인수와 인수 사이에 삽입될 문자열을 지정한다. |
Python
# sep 옵션을 사용해 전화번호를 하이픈(-)으로 구분
print('010', '1234', '5678', sep="-")
# 이메일 주소를 @으로 결합
print('jslim9413', 'naver.com', sep="@")
2. Sequence 자료형 활용: 인덱싱, 슬라이싱, 언패킹
list, tuple, str과 같은 순서가 있는 자료형은 인덱싱과 슬라이싱을 지원하며, 튜플은 패킹(Packing)과 언패킹(Unpacking) 기능을 제공한다.
A. 슬라이싱 (Slicing) 및 리버스 인덱싱
슬라이싱은 [시작:끝] 형태로, 끝 인덱스는 포함되지 않는다는 점이 중요하다. 리버스 인덱싱은 맨 뒤부터 -1로 시작한다.
Python
keywordList = ['A', 'B', 'C', 'D', 'E', 'F']
# [0:5]는 0부터 4번째 인덱스까지 (총 5개)를 의미한다.
print('slicing - ', keywordList[0:5])
# 리버스 인덱싱 -1은 맨 마지막 요소를 가리킨다.
print('리버스 인덱싱 - ', keywordList[-1])
B. 튜플 패킹(Packing)과 언패킹(Unpacking)
튜플은 소괄호(())를 생략하여 값을 할당하는 패킹이 가능하며, 이를 다시 여러 변수로 나누어 할당하는 언패킹을 지원한다. 특히 * 기호는 가변형 언패킹을 위해 사용되며, 나머지 모든 요소를 리스트로 묶어 할당한다.
Python
# 패킹: 소괄호 생략 가능 (Packing)
tupleTemp = "a", "b", "c", "d", "e", "f"
# 언패킹: 원소 개수에 맞춰 할당. *d는 나머지 요소를 리스트로 묶는다.
aa, bb, cc, *d = tupleTemp
print('unpacking - ', aa, bb, cc, *d) # 언패킹할 때도 *를 붙혀줘야 리스트도 풀린 상태로 출력된다.
# 출력: unpacking - a b c d e f
print('unpacking - ', aa, bb, cc, d) # 언패킹할 때 *d가 아닌 d만 사용한 경우
# 출력: unpacking - a b c ['d', 'e', 'f']
3. Set 자료형: 집합 연산과 보안 활용
Set은 중복을 허용하지 않고 순서가 없다. 이 특성 덕분에 권한 관리, 데이터 필터링 등 보안 분야에서 효율적인 집합 연산에 활용된다.
A. 주요 집합 연산자 및 XOR 연산
| 연산자 | 연산 이름 | 의미 | 보안 관점 핵심 |
|---|---|---|---|
| |
합집합 (Union) | 두 집합의 모든 요소 | |
& |
교집합 (Intersection) | 공통 요소 | |
- |
차집합 (Difference) | 첫 번째 집합에만 있는 요소 | |
^ |
대칭 차집합 | 교집합을 제외한 나머지 요소 | XOR 연산과 동일. 두 권한 집합의 차이점을 분석하는 데 유용하다. |
Python
adminRoles = {"read", "write", "delete", "update"}
userRoles = {"read", "comment"}
print('type - ', type(adminRoles), type(userRoles))
print('합집함(|) - ', adminRoles | userRoles)
print('교집합(&) - ', adminRoles & userRoles)
print('차집합(-) - ', adminRoles - userRoles)
print('대칭차집합(^) - ', adminRoles ^ userRoles)
# 대칭차집합은 교집합('read')을 제외한 나머지 차이점('write', 'delete', 'update', 'comment')을 보여준다.
# 출력 결과
type - <class 'set'> <class 'set'>
합집함(|) - {'read', 'delete', 'update', 'write', 'comment'}
교집합(&) - {'read'}
차집합(-) - {'delete', 'update', 'write'}
대칭차집합(^) - {'write', 'delete', 'update', 'comment'}
B. in, not in 연산자의 효율성
요소의 포함 여부를 확인할 때, 리스트(list)는 풀 스캔(Full Scan) 방식이라 자원 소모가 크지만, Set은 해시 테이블 기반으로 매우 빠른 탐색이 가능하다.
따라서 중복 방지나 빠른 존재 유무 확인에는 Set을 사용하는 것이 거의 필수이다.
Python - in 으로 요소의 포함 여부 확인
fruits = ['apple', 'banana', 'durian', 'orange']
print('data - ', fruits)
print('type - ', type(fruits))
# 리스트에서 in 연산: 리소스 소모가 크다.
print('orange' in fruits) # True
- set( )을 활용한 중복 방지 예시는 아래
4.에 있다.
4. set( ) 활용 - 중복 로그인 감지
userTokens = set()
# 사용자 정의 함수 만들기
def login(token) :
if token in userTokens :
raise ValueError(f"[보안경고] 이미 로그인 중: {token}")
userTokens.add(token)
print(f"{token} 로그인 성공")
login('jslim')
login('sk')
login('jslim')
중복 로그인 감지 함수 실행 결과:
-
처음
jslim와sk는 로그인 되었지만, 다시jslim으로 로그인을 시도할 시 오류가 뜬다. -

5. 안전하고 구조화된 출력 형식 (로깅 관점)
A. 출력 형식 정리 예시
가장 권장되는 방식은 f-string이며, 서식 지정 연산자(%)는 보안 취약점 위험 때문에 사용을 지양한다.
로그를 기록할 때 Key=Value 형태로 구조화하는 것은 필수이다. 이는 이벤트 수집 시스템(SIEM)에서 데이터 파싱(Parsing)을 용이하게 하여 탐지 규칙을 생성하기 위함이다.
추가적으로 repr() 함수 사용은 데이터 변조 식별에 도움을 준다.
# 로그로 수집된 데이터 예시
loginUser = {
'type' : 'guest',
'ip' : '192.168.0.2',
'event': 'LOGIN_SUCCESS'
}
# f-string을 사용해 Key=Value 형태로 구조화된 로그 메시지 생성 (파싱 용이성 확보)
logMsg = f"[ALERT] User={loginUser['type']}, IP={loginUser['ip']}, Event={loginUser['event']}"
print(logMsg)
# 출력 결과: [ALERT] User=guest, IP=192.168.0.2, Event=LOGIN_SUCCESS
6. 다중 라인 출력
""" """ 을 이용하면 다중 라인을 출력할 수 있다.
# 민감 정보는 마스킹 처리해야된다. 마스킹 하는 방법 공부해보자!
query = f"""
select *
from table
where id = admin or 1 = 1
"""
print(query)
print()
msg = f"""
[User login Report]
===================
ID : sk
Time : 2025-10-27
Status : success
"""
print(msg)
출력 예시:
7. (심화) 파이썬으로 민감 정보 마스킹 처리하는 방법
1. 문자열 슬라이싱(Slicing)을 이용한 고정 마스킹
A. 전화번호 마스킹 (가운데 4자리)
Python
def maskPhoneNumber(phoneNumber):
# 하이픈('-') 제거 (선택 사항)
phoneNumber = phoneNumber.replace('-', '')
# 앞 3자리와 뒤 4자리는 노출, 중간 4자리는 마스킹
if len(phoneNumber) == 11:
# phoneNumber[:3] : 앞 3자리
# phoneNumber[7:] : 뒤 4자리
return f"{phoneNumber[:3]}-****-{phoneNumber[7:]}"
return phoneNumber
# 예시:
# print(maskPhoneNumber("010-1234-5678"))
B. 이메일 주소 마스킹
이메일 주소의 로컬 파트(아이디)와 도메인 파트를 분리하여 처리 후 마스킹 하기
Python
def maskEmail(emailAddress):
# '@'를 기준으로 로컬 파트와 도메인 파트 분리
localPart, domainPart = emailAddress.split('@')
# 로컬 파트의 첫 글자를 제외하고 마스킹
if len(localPart) > 2:
# 첫 글자 노출 + 나머지 마스킹
maskedLocalPart = localPart[0] + '*' * (len(localPart) - 1)
return f"{maskedLocalPart}@{domainPart}"
# 예시:
# print(maskEmail("admin@company.co.kr"))

댓글 남기기