본문 바로가기

C#/이것이 C#이다

9장. 프로퍼티

반응형

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();
    }
}

 

 

 

 

 

 

https://github.com/bonjenny/CHash/tree/main/8%EC%9E%A5%20-%20%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%99%80%20%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4

반응형