파이썬과 자바의 변수 선언 방식 차이; 유연성과 안정성의 균형

예진·2025년 1월 22일
1

python

목록 보기
4/9
post-thumbnail

1. 문제 제기

혼공파 p.115 혼공파_2주차 포스팅 中

자바에서는 변수를 사용하기 전에 변수의 자료형을 미리 선언하고 사용했는데, 하나의 변수에 여러 종류에 자료형을 넣을 수 있다는 파이썬의 유연성이 대체 뭐가 좋은지 모르겠다 이거임

그럼 나중에 코드 짤 때 변수의 양이 많아질 거 같다고 생각함.
디코 혼공단 Euno님이 알려주심

2. 자바

데이터분석책으로 공부하는 혼공단인데, 지나가다 질문이보여서 답글 남겨드립니다.

파이썬의 변수는 자료형을 지정하지 않는 '동적타입'이므로 기본적으로 변수를 많이 만들지 않아도 됩니다.
만약, 자료형이 고정된다면 여러 타입의 변수를 사용한다면 이를 계속해서 만들어야합니다. 즉, 메모리를 자료형마다 만드니 메모리 측면에서 비효율적이라 할 수 있습니다.

그리고 자바를 공부하신만큼, 자바에 있는 리스트는 리스트 내부의 데이터 타입을 한가지로 고정한다는 것을 아실겁니다. 하지만 파이썬에서는 자료형이 선언되지 않는 다는 점때문에 리스트에 여러가지 자료형을 저장할수 있습니다. 예를 들어,

import java.util.ArrayList;
public class Main {
    public static void main(String[] args) {
        // 문자열(String) 타입만 저장하는 리스트
        ArrayList<String> list = new ArrayList<>();

        list.add("Apple");
        list.add("Banana");
        // list.add(42);  // 컴파일 에러! 정수(int)는 허용되지 않음

        System.out.println(list);  // [Apple, Banana]
    }
}

자바에서는 리스트를 만들땐 리스트에 저장하는 타입을 문자열만 집어넣던, 하나의 자료형만 허용합니다.

그러나 파이썬은
A = [ 1, 2, 'hello', [1, 2], {key:value}] 등 여러자료형을 삽입해도 아무런 문제가 발생하지 않습니다.

그리고, 제가 생각하기엔 오히려 복잡한 코드를 짠다는 가정을 하면 변수를 재사용 하기에 어렵기에 자료형을 선언 하는 것이 코드가 길어지고 변수가 헷갈릴 가능성이 점점 높아질 것 같습니다.

3. 파이썬과 자바 변수 선언 비교

파이썬은 동적 타입 언어로, 변수의 타입이 실행 시간에 결정됨.

  • 변수 선언 시 타입을 명시적으로 지정할 필요 X
  • 하나의 변수에 여러 타입의 값을 자유롭게 할당 가능
  • 변수에 어떠한 값을 할당하냐에 따라 변수의 타입이 실행 중에 동적으로 변경 가능

자바는 정적 타입 언어

  • 변수 선언 시 명시적으로 타입을 지정해야 함
  • 변수에는 선언된 타입의 값만 할당할 수 있음
  • 변수의 타입은 컴파일 시간에 결정되며, 실행 중에 변경할 수 X

4. 동적 타입 vs 정적 타입

동적 타입(파이썬)의 장단점

장점

  • 코드 작성이 빠르고 간편함
  • 유연한 변수의 사용
  • 프로토타이핑에 유리함

단점

  • 런타임 에러 발생 가능성이 높음
  • 대규모 프로젝트에서 타입 관련 버그 찾기 어려움

정적 타입(자바)의 장단점

장점

  • 컴파일 시 타입 관련 에러를 잡을 수 있어 안정성이 높음
  • IDE의 자동 완성 기능 등을 통해 개발 생산성을 높일 수 있음
  • 코드의 가독성과 유지보수성 향상

단점

  • 코드 작성 시 더 많은 준비와 시간이 필요
  • 불필요하게 복잡한 코드를 작성할 가능성 有

5. POV 메모리

자료형을 선언하는 측면에 있어서 파이썬은 자바에 비교적 자유롭고, 자바는 제한적임.
파이썬은 a=10, a=apple 가능하지만,
자바는 a=10 또는 a=apple 둘 중 하나만 가능함.

[A] 이 때 파이썬의 자료형이 고정적이어야 한다면, 문자형 변수 따로, 정수형 변수 따로 선언해야함

따라서, [A] 의 조건에서는 메모리를 자료형마다 만들어야 하기 때문에 메모리 측면에서 비효율적임

이정도만 이해하면 될듯.. 내가 자바의 리스트도 제네릭도 다 잊어버려서....
추후 자바 공부할 때 유연성 시즌2 포스팅 해야지


6. 시티가 해준 답변 나중에 다시 보려고

네, 이해하기 어려우셨다니 죄송합니다. 자바의 데이터 타입과 관련해 더 자세히 설명해 드리겠습니다.

자바의 데이터 타입

자바에는 두 가지 주요 데이터 타입 카테고리가 있습니다:

  1. 기본 타입 (Primitive Types)

    • int, long, float, double, boolean, char, byte, short
    • 스택 메모리에 직접 값을 저장합니다.
  2. 참조 타입 (Reference Types)

    • 클래스, 인터페이스, 배열 등
    • 힙 메모리에 객체를 저장하고, 그 객체의 주소를 참조합니다.

배열과 기본 타입

배열은 기본 타입과 참조 타입 모두를 저장할 수 있습니다:

int[] numbers = {1, 2, 3, 4, 5};  // 기본 타입 int의 배열
String[] names = {"Alice", "Bob"};  // 참조 타입 String의 배열

리스트와 객체

리스트는 Java의 제네릭을 사용하며, 제네릭은 참조 타입만 사용할 수 있습니다. 따라서 리스트에는 직접적으로 기본 타입을 저장할 수 없습니다. 대신, 기본 타입의 래퍼 클래스(Wrapper Class)를 사용해야 합니다:

List<Integer> numbers = new ArrayList<>();  // int의 래퍼 클래스인 Integer 사용
numbers.add(1);
numbers.add(2);

List<String> names = new ArrayList<>();  // String은 이미 참조 타입
names.add("Alice");
names.add("Bob");

여기서 Integerint의 래퍼 클래스입니다. 자바는 오토박싱(auto-boxing)과 언박싱(unboxing)을 통해 기본 타입과 래퍼 클래스 간의 변환을 자동으로 처리합니다.

결론

자바가 객체 지향 언어라는 점은 맞지만, 성능과 메모리 효율성을 위해 기본 타입도 제공합니다. 리스트와 같은 컬렉션은 객체 지향적 설계를 따르므로 객체만을 다루지만, 배열은 더 낮은 수준의 구조체로 기본 타입도 직접 다룰 수 있습니다. 이런 차이가 있다는 것을 아는 것이 중요합니다.

profile
해시태그 정리하기.. 시리즈 썸네일 넣기....클라우드 메모 벨로그에 정리하기...

0개의 댓글

관련 채용 정보