프로그래밍

Java의 Getter/Setter와 C#의 프로퍼티 비교

Jinwookoh 2025. 3. 2. 19:40

객체 지향 프로그래밍에서 캡슐화(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