+ 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!
+ 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!
+ 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~
+ '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.
+ 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!
[Property?]
+ C#의 기능 중, 유용한 Property(속성)이라는 기능이 있습니다.
+ 이게 무엇이냐면, 일반적으로 다른 언어에서 코딩을 할 때, 데이터의 은닉성을 위해, getter, setter를 많이 씁니다. 이런 데이터 접근 방식을 C#만의 스타일로 편하게 만들어 준 것이 Property입니다~
[Property(속성)]
+ get, set 등 C#의 속성은, 해당 속성을 읽을 때, 실행시킬 구문들을 지정할 때 사용합니다.
+ 함수와는 달라서, 다른 변수들을 집어넣어줄 순 없고, 실행문만 넣을 수 있습니다.
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 32 | namespace CsPractice { class Program { public int variable { get; set; } public int Variable { get { Console.WriteLine("get 실행"); return variable + 2; } set { variable -= value; Console.WriteLine("set 실행"); variable--; } } static void Main(string[] args) { Program a = new Program(); a.variable = 1; a.Variable = 2; Console.WriteLine("{0}, {1}", a.variable, a.Variable); } } } | cs |
+ 변경을 허용하기 전에 데이터의 유효성을 검사하거나, 데이터가 실제로 데이터베이스 등의 다른 소스에서 검색되는 클래스에 데이터를 투명하게 공개하고, 데이터 변경 시 이벤트 발생, 다른 필드의 값 변경 등의 작업을 수행할 수 있습니다.
- (아마도 공개한다는 의미는, 데이터를 집어 넣음으로써, 다른 곳에서도 사용할 수 있게 한다인 것 같다.)
+ virtual, abstract, override, new와 같은 여러 지정자를 사용할 수 있습니다.
virtual)
+ 자식에서 override해주지 않으면, 부모의 property가 실행이되며, override해주면, 선언한 property가 실행됩니다.
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 | namespace CsPractice { class root { public int aaa; public virtual int AAA { get{ return aaa + 1; } set{ aaa = value + 1; } } } class Program : root { // public override int AAA { get => base.AAA + 10; set => base.AAA = value; } public override int AAA { get { return 111; } set { aaa = 222; } } static void Main(string[] args) { Program a = new Program(); a.AAA = 2; Console.WriteLine("{0}, {1}", a.aaa, a.AAA); } } } | cs |
abstract)
+ abstract class에서 선언한 abstract property를 자식에서 만들어 줘야 합니다.
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 | namespace CsPractice { // abstract class 생성. abstract class root { public abstract int aaa { get; set; } } class Program : root { // override를 통해 추상속성을 구체화 public override int aaa { get { return 111; } set { aaa = 222; } } static void Main(string[] args) { Program a = new Program(); a.aaa = 2; Console.WriteLine("{0}", a.aaa); } } } | cs |
new)
+ 상속받는 property와 이름은 같으나, 완전 다른 property를 생성할 때 사용합니다.
+ 부모로 형변환을 해서 property에 접근하면 안되나? 라고 하실 수 있겠지만, virtual에서는 그렇게하면 자식의 property가 실행되기 때문에, 부모의 root의 property를 사용하는 상황이라면, 자식에서 new를 통해 새로 만들어 줘야 할 겁니다!
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 | namespace CsPractice { class root { public int aaa; public int AAA { get { return aaa + 1; } set { aaa = value + 1; } } } class Program : root { // Program class만의 새로운 AAA 선언 public new int AAA { get { return 111; } set { aaa = 222; } } static void Main(string[] args) { Program a = new Program(); // root property 실행 ((root)a).AAA = 2; Console.WriteLine("{0}, {1}", ((root)a).AAA, a.AAA); } } } | cs |
*** 참고해야할 점
- virtual이나 abstract를 사용할 땐, 재정의 해주는 부분의 한정자를 override로 해줘야 한다.
- get, set에서 property자체를 사용하려고하면 SO(StackOverflow)에러가 납니다. ( ex) int AAA { get{ return AAA;} set{ AAA=value;} }
- get, set 둘 다 구현하거나, 구현하지 않거나 하셔야합니다.
** 참고사이트 **
- (공식 Docs) https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/using-properties
Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.
'재료들 > C#' 카테고리의 다른 글
List<>에서 insert하기! (0) | 2018.07.06 |
---|