03.프로퍼티 — 웹툰PD 지망생 : 정민재
03.프로퍼티
●/섹션 7. 유용한 문법

03.프로퍼티

728x90

 

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            public int hp;
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();
            knight.hp = 100;

            //실수로 hp를 고쳐버리는 상황
            knight.hp = 40;

            //코드가 길어지면 길어질 수록, 누가 hp를 고쳤는지 찾기가 굉장히 힘들어진다.
        }
    }
}

 

1. set함수 쓰는 이유 - 은닉성

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            public int hp;

            public int GetHp()
            {
                return hp;
            }

            public void SetHp(int _hp)
            {
                this.hp = _hp;
            }
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();

            knight.SetHp(100);
        }
    }
}

 

빙빙 돌아서 값을 넣어준다

 

 

2. set함수 쓰는 방법

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

public int hp로 해도, protected int hp로 해도 다 hp에 100이 잘 들어감

 

해보니 잘 됨.

 

 

3. 보호해야 할 변수를 protected로 변경

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            protected int hp;       //아무나 접근할 수 없게 public에서 protected로 교체

            public int GetHp()
            {
                return hp;
            }

            public void SetHp(int _hp)
            {
                this.hp = _hp;
            }

            
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();

            knight.SetHp(100);

        }
    }
}

 

 

4. get함수 쓰는 이유

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            protected int hp;                       //아무나 접근할 수 없게 public에서 protected로 교체
                        
            //set함수 (= setter)
            public void SetHp(int _hp)
            {
                this.hp = _hp;
            }

            
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();

            knight.SetHp(100);

            int h = knight.hp;                      //hp에 빨간 줄

            Console.WriteLine(knight.hp);           //hp에 빨간 줄

            //int h = knight.GetHp();

            //Console.WriteLine(knight.GetHp());
        }
    }
}

hp를 가져와서 쓰려고 해도 쓸 수가 없다

 

protected로 되어있기 때문.

 

protected 되어 있는 hp를 쓰려면 어떻게 해야할까?

 

1. public hp로 바꾼다 (은닉성에 문제O)

2. get함수를 만들어서 return 된 값을 가져온다 (은닉성에 문제X) -> 왜냐하면 변수가 여전히 protected 이기 때문

 

 

 

5. get함수 쓰는 법

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            protected int hp;                     //아무나 접근할 수 없게 public에서 protected로 교체


            //get함수 (= getter)
            public int GetHp()
            {
                return hp;
            }

            //set함수 (= setter)
            public void SetHp(int _hp)
            {
                this.hp = _hp;
            }

            
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();

            knight.SetHp(100);            

            //get함수의 return 값 (=100)을 가져와서 변수 h에 집어넣는다.
            int h = knight.GetHp();

            Console.WriteLine(knight.GetHp());
        }
    }
}

 

변수 1개에 함수 2개씩이나 붙는다고? (get set)

 

그럼 변수 100개면, 함수 200개가 붙어야 되나?????

 

 

변수 1개당, 함수 1개로 줄일 순 없을까?????

 

 

6. 통합형 get set - 프로퍼티 라고도 부른다(= C# 방법)

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            protected int hp;                     //아무나 접근할 수 없게 public에서 protected로 교체


            //통합형 get set - 프로퍼티라고도 부른다(= C# 방법)
            public int Hp
            {
                get 
                {
                    return hp;
                }
                set 
                {
                    //value : SetHp(int _hp)함수의 매개변수 _hp 역할
                    hp = value;
                }
            }
            
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();

            //set함수의 value에 100을 집어넣는다.
            knight.Hp = 100;

            //Hp함수의 get의 return값인 100을 가져오기
            int h = knight.Hp;
        }
    }
}

 

 

 

 

 

 

public int Hp프로퍼티의 set에 값이 잘 들어갔다

 

public int Hp프로퍼티의 get의 return 값으로 인해 int h 변수에 값이 잘 들어갔다

 

 

 

7. set을 지우고 쓰는 경우

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            //set을 쓰고싶지 않다면, 보호 할 변수에 값을 대입해놓으면 대입 할 필요가 없으므로 get 안써도 된다. 
            protected int hp = 100;

            //통합형 get set - 프로퍼티라고도 부른다(= C# 방법)
            public int Hp
            {
                get 
                {
                    return hp;
                }               
            }
            
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();
            
            //Hp프로퍼티의 get의 return값인 100을 가져오기
            int h = knight.Hp;
        }
    }
}

 

8. set에 private를 붙이는 경우

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            protected int hp;


            //통합형 get set - 프로퍼티라고도 부른다(= C# 방법)
            public int Hp
            {
                get 
                {
                    return hp;
                }
                private set
                {
                    //value : SetHp(int _hp)함수의 매개변수 _hp 역할
                    hp = value;
                }
            }
            
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();

            //set의 value에 100을 집어넣는다.
            knight.Hp = 100;                        //빨간 줄

            //Hp프로퍼티의 get의 return값인 100을 가져오기
            int h = knight.Hp;
        }
    }
}

set을 private set으로 설정 할 경우, 외부에서 접근이 불가능하다.

 

그러므로 knight.Hp = 100; 에서 knight.Hp에 빨간 줄이 뜬다.

 

 

public int Hp 프로퍼티는 public이라 접근이 가능하지만

 

set이 하필 private set이라 접근 불가능하기 때문

 

 

이렇게 하면 더 이상 외부에서는 hp 값을 바꿀 수 없게 된다. (영원히 hp=100)

 

hp값을 바꾸려면 내부에서 값을 바꿔줄 수 밖에 없다(보안O)

 

 

 

9. 내부에서 값을 바꾸는 방법(=보안O)

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            protected int hp;


            //통합형 get set - 프로퍼티라고도 부른다(= C# 방법)
            public int Hp
            {
                get 
                {
                    return hp;
                }
                private set
                {
                    //value : SetHp(int _hp)함수의 매개변수 _hp 역할
                    hp = value;
                }
            }

            void Test()
            {
                //내부에서 hp값을 바꾸는 방법
                Hp = 200;
            }
            
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();
        }
    }
}

 

10. 자동구현 프로퍼티

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            protected int hp;

            //자동 구현 프로퍼티
            public int Hp
            {
                get; set;
            }

            public int GetHp()
            {
                return hp;
            }

            public void SetHp(int value)
            {
                hp = value;
            }
            
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();

            //SetHp(int value)의 value에 100을 집어넣는다.
            knight.SetHp(100);

            //GetHp()함수의 return hp의 값인 100을 가져와서 변수 h에 대입
            int h = knight.GetHp();
        }
    }
}

 

11. 프로퍼티 초기화

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //객체지향 -> 은닉성

        class Knight
        {
            protected int hp;

            //프로퍼티 초기화 : C# 7.0부터 가능한 프로퍼티
            public int Hp { get; set; } = 100;
        }

        static void Main(string[] args)
        {
            Knight knight = new Knight();

            //set에 넣는다
            knight.Hp = 200;

            //get의 return 값을 가져와서 변수 int hp에 넣는다
            int hp = knight.Hp;
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

' > 섹션 7. 유용한 문법' 카테고리의 다른 글

06.Lambda(람다)  (0) 2021.07.14
05.event(이벤트)  (0) 2021.07.14
04.델리게이트(delegate)  (0) 2021.07.14
02. abstract / interface  (0) 2021.07.14
01.Generic 일반화  (0) 2021.07.13