1. property(프로퍼티/ 속성)
자바에서는 get/set 함수를 이용해 속성값을 바꾸거나 조회한다. 이를 좀 더 쉽게 구현하도록 만든 것이 프로퍼티라고 할 수 있다.
클래스 내부, 메서드 바깥에
public [반환 형식] 프로퍼티 이름 {get; set; }
형식으로 선언한다. 이때 프로퍼티 이름은 속성 이름이나 논리적으로 속성을 나타내는 이름이 좋다.
class Car{
private int wheelVar;
public int Wheel{
get{ return wheelVar;} // 조회할때 자동 호출
set{ wheel = value; } // 대입할때 자동 호출
}
}
이런 식으로 선언하면 자동으로 프로퍼티를 조회하거나 호출할때 호출된다. 즉, 프로퍼티를 필드처럼 사용 가능한 것이다.
Car car = new Car();
car.Wheel = 4; // 프로퍼티의 set 함수 호출되어 wheelVar에 변수 자동 대입
Console.WriteLine(car.Wheel); // 프로퍼티의 get함수 호출되어 4출력됨.
이는 워낙 많이 쓰이는 형태이기에 자동으로 구현이 가능하다.
class Car{
private int wheelVar;
public int Wheel{ get; set; } // 자동으로 구현됨
}
이처럼 코드를 적어도 자동으로 get, set 함수가 구현된다. 물론 내부적으로 로직을 추가하고 싶으면 위의 코드처럼 직접 구현해서 추가해야 한다.
C#6.0 이상부터는 자동으로 값을 초기화하는 것 역시 가능하다.
class Car{
private int wheelVar;
public int Wheel{ get; set; } = 4; // 기본값 설정
}
사용 용도에 따라 get 이나 set 만 구현할수도 있다.
get 만 구현할 경우 읽기 전용 속성이 되며, set 만 구현하면 쓰기 전용 속성이 된다.
2. 인덱서
인스턴스를 배열처럼 사용할수 있게 해주는 기능이다. 객체의 속성에 마치 배열처럼 [](첨자) 로 접근 가능하도록 해주며, 구현 방식에 따라 Hashtable(자바의 Map) 처럼 접근도 가능하다.
public 반환타입 this[]{ get; set; }
형태로 선언 가능하다.
class Car
{
private string name;
private string maker;
public Car(string name, string maker)
{
this.name = name;
this.maker = maker;
}
public string this[int index]
{
get
{
switch (index)
{
case 0: return name;
case 1: return maker;
default: return "잘못된 값";
}
}
}
}
이렇게 작성하면 다음과 같이 접근이 가능해진다.
Car car = new Car("벤츠", "메르세데스");
Console.WriteLine(car[0]); // 벤츠 출력
Console.WriteLine(car[1]); // 메르세데스 출력
이때 set 함수도 구현해서 프로퍼티처럼 값을 받을수도 있다.
class Car
{
private string name;
private string maker;
public Car(string name, string maker)
{
this.name = name;
this.maker = maker;
}
public string this[int index]
{
get
{
switch (index)
{
case 0: return name;
case 1: return maker;
default: return "잘못된 값";
}
}
set
{
switch (index)
{
case 0: name = value; break;
case 1: maker = value; break;
default: return;
}
}
}
}
이때는 아래와 같이 접근하여 속성을 바꿀수 있다.
Car car = new Car("벤츠", "메르세데스");
car[0] = "xxxx";
Console.WriteLine(car[0]); // xxxx 출력
이를 이용해서 인덱서의 매개변수를 string 으로 받고, 내부적으로 hashtable 을 가지고 있거나 switch, if 같은 조건문을 작성해서 car["name"] 처럼 접근할 수 있게 구현하는 것 역시 가능하다.
class Car
{
private string name;
private string maker;
public Car(string name, string maker)
{
this.name = name;
this.maker = maker;
}
public string this[string key]
{
get
{
switch (key)
{
case "이름": return name;
case "제조사": return maker;
default: return "잘못된 값";
}
}
set
{
switch (key)
{
case "이름": name = value; break;
case "제조사": maker = value; break;
default: return;
}
}
}
}
프로퍼티와 인덱서 둘 모두 C# 에서 개발의 편의성을 위해 제공하는 예외적인 문법이다.
'공부 > C#' 카테고리의 다른 글
(5) C# 기초 문법 - 연산자 오버로딩, foreach, 이터레이터, 가변배열 등 (0) | 2024.10.17 |
---|---|
(3) C# 기초 문법 - readonly, out, ref, 가변길이 매개변수 등 (0) | 2024.10.16 |
(2) C# 기초 문법 - namespace, 클래스, 구조체, static, 접근 제한자 등 (1) | 2024.10.16 |
(2) C# 기초 문법 - 기본형, 변수, 상수, 문자 (1) | 2024.10.16 |
(1) C# 이란? (0) | 2024.10.16 |