+ 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


[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 둘 다 구현하거나, 구현하지 않거나 하셔야합니다.




Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

'재료들 > C#' 카테고리의 다른 글

List<>에서 insert하기!  (0) 2018.07.06

+ Recent posts