개발꿈나무
[C# 교과서] 19. C# 활용(13) - 속성 사용하기 본문
속성 사용하기
속성은 필드 값을 읽거나 쓰고 계산하는 방법을 제공하는 클래스 속성을 나타내는 멤버
속성
- 클래스의 멤버 중에서 속성(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>
'C# 기초' 카테고리의 다른 글
[C# 교과서] 21. C# 활용(15) - 대리자(delegate), 이벤트(Event) (0) | 2022.01.20 |
---|---|
[C# 교과서] 20. C# 활용(14) - 인덱서와 반복기 (0) | 2022.01.20 |
[C# 교과서] 18. C# 활용(12) - 메서드와 매개변수 (0) | 2022.01.20 |
[C# 교과서] 17. C# 활용(11) - 생성자, 소멸자 (0) | 2022.01.20 |
[C# 교과서] 16. C# 활용(10) - 네임스페이스, 필드 (0) | 2022.01.19 |