반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[C# 교과서] 19. C# 활용(13) - 속성 사용하기 본문

C# 기초

[C# 교과서] 19. C# 활용(13) - 속성 사용하기

HYOKYE0NG 2022. 1. 20. 10:11
반응형
속성 사용하기

 

속성은 필드 값을 읽거나 쓰고 계산하는 방법을 제공하는 클래스 속성을 나타내는 멤버

 

속성

 

  • 클래스의 멤버 중에서 속성(property)은 단어 그대로 클래스 속성(특징, 성격, 색상, 크기 등)을 나타낸다.
  • 속성은 괄호가 없는 메서드와 비슷하고 개체 필드 중에서 외부에 공개하고자 할 때 사용하는 방법이다.
  • private 성격이 있는 필드를 public 속성으로 외부에 공개할 때 사용한다.
  • 클래스 안에 선언된 필드 내용을 설정(set)하거나 참조(get)할 때 사용하는 코드 블록을 속성이라고 한다.
Class 클래스 이름
{
	public [반환형식] 속성이름 { get; set; }
}

속성 정의 구문의 마지막에는 ;(세미콜론)이 붙지 않지만 속성을 선언과 동시에 초기화할 때는 세미콜론이 붙는다.

속성을 선언하는 구문도 static을 붙여 정적인 속성으로 만들 수 있다.

속성에 값을 설정하는 것을 세터(setter), 값을 읽어오는 것을 게터(getter)라고 한다.

using System;

class Developer
{
    public string Name { get; set; }
}

class Property
{
    static void Main()
    {
        //[1] 클래스의 인스턴스 새성
        Developer developer = new Developer();

        //[2] 속성에 값 설정(set)
        developer.Name = "박용준";

        //[3] 속성의 값 조회(get)
        Console.WriteLine(developer.Name);
    }
}

 

 

접근자와 전체 속성

 

  • get 접근자: return 구문을 사용하여 특정 값 또는 특정 필드 값을 반환한다.
  • set 접근자: value 키워드를 사용하여 속성에 지정된 값을 가져온다.
using System;

namespace PropertyFull
{
    class Person
    {
        // 필드
        private string name;

        // 속성
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

    class PropertyFull
    {
        static void Main()
        {
            var person = new Person();
            person.Name = "Gilbut"; // set
            Console.WriteLine(person.Name); // get
        }
    }
}

 

 

자동으로 구현된 속성

전체 속성을 쓰기 편하게 줄여놓은 속성을 자동으로 구현된 속성(automatically inplemented property)라고 한다.

using System;

namespace AutomaticallyImplementedProperty
{
    // 자동차 속성: 이름, 색상, ...
    public class Car
    {
        //[1] 필드와 속성을 함께 사용하는 전체 속성
        // 필드
        private string name;

        // 속성(Property)
        public string Name
        {
            get
            {
                return name; // 필드를 외부에 공개
            }
            set
            {
                name = value; // 외부에서 전달된 값을 필드에 초기화
            }
        }

        //[2] 자동으로 구현된 속성으로 간단하게 생성
        public string Color { get; set; }
    }

    class AutomaticallyImplementedProperty
    {
        static void Main()
        {
            Car c1 = new Car();
            c1.Name = "남보러가니"; // setter
            Console.WriteLine(c1.Name); // getter

            Car c2 = new Car();
            c2.Name = "제네실수"; c2.Color = "Red";
            Console.WriteLine("{0}, {1}", c2.Name, c2.Color);
        }
    }
}

 

자동 속성 이니셜라이저

자동 속성 이니셜라이저(auto property initializers)를 사용하면 속성을 선언과 동시에 기본값으로 초기화할 수 있다.

using System;

class AutoPropertyInitializers
{
    public static string Name { get; set; } = "길벗";
    static void Main()
    {
        Console.WriteLine(Name);
    }
}

 

읽기 전용 속성과 쓰기 전용 속성

속성의 get과 set 구문을 하나만 사용하여 읽기 전용 속성과 쓰기 전용 속성을 구현할 수 있다.

using System;

public class Page
{
    public string Message { get; private set; } = "읽기 전용 속성";
}

class PropertyPrivateSet
{
    static void Main()
    {
        Page page = new Page();
        //page.Message = "외부에서 쓰기 불가능";
        Console.WriteLine(page.Message); // 읽기 전용 속성
    }
}

 

속성의 여러 가지 유형

using System;

namespace PropertyAll
{
    public class Car
    {
        // 필드
        private string color; 

        // 생성자
        public Car()
        {
            this.color = "Black";
        }

        // 메서드로 외부에 공개
        public void SetColor(string color)
        {
            this.color = color; // this.필드 = 매개변수;
        }

        public string GetColor()
        {
            return color;
        }

        // 속성(프로퍼티;Property)
        public string Color
        {
            get
            {
                return color;
            }
            set
            {
                color = value;
            }
        }

        // 읽기전용 속성
        public string Make
        {
            get
            {
                return "한국자동차";
            }
        }

        // 쓰기전용 속성
        private string _Type;
        public string Type
        {
            set
            {
                _Type = value;
            }
        }

        // 축약형 속성
        public string Name { get; set; }
    }

    class PropertyAll
    {
        static void Main()
        {
            //[1] Set과 Get 메서드 사용
            Car car1 = new Car();
            car1.SetColor("Red");
            Console.WriteLine(car1.GetColor()); // Red

            //[2] 속성을 사용
            Car whiteCar = new Car();
            whiteCar.Color = "White"; // set {}
            Console.WriteLine(whiteCar.Color); // get {}

            //[3] 읽기전용 속성
            Car k = new Car();
            // k.Make = ""; // <- 이 코드는 에러
            Console.WriteLine(k.Make); // 읽기만 가능

            //[4] 쓰기전용 속성
            Car car = new Car();
            car.Type = "중형"; // 쓰기만 가능
            // Console.WriteLine(car.Type); // <- 이 코드는 에러: 읽기는 불가

            //[5] 축약형 속성
            Car myCar = new Car();
            myCar.Name = "좋은차";
            Console.WriteLine(myCar.Name);
        }
    }
}

 

 

개체 이니셜라이저

개체 이니셜라이저(object initializer)는 속성을 사용하여 개체 값을 설정하는 쉬운 방법을 제공한다.

using System;

namespace ObjectInitializer
{
    class Course
    {
        public int Id { get; set; } // Id 속성
        public string Title { get; set; } // Title 속성
    }

    class ObjectInitializer
    {
        static void Main()
        {
            //[1] 속성을 사용하여 개체 초기화
            Course csharp = new Course(); csharp.Id = 1; csharp.Title = "C#";
            Console.WriteLine($"{csharp.Id} - {csharp.Title}");

            //[2] 개체 이니셜라이저를 사용하여 개체 초기화
            Course aspnet = new Course() { Id = 2, Title = "ASP.NET" };
            Console.WriteLine($"{aspnet.Id} - {aspnet.Title}");
        }
    }
}

 

 

개체를 초기화하는 세 가지 방법

 

  • 속성 사용: 속성에 값을 직접 지정
  • 생성자 사용: 생성자의 매개변수로 전달된 값을 속성에 초기화
  • 개체 이니셜라이저
using System;

namespace ObjectInitializers
{
    public class Person
    {
        // 속성
        public string Name { get; set; }
        public int Age { get; set; }

        // 생성자
        public Person()
        {

        }
        public Person(string name, int age)
        {
            Name = name; Age = age;
        }
    }

    class ObjectInitializers
    {
        static void Main()
        {
            //[1] 속성 사용
            Person pp = new Person();
            pp.Name = "백두산";
            pp.Age = 100;

            //[2] 생성자 사용
            Person pc = new Person("홍길동", 21);

            //[3] 개체 이니셜라이저 사용
            Person pi = new Person { Name = "임꺽정", Age = 30 };
            Console.WriteLine($"{pi.Name}, {pi.Age}");
        }
    }
}

 

 

nameof 연산자

C# 6.0부터 제공하는 nameof 연산자를 사용하면 속성 이름 자체를 문자열로 가져올 수 있다.

using System;

namespace NameOfDemo
{
    class NameOfDemo
    {
        static void Main()
        {
            Car car = new Car();

            Console.WriteLine(nameof(car.Maker));
        }
    }

    class Car
    {
        public string Maker { get; set; }
    }
}

//Maker

속성 이외에 메서드 이름 자체도 nameof 연사자를 사용하여 문자열로 가져올 수 있다.

 

 

익명 형식

익명 형식(anonymous type)을 사용하면 특정 클래스로 형식을 만들 필요 없이 간단히 개체를 생성할 수 있다.

using System;

class AnonymousType
{
    static void Main()
    {
        var data = new { Id = 1, Name = "익명 형식" };
        Console.WriteLine($"{data.Id} - {data.Name}");
    }
}

개체를 만들 때는 new 키워드 다음에 특정 데이터 형식을 지정하는데, 이것 대신 중괄호 안에

직접 원하는 속성 이름과 속성 값을 바로 지정하여 이름이 없는 익면 형식(무명 형식)을 만들 수 있다.

 

 

 

 

 

<Reference>

 

반응형
Comments