객체 지향 프로그래밍에서 캡슐화(Encapsulation) 원칙을 준수하기 위해 클래스의 필드를 외부에서 직접 접근하는 것을 제한하고, 대신 메서드를 통해 접근하도록 합니다. Java와 C#은 이러한 접근을 위해 각각 Getter/Setter 메서드와 프로퍼티(Properties) 기능을 제공합니다.
1. Java의 Getter/Setter
Java에서는 필드에 직접 접근하는 것을 막고, get 및 set 메서드를 사용하여 값을 읽고 수정합니다.
예제: Java의 Getter/Setter
public class Person {
private String name;
private int age;
// Getter
public String getName() {
return name;
}
// Setter
public void setName(String name) {
this.name = name;
}
// Getter
public int getAge() {
return age;
}
// Setter
public void setAge(int age) {
if (age > 0) {
this.age = age;
}
}
}
특징
- 메서드 형태: getXxx(), setXxx() 형식의 메서드를 정의해야 합니다.
- 직접적인 필드 접근 제한: private 필드를 보호하여 객체의 무결성을 유지합니다.
- 유효성 검사 가능: setAge()에서 나이를 0 이상으로 제한하는 것처럼, 데이터를 검증하는 로직을 추가할 수 있습니다.
- 코드가 장황함: 필드마다 개별적인 get 및 set 메서드를 작성해야 하므로 코드가 길어질 수 있습니다.
2. C#의 프로퍼티 (Properties)
C#에서는 Java와 달리 프로퍼티(Property) 기능을 제공하여 getter/setter 메서드를 보다 간결하게 작성할 수 있습니다.
예제: C#의 프로퍼티
public class Person {
public string Name { get; set; }
public int Age { get; set; }
}
특징
- 직접적인 필드 접근 차단: private 필드처럼 동작하면서도 필드 접근을 간편하게 처리할 수 있습니다.
- 자동 구현 프로퍼티(Auto-Implemented Properties): { get; set; }을 사용하면 별도의 필드 없이 자동으로 내부 필드가 생성됩니다.
- 간결한 문법: getName() 또는 setName()을 만들 필요 없이, person.Name 형식으로 접근할 수 있습니다.
3. Java vs C# 비교
비교 항목 | Java (Getter/Setter) | C# (Property) |
문법 | getXxx() / setXxx() 메서드 사용 | { get; set; } 프로퍼티 사용 |
자동 구현 | 없음 (명시적 필드 선언 필요) | 자동 구현 프로퍼티 제공 |
코드 길이 | 길고 반복적일 수 있음 | 간결하고 직관적 |
유효성 검사 | setXxx()에서 검증 로직 추가 가능 | { get; set; } 대신 private set 또는 get 블록에서 검증 가능 |
데이터 접근 방식 | 메서드 호출 (obj.getName()) | 속성처럼 사용 (obj.Name) |
4. C# 프로퍼티의 추가 기능
C#의 프로퍼티는 단순한 { get; set; } 형태뿐만 아니라, 다음과 같은 다양한 기능을 제공합니다.
1) 읽기 전용 프로퍼티
public class Person {
public string Name { get; }
public Person(string name) {
Name = name; // 생성자에서만 값 설정 가능
}
}
- get만 선언하여 변경할 수 없는 읽기 전용 프로퍼티를 만들 수 있습니다.
2) private set을 이용한 제한적 변경
public class Person {
public string Name { get; private set; }
public void ChangeName(string newName) {
Name = newName;
}
}
- private set;을 사용하면 외부에서는 값을 변경할 수 없고, 내부 메서드에서만 수정할 수 있습니다.
3) 데이터 검증 추가
public class Person {
private int age;
public int Age {
get { return age; }
set {
if (value > 0) {
age = value;
}
}
}
}
- set 블록에서 값을 검증하는 로직을 포함할 수 있습니다.
5. 결론
✅ Java의 Getter/Setter
- 전통적인 방식으로 getXxx() / setXxx() 메서드를 명시적으로 작성해야 합니다.
- 코드가 다소 길어질 수 있지만, 유효성 검사 및 로직을 쉽게 추가할 수 있습니다.
- Lombok 같은 라이브러리를 사용하면 코드량을 줄일 수 있습니다.
✅ C#의 프로퍼티
- get; set;을 사용하여 자동으로 필드 처리가 가능하므로 코드가 간결합니다.
- private set, readonly 등을 활용하여 접근을 세밀하게 조정할 수 있습니다.
- { get; set; } 블록에서 데이터 검증 로직을 추가할 수도 있습니다.
따라서 C#의 프로퍼티는 Java의 Getter/Setter보다 코드가 간결하고 직관적이며, 유연한 접근 제한 및 데이터 검증이 가능하다는 장점이 있습니다. Java에서도 최근에는 Record 클래스나 Lombok 라이브러리를 사용하여 C#의 프로퍼티처럼 코드를 간결하게 만들 수 있습니다.
'프로그래밍' 카테고리의 다른 글
자바와 닷넷의 내부 클래스 (0) | 2025.03.02 |
---|---|
자바와 닷넷 예외 처리 (0) | 2025.03.02 |
파이썬으로 파일 이름 바꾸기 (0) | 2020.08.13 |
robocopy (0) | 2015.09.22 |
c#과 Java 비교 제네릭 (0) | 2015.08.22 |