객체 지향 프로그램(OOP)에서 캡슐화(Encapsulation)는 객체의 필드와 메서드를 묶어, 실제 구현 내용 일부를 외부에 감추는 것을 의미한다.
c#에서도 클래스를 만들어 사용할 때 민감한 정보가 담긴 필드는 외부에서 함부로 읽고 쓰게 할 수 없게 하기 위해 은닉성 보장이 필요하다.
이를 위해 접근 제한자 private를 사용해 외부에서 접근하지 못하게 막아두는데, 이때 캡슐화된 필드를 메서드를 통해 부분적으로 외부에 들어나게 한다.
public class Student1
{
private string name;
private int score;
private void setName(string name)
{
this.name = name;
}
public string getName()
{
return this.name;
}
private void setScore(int score)
{
this.score = score;
}
public int getScore()
{
return this.score;
}
}
public class Program1
{
Student1 student1 = new Student1();
public void search()
{
// student1.setName("홍길동"); // 접근 불가
Console.WriteLine($"Name: {student1.getName()} / Score: {student1.getScore()}");
}
}
위 예시를 보면 Student 클래스의 필드에 값을 넣을 순 없지만 값을 확인하는것은 가능하다.
하지만 변수가 많을수록 필요한 함수가 점점 많아진다.
그래서 프로퍼티가 필요해진다.
프로퍼티(Property)는 속성 값을 반환(get)하거나 새 값을 할당(set)할 수 있게한다.
- get: 특정 값 또는 특정 필드 값을 반환
- set: value 키워드를 사용해 값을 읽어 관련 필드에 저장
기본 프로퍼티 get set 구조
public class Student2
{
public string name;
public string nameP // 프로퍼티
{
get { return name; }
private set { name = value; }
}
private int score;
public int scoreP // 프로퍼티
{
get { return score; }
private set { score = value; }
}
}
public class Program2
{
Student2 student2 = new Student2();
public void search()
{
// student2.nameP = "홍길동"; // 접근 불가
Console.WriteLine($"Name: {student2.nameP} / Score: {student2.scoreP}");
}
}
동일한 기능을 하는 메서드를 따로 만드는 것 프로퍼티 작성하니 보다 코드가 줄어들었다. 또한 프로퍼티를 사용할 때는 메서드 처럼 사용하는게 아닌 변수처럼 사용해 코드를 읽기에도 용이해졌다.
기본 set get 구조 보다 간편한 자동 구현 프로퍼티도 있다.
자동 구현 프로퍼티
public class Student3
{
public string name { get; private set; }
public int score { get; private set; }
}
public class Program3
{
Student3 student3 = new Student3();
public void search()
{
// student3.name = "홍길동"; // 접근 불가
Console.WriteLine($"Name: {student3.name} / Score: {student3.score}");
}
}
별 다른 내용 없이 값을 주고 받기만 한다면 이렇게 자동 구현 프로퍼티를 통해 아주 간단하게 코딩 할 수 있다.
반면에 값을 읽거나 대입할 때 바로 읽거나 대입하는 것이 아니라, 다양한 응용이 필요한 경우도 있을 수 있다.
예를 들어
name 필드는 3글자가 아니면 로그를 남기고, 값을 읽을 땐 뒤에 무조건 "학생"이라는 단어를 붙여준다는 조건이 있고,
score 필드는 0 ~ 100까지 값만 받는다고 가정해보자.
프로퍼티 활용
public class Student4
{
private string name;
public string Name
{ get { return name + " 학생"; }
set { if (value.Length == 3) name = value;
else Console.WriteLine("3글자만 입력해주세요");
}}
private int score;
public int Score
{
get { return score; }
set {
if (value < 0) score = 0;
else if (value > 100) score = 100;
else score = value;
}
}
}
public class Program4
{
Student4 student4 = new Student4();
public void search()
{
student4.Name = "길동"; // 3글자만 입력해주세요
student4.Name = "홍길동";
student4.Score = 101;
Console.WriteLine($"Name: {student4.Name} / Score: {student4.Score}"); // Name: 홍길동 학생 / Score: 100
}
}
위와 같이 프로퍼티 내에서 여러 변수를 조합하거나 조건문을 사용하면 논리적 오류 발생을 예방할 수 도 있다.
프로퍼티 사용의 장점
- 데이터에 직접 접근하지 않아 객체의 은닉성을 지킬 수 있다.
- get, set 메서드를 직접 구현하는 것에 비해 간편하다.
- 함수 호출 방식이 아닌 변수를 지정하는 것 처럼 사용하여 코드 가독성이 좋다.
'C# > etc.' 카테고리의 다른 글
[C#] 열거형 Enum (0) | 2024.12.16 |
---|---|
[C#] as, is 키워드 (0) | 2024.12.12 |
[C#] 연산자 오버로딩 (Operator Overloading) (1) | 2024.12.11 |
[C#] ? 문법 (question mark) (1) | 2024.11.28 |