일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C++
- Python
- vuetify
- condition
- VUE
- var
- npm
- security
- property
- webpack
- docker
- C#
- TypeScript
- 보안
- type
- Clone
- machine learning
- bash
- git
- loop
- generic
- scss
- BOJ
- JavaScript
- nginx
- 앙상블
- vue.js
- leetcode
- AI
- dotenv
- Today
- Total
ice rabbit programming
[C#] Property와 Indexer 본문
Property
약 4개월간 C#을 써 보면서 여지껏 썼던 언어들과의 가장 큰 차이점이자 편리하다고 생각되는 것이 바로 이제 얘기할 Property(속성)이다.
클래스 내부의 변수는 Field(필드), 함수는 Method(메소드)라고 부르는데 C#에서는 Property가 추가로 존재한다.
C++이나 Java를 접해보았다면 접근 지정자에 대해서 많이 들어봤을 것이다. 객체 지향 언어에서는 캡슐화를 통한 정보 은닉을 중요시하기 때문에, 외부에서는 꼭 필요한 경우에만 접근 가능하게 하고, 그러한 접근 또한 직접적으로 변수에 접근이 아니라 get/set 등의 함수를 통해서 하도록 한다.
C#도 객체 지향 언어이기 때문에, 기본적으로 필드는 private으로 해두고 Property나 메소드를 이용해 접근한다. 즉, 변수이지만, 메소드 정의와 함께 있어 getter와 setter를 통해 접근한다. 이는 선언에서의 편리함을 가져온다.
사용할 때에도 object.getAge(); 가 아니라 object.Age;와 같이 변수처럼 사용할 수 있어 좀 더 코드를 직관적으로 작성하고 이해할 수 있다.
계속 말로만 하는 것보다 아래 코드를 보는 것이 이해가 빠를 것이다.
public class Example{
private int _age; // Field
public int Age { // Property
get {
if(_age>=0)
return _age;
}
set {
if(value>=0) // 들어오는 값이 value라고 약속되어 있다.
_age=value;
}
}
}
이런 식으로, Back Field의 변수와 연결하여 사용할 수 있다. 위와 같이 선언하거나 호출할 경우 IL에서 뜯어보면 get_Age와 set_Age가 자동으로 생성되고(선언 시) 호출된다(호출 시). get과 set에 따로 접근지정자도 부여할 수 있으므로 권한 지정 및 닫기가 더 편리하고 중요하다고 할 수 있다. 또한 위 예시에서는 Back Field를 연결하였으나, Back Field에 값을 저장해야 할 필요가 없는 경우에는 없어도 Property만 독자적으로 만들 수 있다.
위는 getter와 setter 내부에서 유효성 검사 등 다른 동작을 했기 때문에 저렇게 작성된 것인데, 만약 단순히 get과 set의 역할만을 한다면 자동 속성(Automatic Property)을 사용할 수 있다.
public class Example2 {
public int Age { get; private set; }
}
이러면 get, set의 동작을 하는 메소드를 자동으로 컴파일러가 생성한다. 위에서 말한 set에 따로 접근지정자를 부여하는 것은 위와 같이 써 주면 된다. 확장성이나 접근 제한의 면에서 public Field보다 좋다고 볼 수 있다. 단, Property에 set을 지정하지 않았더라도 객체의 생성자에서는 초기화시켜줄 수 있다. 그 외에는 set이 없다면 접근이 불가하다.
Indexer
사실 굉장히 자주 사용하는 위 Property와는 달리, 필자가 아직 경험이 부족해서 그런지 Indexer는 사용해본 적이 없고, 강의에서만 들었다.
객체를 배열처럼 사용할 수 있도록 해주는데, C++에서 [] 연산자 오버로딩과 비슷한 개념이다.
public string this[int idx] {
get { return words[idx]; }
set { words[idx] = value; }
}
클래스 내부에서 이렇게 생성해 주면, objectTemp[0] 을 호출하면 objectTemp 객체 내의 words[0]이 return된다. Property와 유사하게 get_Item과 set_Item 메소드가 자동으로 생성, 호출된다. 매개변수를 가지는 Property 라고도 볼 수 있다. 끝으로 여기서는 idx를 int 타입으로 했으나 꼭 정수이고 1개여야할 필요는 없다.
이처럼 Property과 유사한 점이 많아서 같은 글에 작성하였다.
기초라고 생각하는 C# 내용의 절반 정도를 정리한 것 같다. 남은 글도 열심히 써야겠다.
'Development > C#' 카테고리의 다른 글
[C#] Generic (0) | 2020.05.24 |
---|---|
[C#] Index와 Range (0) | 2020.05.17 |
[C#] 메소드 (0) | 2020.05.04 |
[C#] 배열(Array) (0) | 2020.04.30 |
[C#] C#의 자료형3 - Casting과 Boxing (0) | 2020.04.18 |