언어 자료구조 알고리즘/Escort C#

[C#] 5.1.2 멤버 속성

언제나휴일 2016. 5. 2. 12:34
반응형


멤버 속성


5.1.2 멤버 속성

 

 멤버 속성은 멤버 필드에 있는 값을 얻어오거나 변경할 때 사용할 수 있게 제공하는 특별한 메서드입니다. 멤버 속성을 캡슐화하기 위해서는 형식과 속성 명을 선언하고 전용 필드의 값을 얻어올 때 사용하는 get 블록과 설정하는 set 블록을 선택적으로 정의할 수 있습니다. 각 블록에서는 메서드처럼 내부에서 수행할 작업에 대한 코드를 작성할 수 있으며 필요에 따라 get 블록과 set 블록의 접근 한정을 다르게 지정할 수도 있습니다. get 블록에서는 선언한 형식을 반환해야 하고 set 블록에서는 value 이름으로 전달된 값을 사용할 수 있습니다.

 

class Man

{

        string name;

        int hp = 0;

 

        public string Name   //멤버 속성 - get 블록만 선택적으로 정의

        {

            get

            {

                return name;

            }

        }

        public int Hp         //멤버 속성 - public으로 접근 지정

        {

            get                 //멤버 속성에 대한 접근 지정을 따름(public)

            {

                return hp;

            }

            private set      //private으로 접근 지정

            {

                hp = value; //value를 전달 받은 값을 사용할 수 있음

            }

     }

}

 

 이와 같은 멤버 속성은 멤버 필드의 신뢰성을 높이는 데 큰 역할을 할 수 있습니다. 외부에서 멤버 필드를 사용할 수 있게 접근을 허용한다면 잘못된 사용으로 신뢰성 없는 값을 갖게 될 수 있습니다. 예를 들어 사람의 hp 0에서 200사이이 값이 유지하게 하고 일을 하면 hp 5가 증가하게 하려고 합니다. 사람 형식의 멤버 필드 hp 접근을 public으로 지정하여 형식 외부에서 접근할 수 있게 하면 사용하는 곳에서 잘못된 값으로 hp를 지정하는 경우가 발생할 수 있습니다.

 

▶ 신뢰성이 없는 값을 사용한 예

using System;

namespace Ex_MemberProperty

{

    class Man

    {

        public string name; //멤버 필드의 접근을 public으로 지정

        public int hp = 0;  //멤버 필드의 접근을 public으로 지정

 

        public Man(string name)

        {

            this.name = name;

        }

 

        public void Work()

        {

            hp += 5;

        }

    }


    class Program

    {

        static void Main(string[] args)

        {

            Man man = new Man("홍길동");

            Console.WriteLine("{0} HP:{1}", man.name, man.hp);

            man.hp = 937; //잘못된 사용

            Console.WriteLine("{0} HP:{1}", man.name, man.hp);

        }

    }

}

▶ 실행 결과

홍길동 HP:0

홍길동 HP:937

 

 이 같은 경우에 개발자 사이에서는 Man을 잘못 정의한 것인지 사용을 잘못한 것인지 의견이 서로 다를 수 있습니다. OOP에서는 Man을 정의하는 곳에서 사용하는 곳에서 접근할 수 있는 멤버를 적절하게 지정할 수 있게 해 주는 문법을 제공합니다. 따라서 C#과 같은 OOP 언어에서는 위 경우 Man을 잘못 정의한 것으로 볼 수 있습니다. 다음 예는 멤버 필드의 접근을 막고 이에 대해 필요한 수준으로 접근 가능한 멤버 속성을 정의한 예입니다.

 

▶ 신뢰성을 높인 예

using System;

 

namespace Ex_MemberField

{

    class Man

    {

        string name; //멤버 필드

        int hp = 0;  //멤버 필드

 

        public Man(string name) //생성자

        {

            this.name = name;

        }

        public string Name   //멤버 속성

        {

            get

            {

                return name;

            }

        }

        public int Hp         //멤버 속성

        {

            get                 //가져오기는 외부 형식에서 접근 가능하게 지정

            {

                return hp;

            }

            private set        //설정은 내부에서만 접근 가능하게 지정

            {

                if(value > 200)

                {

                    value = 200;

                }

                if(value < 0)

                {

                    value = 0;

                }

                hp = value;

            }

        }

 

        public void Work()

        {

            Hp += 5;

        }

    }

 

    class Program

    {

        static void Main(string[] args)

        {

            Man man = new Man("홍길동");

            Console.WriteLine("{0} HP:{1}", man.Name, man.Hp);

            man.Work();

            Console.WriteLine("{0} HP:{1}", man.Name, man.Hp);

        }

    }

}

▶ 실행 결과

홍길동 HP:0

홍길동 HP:5

 

 단순히 get 블록에서는 값을 반환하기만 하고 set 블록에서는 필터링 없이 value를 설정하기를 원한다면 멤버 필드를 선언하지 않고 멤버 속성의 get 블록과 set 블록을 선언만 해도 됩니다.

 

class Foo

{

    public int ExP{    get;    set;    }

}

 

 [그림 12] ildasm.exe 유틸리티를 통해 위 예제를 덤핑한 화면입니다. 이를 통해 C# 컴파일러에서는 Hp라는 멤버 속성의 get 블록은 get_Hp, set 블록은 set_Hp 이름의 멤버 메서드로 번역을 하는 것을 알 수 있습니다.


멤버 속성이 멤버 메서드로 번역됨을 확인

[그림 12] 멤버 속성이 멤버 메서드로 번역됨을 확인



[C#] 5.1 캡슐화 대상(멤버) - 멤버 필드

[C#] 5.1.3 메서드와 매개 변수 전달 방식

[C#] 5.1.4 인덱서

[C#] 5.1.5 생성자

[C#] 5.1.6 소멸자

[C#] 5.1.7 상수와 읽기 전용

[C#] 5.1.8 연산자 중복 정의


반응형

'언어 자료구조 알고리즘 > Escort C#' 카테고리의 다른 글

[C#] 5.1.7 상수와 읽기 전용  (0) 2016.05.02
[C#] 5.1.6 소멸자  (0) 2016.05.02
[C#] 5.1.5 생성자  (0) 2016.05.02
[C#] 5.1.4 인덱서  (2) 2016.05.02
[C#] 5.1.3 메서드와 매개 변수 전달 방식  (0) 2016.05.02
[C#] 5.1 캡슐화 대상(멤버) - 멤버 필드  (0) 2016.05.02
[C#] 5. 캡슐화  (0) 2016.05.02
[C#] 4. 값(value) 형식  (0) 2016.04.01
[C#] 3.4 string  (0) 2016.04.01
[C#] 3.3 배열  (0) 2016.04.01