많은 QA Engineer들이 Python을 주언어로 사용하고 있는 것 같다. 예전부터 Python을 공부해봐야지 생각은 했지만 업무적으로 쓸일이 없다보니 잠깐 보더라도 머리에 잘 들어오지 않았던 것 같다. 이번 LLM관련 프로젝트를 진행하며 Python을 사용해야하는 상황이 오게되어 이 참에 Python 공부를 할겸 정리해볼 예정입니다.
Python vs Java
언어 특성
- 언어 유형:
- Python: 동적 타입(Dynamically Typed) 언어로, 변수 선언 시 타입을 명시하지 않아도 됩니다. Python 인터프리터가 실행 중에 데이터 타입을 확인합니다.
- Java: 정적 타입(Statically Typed) 언어로, 모든 변수는 선언 시 명시적으로 타입을 지정해야 합니다. 컴파일 타임에 타입 체크가 이루어집니다.
- 코드 작성 스타일:
- Python: 문법이 간결하고 코드의 가독성이 높습니다. 들여쓰기가 구조를 결정하는 중요한 요소로 사용됩니다.
- Java: 좀 더 구조화된 문법을 가지며, 코드가 더 길고 엄격합니다. 중괄호 {}를 사용하여 코드 블록을 구분합니다.
- 메모리 관리:
- Python: 자동으로 메모리를 관리하며, 가비지 컬렉션(Garbage Collection)을 통해 사용하지 않는 객체를 정리합니다.
- Java: Python과 유사하게 가비지 컬렉션을 사용해 자동으로 메모리를 관리하지만, 좀 더 세밀한 튜닝이 가능합니다.
2. 실행 방식
- 인터프리터 vs 컴파일러:
- Python: 인터프리터 언어로, 코드를 한 줄씩 실행합니다. 빠른 개발 및 디버깅에 유리합니다.
- Java: 컴파일된 바이트코드가 Java Virtual Machine(JVM)에서 실행됩니다. 한번 컴파일된 코드는 여러 플랫폼에서 실행될 수 있습니다.
- 성능:
- Python: 인터프리터 방식으로 실행되기 때문에 Java보다 일반적으로 느리지만, 성능이 중요한 경우 C로 작성된 모듈을 통해 성능을 개선할 수 있습니다.
- Java: 정적 타입과 JIT(Just-In-Time) 컴파일러 덕분에 Python보다 빠른 실행 속도를 제공합니다.
3. 라이브러리와 생태계
- Python: 데이터 과학, 머신러닝, 웹 개발, 자동화 등 다양한 분야에 걸쳐 방대한 라이브러리 생태계를 보유하고 있습니다. 특히, AI/ML 프로젝트에서 주로 사용됩니다.
- Java: 엔터프라이즈 애플리케이션, 모바일(Android) 개발, 서버 측 프로그래밍에서 강력한 생태계를 가지고 있으며, 대규모 시스템에 적합합니다.
4. 멀티스레딩 및 병렬 처리
- Python: GIL(Global Interpreter Lock)로 인해 진정한 병렬 스레드 실행에는 제약이 있지만, 멀티프로세싱으로 병렬 처리를 구현할 수 있습니다.
- Java: 진정한 스레드 기반 병렬 처리를 지원하며, 동시성 프로그래밍에서 강력한 성능을 발휘합니다.
5. 커뮤니티 및 지원
- Python: 오픈 소스 커뮤니티가 매우 활발하며, 다양한 분야에서 강력한 지원을 받습니다. 학습 자료도 많아 초보자에게 적합합니다.
- Java: 오랜 역사를 가진 언어로서, 커뮤니티가 매우 크고 안정적입니다. 엔터프라이즈 환경에서의 지원이 강력합니다.
1. 동적 타입 vs 정적 타입
- 타입 선언 생략: Python에서는 변수 선언 시 타입을 명시할 필요가 없습니다. 이는 코드 작성이 더 간결해지는 장점이 있지만, 타입 에러를 초래할 수 있으므로 주의해야 합니다.
# Java
int number = 10;
# Python
number = 10 # 타입 선언 없이 변수에 값 할당
- 타입 검사: 동적 타이핑으로 인해 런타임 시에 타입 에러가 발생할 수 있으므로, 필요할 경우 type() 함수를 사용해 변수 타입을 확인하는 습관을 들이는 것이 좋습니다.
print(type(number)) # <class 'int'>
2. 들여쓰기와 코드 블록
- 들여쓰기 규칙: Python은 들여쓰기를 통해 코드 블록을 구분합니다. Java의 {} 대신 들여쓰기를 철저하게 관리해야 합니다.
# Java
if (condition) {
// 코드 블록
}
# Python
if condition:
# 코드 블록 (들여쓰기 필수)
3. 함수와 클래스
- 간결한 함수 정의: Python에서는 함수 정의가 매우 간단합니다. 접근 제한자(public, private) 등을 생략하고 바로 정의할 수 있습니다.
# Java
public int add(int a, int b) {
return a + b;
}
# Python
def add(a, b):
return a + b
- self 키워드: Python에서는 클래스 내에서 메서드를 정의할 때 self를 사용하여 객체 자신을 참조해야 합니다. Java의 this와 유사합니다.
class MyClass:
def __init__(self, value):
self.value = value
def display(self):
print(self.value)
4. 패키지 관리와 가상환경
- pip와 가상환경: Python에서는 pip를 통해 패키지를 설치하고, 가상환경(venv)을 사용해 프로젝트별로 패키지를 격리하여 관리합니다. Java의 Maven이나 Gradle과 비슷한 개념이지만, 설치 및 사용이 더 간단합니다.
pip install requests # 패키지 설치
python -m venv myenv # 가상환경 생성
source myenv/bin/activate # 가상환경 활성화
5. 예외 처리
- 간단한 예외 처리: Python의 예외 처리 방식은 Java와 유사하지만, 문법이 더 간결합니다.
try:
result = 10 / 0
except ZeroDivisionError as e:
print("Error:", e)
6. 리스트와 컬렉션
- 리스트와 사전: Python의 리스트(list)와 사전(dictionary)은 Java의 배열과 HashMap과 유사하지만, 더 유연하고 사용하기 쉽습니다.
# 리스트
numbers = [1, 2, 3, 4, 5]
# 사전
student = {"name": "Alice", "age": 20}
7. 문자열 처리
문자열 포맷팅: Python에서는 문자열 포맷팅이 매우 간편합니다. 특히, f-string을 사용하면 더 직관적으로 문자열을 조합할 수 있습니다.
name = "Alice"
age = 20
# Java
System.out.printf("My name is %s and I am %d years old.", name, age);
# Python
print(f"My name is {name} and I am {age} years old.")
'기타' 카테고리의 다른 글
테스트 케이스 작성 전략 (2) | 2024.09.27 |
---|---|
Github와 Githib Actions 맛보기 (1) | 2024.09.20 |
Gradle로 IDE없이 프로그램 실행하기 (1) | 2024.09.16 |
Mobile App 초기 실행 테스트 (0) | 2024.09.13 |
마이크로서비스 아키텍처에서 API 테스트하기 (1) | 2024.09.09 |