본문 바로가기
기타

Python 기초 개념 정리하기

by 보증서는 남자 2024. 9. 2.

많은 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.")