MSM8994의 화룡점정 블로그

[C#] Getter와 Setter를 손쉽게! 속성을 써보자 본문

코딩

[C#] Getter와 Setter를 손쉽게! 속성을 써보자

msm8994 2018. 7. 20. 16:30

지난 글(보려면 클릭)에서 자바에서 어떤 멤버변수의 Getter 와 Setter를 만드는 방법을 알아봤습니다.
그런데 이건 그냥 프로그래머가 메소드를 만들어 쓰는 방식이라 단순 대입과는 다르게 코드 내에서 구별해내기 힘들지도 모르겠습니다.


C#의 '속성'

이런 기법을 언어 자체에서 지원하는게 있습니다 바로 C#입니다. 속성(property)라는 개념으로 지원되며 간단히 Getter와 Setter를 만들 수 있습니다. C#에서 속성은 첫글자를 대문자로 씁니다.


public double Average { get; private set; } // 학생의 점수 평균

학생의 점수 평균를 담는 속성을 만들었습니다. Setter가 private로 선언돼 다른 클래스가 이 값을 수정하려는 의도로부터 보호받고 있습니다. 그러면 Setter를 좀 더 복잡하게 만들어볼까요?

private int score = -1; // 학생의 점수 (-1: 입력 안 됨)
public int Score {
    get
    {
        // Getter와 Setter 둘 중 하나라도 따로 선언을 하게 되면 둘 다 get; 이나 set; 의 간결한 형태를 사용할 수 없음
        return this.score;
    }
    set
    {
        // Setter에서 전달받은 값은 value 키워드를 사용.
        if( 0 < value && value <= 100 )
        {
            this.score = value;
        }
    }
}

값이 어떻게 멤버 변수로 들어갈지 말지를 set 안에서 다룰 수 있습니다. 여기서는 Setter에 return 반환값을 설정할 수 없습니다. 이걸 원하신다면 자바에서처럼 하듯 메소드로 만들어 쓰세요.

그럼 속성의 사용법을 알아볼까요? 그냥 멤버 변수처럼 쓰시면 됩니다. 그러면 이 속성의 Getter와 Setter가 알아서 값을 가져와줍니다.


// 속성을 사용하려면 멤버 변수처럼 쓰면 된다.
student[i].Score = inputScore;

// 속성을 사용하려면 멤버 변수처럼 쓰면 된다.
switch(student[i].Score/10){
    case 10:
    case  9:
        // 100점~90점대 A
        Console.WriteLine("A");
        break;
    case  8:
        // 80점대 B
        Console.WriteLine("B");
        break;
    case  7:
        // 70점대 C
        Console.WriteLine("C");
        break;
    case  6:
        // 60점대 D
        Console.WriteLine("D");
        break;
    default:
        // 그 밖의 값은 F
        Console.WriteLine("F");
        break;
}

스택 오버플로우 예외에 주의하세요
public int Score {
// 속성 자신을 참조하면 무한 호출
    get
    {
        // Getter와 Setter 둘 중 하나라도 따로 선언을 하게 되면 둘 다 get; 이나 set; 의 간결한 형태를 사용할 수 없음
        return this.Score;
    }
    set
    {
        // Setter에서 전달받은 값은 value 키워드를 사용.
        if( 0 < value && value <= 100 )
        {
            this.Score = value;
        }
    }
}

이렇게 Getter와 Setter를 구성한다면 여기서 참조해야하는건 속성이 아니라 별도로 자리한 멤버 변수가 되어야 합니다 위에서처럼 속성을 직접 참조한다면 해당 속성이 변경될때 Setter가 무한으로 호출(StackOverflow)되어 더 이상 진행하지 못하게 됩니다.



맺음말

오늘은 자바 Getter 나 Setter 그리고 이들보다 써먹기 편한 C#의 속성 쓰는 법을 알려드렸습니다. Java에서 메소드로 구현된 Getter Setter보다 멤버 변수처럼 써먹을 수 있어 편한 존재라고 생각되지 않으시나요?

Comments