A. 프로퍼티의 구현과 사용법
자바에서는 private 필드를 접근할수있도록 하기위해 아래와 같이 GetXXX(), SetXXX() 메소드를 구현해서 사용했었다.
class MyClass
{
private int myField;
public int GetMyField(){return myField;}
public void SetMyField(int NewValue){myField=NewValue;}
}
하지만, C#에서는 접근자(accessor)라는 더 나은 구현법 ( get{}, set{} ) 을 제공한다.
class MyClass
{
private int myField;
public int MyField //접근한정자 데이터형식 프로퍼티명
{
get
{
return myField;
}
set
{
myField=value; //여기서 value는 선언한적이 없지만 C#컴파일러는 set 접근자의 암묵적 매개변수로 간주한다.
}
}
}
//사용시
static void Main(string[] args)
{
MyClass obj=new MyClass();
obj.MyField=3; //이제 MyClass객체는 '=' 연산자를 통해 myField에 데이터를 저장하거나 읽어올수있다.
Console.WriteLine(obj.MyField);
}
+) private필드가 변경되지 않기를 원한다면 프로퍼티에서 get접근자만 구현하면 된다.
그러나, get접근자가 아닌 set접근자만 구현하게된다면 코드관리를 어렵게 만드는 원인이 될 수 있으므로 주의필요.
* public 필드와 프로퍼티의 차이점?
-> 프로퍼티는 public 의 편의성과 get(),set()의 선택적 구현을 통해 은닉성을 지킬수있다.
B. 자동 구현 프로퍼티(Auto-Implemented Property)
C# 3.0 이후 도입되었으며, 필드를 선언할 필요도 없고, get, set 접근자 뒤에 세미콜론만 붙여줌으로써 구현된다.
public class NameCard
{
public string Name{ get; set; }
public string PhoneNumber{ get; set; }
}
+) C# 7.0 부터는 다음과같이 자동 구현 프로퍼티를 선언과 동시에 초기화를 수행할 수 있게했다. 이 기능으로 자동 구현 프로퍼티에 초기값이 필요할때 생성자에 초기화 코드를 작성할 필요가 없어졌다.
public class NameCard
{
public string Name{get; set;} = "Unknown";
public string PhoneNumber{get; set;} = "000-0000";
}
사용 예시)
class BirthdayInfo
{
public string Name { get; set; } = "Unknown";
public DateTime Birthday { get; set; } = new DateTime(1, 1, 1);
public int Age
{
get
{
return new DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year;
}
}
}
class MyClass
{
static void Main(string[] args)
{
BirthdayInfo birth = new BirthdayInfo();
Console.WriteLine($"Name : {birth.Name}");
Console.WriteLine($"Birthday : {birth.Birthday.ToShortDateString()}");
Console.WriteLine($"Age : {birth.Age}"); //Age 프로퍼티의 get 을 가져온다
birth.Name = "GT";
birth.Birthday = new DateTime(1994, 7, 8);
Console.WriteLine($"Name : {birth.Name}");
Console.WriteLine($"Birthday : {birth.Birthday.ToShortDateString()}");
Console.WriteLine($"Age : {birth.Age}");
}
}
C. 프로퍼티와 생성자
객체 생성시 프로퍼티를 이용한 초기화가 가능하다.
class BirthdayInfo
{
public string Name { get; set; } = "Unknown";
public DateTime Birthday { get; set; } = new DateTime(1, 1, 1);
}
BirthdayInfo birth2 = new BirthdayInfo()
{
Name = "GT2",
Birthday = new DateTime(2020, 7, 26)
};
D. 무명 형식 (Anonymous Type)
C#에는 int, double, string, MyClass등 형식에는 이름이있다.
하지만 무명형식은 형식의 이름을 지정하지 않으며, 인스턴스를 만들고 다시는 사용하지 않을때 유용함. (형식의 선언과 동시에 인스턴스를 할당) - 생소한 형식
var myInstance = new {Name="박상현", Age="17"}; //괄호 {와 }사이에 임의의 프로퍼티 이름을 적고
//값을 할당하면 그대로 새 형식의 프로퍼티가 된다.
주의점으로는, 무명 형식의 프로퍼티에 할당된 값은 변경이 불가능하다. 즉, 읽기만 가능하다.
class MainApp
{
static void Main(string[] args)
{
var a = new{Name = "박상현", Age=123};
Console.WriteLine($"Name:{a.Name}, Age:{a.Age}");
var b = new{Subject = "수학", Scores = new int[] {90,80,70,60}};
Console.Write($"Subject:{b.Subject}, Scores: ");
foreach(var score in b.Scores)
Console.WriteLine($"{score} ");
}
}
* 튜플과의 무명형식의 차이는, 튜플은 new(인스턴스 생성)이 필요없지만, 무명형식은 인스턴스생성이 필요하다.
+) 무명형식은 LINQ와 함께 유용하게 사용된다.
'C# 공부 > C# 기본 문법' 카테고리의 다른 글
배열 (선언 및 사용, 초기화, System.Array 클래스, 2차원/다차원 배열, 가변배열) (0) | 2020.07.26 |
---|---|
프로퍼티 - 2 (인터페이스의 프로퍼티, 추상 프로퍼티) (0) | 2020.07.26 |
추상 클래스 (클래스와 인터페이스의 사이) (1) | 2020.07.26 |
인터페이스 (선언과 사용법, 상속, 다중상속) (0) | 2020.07.26 |
클래스 - 4 (중첩클래스, 분할클래스, 확장메소드, 구조체, 튜플) (0) | 2020.07.25 |