반응형
1. 프로퍼티를 사용하는 이유
프로퍼티를 사용하면 은닉성과 편의성을 모두 잡을 수 있습니다.
class 클래스이름
{
데이터형식 필드이름;
접근한정자 데이터 형식 프로퍼티이름
{
get { return 필드이름; }
set { 필드이름 = value; }
}
}
이렇게 사용한다.
2. 메소드보다 프로퍼티
class MyClass {
private int myField;
public int GetMyField() { return MyField; }
public void SetMyField( int NewValue ) { myField = NewValue; }
}
MyClass obj = new MyClass();
obj.SetMyField(3);
Console.WriteLine( obj.getMyField() );
class MyClass {
private int myField;
public int myField
{
get { return myField; }
set { myField = value; }
}
}
짜잔, 이렇게 하니 못생긴 메소드 대신 우아한 프로퍼티를 얻었습니다.
이제 이렇게도 접근이 가능합니다.
MyClass obj = new MyClass();
obj.MyField = 3;
Console.WriteLine( obj.MyField );
잠깐만요, 읽기 전용 프로퍼티는 어떻게 만드나요?
class MyClass {
private int myField;
public int myField
{
get { return myField; }
}
}
set 접근자를 구현하지 않으면 쓰기 불가, 읽기 전용이 됩니다.
3. 자동 구현 프로퍼티
자동 구현 프로퍼티 선언
class 클래스이름
{
데이터형식 필드이름 { get; set; }
}
선언과 동시에 초기화도 가능
class 클래스이름
{
데이터형식 필드이름 { get; set; } = "초깃값";
}
4. 프로퍼티와 생성자
프로퍼티를 이용한 초기화
클래스이름 인스턴스 = new 클래스이름()
{
프로퍼티1 = 값,
프로퍼티2 = 값,
프로퍼티3 = 값
};
5. 무명 형식
var 객체명 = new { 임의프로퍼티1 = "값1", 임의프로퍼티 = "값2" }
★★★★★ 주의! ★★★★★
무명 형식의 프로퍼티에 할당된 값은 변경 불가하다.
6. 인터페이스의 프로퍼티
interface 인터페이스이름
{
public 형식 프로퍼티이름1 { get; set; }
public 형식 프로퍼티이름2 { get; set; }
}
7. 추상 클래스와 프로퍼티
abstract class 추상클래스이름
{
abstract 데이터형식 프로퍼티이름 { get; set; }
}
8. 활용 예제
// 5. 인터페이스의 프로퍼티
interface IPerson // 인터페이스 (필드 추가 불가)
{
string FirstName { get; set; }
string LastName { get; set; }
}
class Person : IPerson // 프로퍼티 (필드 추가 가능)
{
// 1. 프로퍼티
// 일반적으로 필드는 private 멤버로 사용
// 필드는 인스턴스에 데이터가 저장되는 직접적인 공간이라서
// 외부에 바로 공개하는 것은 제어권 상실, 즉 좋지 않은 패턴
// 따라서 프로퍼티는 public, 필드는 private이 일반적인 관습
public string FirstName { get; set; }
public string LastName { get; set; }
public Person() { }
public Person(string FirstName, string LastName)
{
this.FirstName = FirstName;
this.LastName = LastName;
}
public string FullName
{
get {
return this.FirstName + " " + this.LastName;
}
set {
var splited = value.Split(' ');
this.FirstName = splited[0];
this.LastName = splited[1];
}
}
// 2. 자동 구현 프로퍼티
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
// 1. 프로퍼티
var person = new Person("길동", "홍");
Console.WriteLine(person.FullName);
person.FullName = "순신 이";
Console.WriteLine(person.FullName);
// 3. 인스턴스 초기화
var person2 = new Person() {
FirstName = "길동",
LastName = "홍"
};
Console.WriteLine(person2.FullName);
// 4. 무명 형식 (값 수정 불가)
var person3 = new { Name = "홍길동", Age = 30 };
Console.WriteLine($"{person3.Name} {person3.Age}");
Console.ReadLine();
}
}
반응형
'C# > 이것이 C#이다' 카테고리의 다른 글
11장. 일반화 프로그래밍 (0) | 2023.05.18 |
---|---|
10장. foreach가 가능한 객체 만들기 (0) | 2023.05.18 |
8장. 인터페이스와 추상 클래스 (0) | 2023.04.28 |
7장. 클래스: this 키워드, this() 생성자, 접근 한정자, static 변수, 구조체 (0) | 2023.04.19 |
6장. 확장메소드, this와 ref, out, params 등 키워드, string.Empty (0) | 2023.04.19 |