728x90
반응형
1. 핵심 정리
using System;
class People {
private int age = 0;
public int Age {
get { return age; }
// protected set { age = value; } - 생략 가능
}
}
class Program {
static void Main() {
People p = new People();
// p.Age = 10; - error
Console.WriteLine(p.Age);
}
}
① setter / getter 의 접근 권한을 변경할 수 있다.
② 읽기 전용 또는 쓰기 전용 속성을 만들 수도 있다.
③ Backing 필드가 없는 속성을 만들 수 도 있다.
Backing 필드란?
위의 코드에서 Age는 결국 age필드에 접근하기 위해 만들어진 것이다.
이 때 이런 필드들을 지원필드라고 하며 원어로 Backing field라고 한다.
예를 들어 위의 코드에서 성인인지를 판단하는 부분을 추가한다고 했을 때
아래와 같이 사용할 수 있다.
using System;
class People {
private int age = 0;
public int Age {
get { return age; }
// protected set { age = value; } - 생략 가능
}
public bool IsAdult {
get { return age > 18; }
}
}
class Program {
static void Main() {
People p = new People();
// p.Age = 10; - error
Console.WriteLine(p.Age);
if (p.IsAdult) { }
}
}
2. 자동 속성
using System;
class People {
private int age = 0;
public int Age {
get { return age; }
set { age = value; }
}
}
class Program {
static void Main() {
People p = new People();
p.Age = 10;
Console.WriteLine(p.Age);
}
}
위와 같이 get은 필드를 리턴만 해주고 set이 value를 필드에 넣기만 하는 간단한 코드라면
코드를 더욱 간결하게 할 수 있다.
using System;
class People {
public int Age { get; set; } = 0; // 자동 속성
}
class Program {
static void Main() {
People p = new People();
p.Age = 10;
Console.WriteLine(p.Age);
}
}
① 자동 속성 (automatic property)
=> Backing field, set get의 구현을 자동으로 제공하는 property
② public 필드 vs 자동 속성
사실 위의 코드만 보면 public으로 backing field를 만드는 것과 속성으로 만드는 것과 차이는 없다.
하지만 public으로 필드를 만들어 쓰는것이 시간이 지나 실수가 많으니
속성으로 바꾸기로 했을 때 이는 사용하는 부분의 모든 코드도 바꾸어야 하는 문제가 있다.
(ex. p.age = 10 -> p.set(10))
따라서 미리 속성으로 만들어 두고 나중에 유효성 검사 부분을 추가하는게 편할 수 있다.
3. 속성을 이용한 초기화
using System;
class Point {
public int X { get; set; } = 0;
public int Y { get; set; } = 0;
}
class Program {
static void Main() {
Point p1 = new Point();
Point p2 = new Point() { X = 10, Y = 20 };
Point p3 = new Point { X = 10, Y = 20 };
Point p4 = new Point { Y = 20 };
}
}
① 객체 생성 시 프라퍼티 값을 초기화 하는 표기법
using System;
class Program {
static void Main() {
var p = new { Name = "kim", Age = 20 };
Console.WriteLine(p.Name); // "kim"
p.Name = "lee" // error
}
}
② 무명 형식 (Anonymous type)
=> 읽기 전용 Property로 생성
=> LINQ 등에서 많이 사용
728x90
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 제너릭 (Generic) (0) | 2020.03.23 |
---|---|
[C#] 인덱서 (Indexer) (0) | 2020.03.19 |
[C#] 속성 (property) (1) (0) | 2020.03.12 |
[C#] Extension Method (0) | 2020.03.09 |
[C#] Named, Optional Parameter (0) | 2020.02.28 |