MSM8994의 화룡점정 블로그
[C#] Getter와 Setter를 손쉽게! 속성을 써보자 본문
지난 글(보려면 클릭)에서 자바에서 어떤 멤버변수의 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보다 멤버 변수처럼 써먹을 수 있어 편한 존재라고 생각되지 않으시나요?
'코딩' 카테고리의 다른 글
[JAVA] Math.random()을 활용한 중복이 없는 임의의 수 6개짜리 배열에 담기 (0) | 2018.07.24 |
---|---|
[JAVA] Calendar 객체와 SimpleDateFormat으로 얻은 날짜 문자열을 비교하기 (0) | 2018.07.23 |
[JAVA] 멤버 변수를 보호해주는 Getter와 Setter (0) | 2018.07.20 |
[JAVA] 배열을 배열에 담은 것이 2중 배열 (0) | 2018.07.18 |
[JAVA] 369 게임 (0) | 2018.07.18 |