객체지향 언어에서 클래스의 “멤버 변수(필드)”를 어떻게 정의하느냐는 언어마다 조금씩 차이가 있습니다.
이번 포스팅에서는 Java와 Python의 멤버 변수 선언 방식 차이에 대해 간단한 코드와 함께 비교해보겠습니다.
🔹 Java: 명시적인 선언이 필수
Java에서는 멤버 변수를 반드시 클래스의 정의 영역에 미리 선언해야 합니다.
public class Dog {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
- 클래스 맨 위에서 **
private String name;
**처럼 명시적으로 선언 - 생성자에서는 초기화만 수행
- 타입이 고정되어 있고, 컴파일러가 타입 체크를 해줌
- 실수를 줄일 수 있는 정적 타입의 장점
🔸 Python: 선언 없이 바로 사용 가능
Python은 훨씬 유연합니다. 멤버 변수는 __init__()
같은 메서드 안에서 바로 self.변수명
으로 생성하면 됩니다.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
self.name = name
에서self.name
이라는 인스턴스 변수가 즉시 생성됨- 미리 선언할 필요가 없음
- 하지만 실수로 오타를 내거나 다른 메서드에서 잘못된 속성을 생성할 가능성도 있음
💡 예시 비교: 선언 위치
구분 | Java | Python |
---|---|---|
변수 선언 | 클래스 블록 최상단에 private String name; 등 명시 | 생성자 안에서 self.name = name 로 바로 생성 |
변수 타입 | 반드시 지정 (int , String , etc) | 동적 타이핑 (int , str 등 자동 인식) |
생성자 역할 | 이미 선언된 변수에 값만 할당 | 선언 + 할당을 동시에 수행 |
유연성 | 낮음 (컴파일 타임 체크) | 높음 (런타임에 변수 생성 가능) |
✅ 보너스: 클래스 변수 vs 인스턴스 변수 (Python 예시)
class Dog:
species = "Canine" # 클래스 변수 (공유됨)
def __init__(self, name):
self.name = name # 인스턴스 변수 (개별 객체만 가짐)
Dog.species
는 모든 인스턴스가 공유하는 값,self.name
은 각 객체마다 다른 값을 가짐.
Java에서는 static
키워드를 활용하면 동일한 효과를 낼 수 있죠.
🧠 마무리 정리
항목 | Java | Python |
---|---|---|
멤버 변수 선언 | 클래스 정의부에 명시적으로 선언 | 생성자 또는 메서드 내부에서 바로 정의 가능 |
선언의 유무 | 선언 필수 | 선언 생략 가능 |
접근제어 | private , public , protected 등 명확함 | 명시적 제어자 없음 (_ , __ 로 관례 표시) |
실수 방지 | 높은 안정성 (컴파일 타임 오류) | 유연하지만 실수에 취약 |
Python을 처음 접하는 Java 개발자라면 이 차이에서 “어? 이게 되네?” 싶을 수 있습니다.
반대로 Python에 익숙한 분들이 Java로 넘어오면 명확한 타입 선언과 접근제어의 장점을 체감하게 되죠.
📌 당신은 어느 쪽 스타일이 더 익숙하신가요?
간결함을 중시한다면 Python, 안정성을 중시한다면 Java!
두 언어를 넘나드는 감각을 키워보세요 😎