[C#] 6. OOP 은닉성(Data Hiding) 접근 한정자 - public/protected/private

반응형
반응형

[C#] 6. OOP 은닉성(Data Hiding) 접근 한정자 - public / protected / private

 

[목차]

  • 1. 은닉성(Data Hiding)과 보안 레벨
  • 2. public
  • 3. protected
  • 4. private

* 개인적인 공부 기록용으로 작성한 글이기에 잘못된 내용이 있을 수 있습니다.


#1 은닉성(Data Hiding)과 보안 레벨

#5 OOP 상속(Inheritance) 포스팅에 이어 이번 포스팅에선 은닉성(Data Hiding)에 대해서 정리하도록 하겠습니다.

은닉성이란 상속과 함께 객체지향의 3대 속성중 하나로 데이터의 보호를 위해 고안 되었습니다.

변수나 함수 혹은 클래스 등의 이름 앞에 접근 한정자를 붙여, 보안 수준을 결정합니다. 접근 한정자는 public , protected , private 순으로 보안 레벨이 높으며, internal 등이 있긴 하지만 거의 사용되지 않습니다.


#2 public

public 은 가장 보안레벨이 낮은 접근 한정자 입니다.

public 을 붙인 요소들(변수,함수,클래스 등)은 어디 에서나 접근이 가능합니다. 아래는 Knight 클래스의 hp , atk 변수와 Attack() 함수를 public으로 정의해서 Main() 함수 부 에서 접근한 예제입니다.

namespace TextRpg
{
    class Knight
    {
        public int hp;
        public int atk;

        public void Attack()
        {
            Console.WriteLine("Knight Attack!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Knight knight = new Knight();
            knight.hp = 100;
            knight.atk = 10;
            knight.Attack();
        }
    }
}

#3 protected

protected 를 붙인 요소들은, 자식 클래스 에서만 접근이 가능합니다.

Knight의 변수와 함수들의 보안 수준을 모두 protected로 선언한 뒤, Main() 함수에서 접근해 보도록 하겠습니다.

   class Knight
    {
        protected int hp;
        protected int atk;

        protected void Attack()
        {
            Console.WriteLine("Knight Attack!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Knight knight = new Knight();
            knight.hp = 100;
            knight.atk = 10;
            knight.Attack();
        }
    }

예상한 바와 같이, CS0122 : '보호 수준 때문에 '~"에 액세스할 수 없습니다." 라는 메시지가 출력됩니다.

이제 Knight의 자식 클래스인 Hero 클래스에서 접근을 시도해 보도록 하겠습니다.

    class Knight
    {
        protected int hp;
        protected int atk;

        protected void Attack()
        {
            Console.WriteLine("Knight Attack!");
        }
    }

    class Hero : Knight
    {
        void Test()
        {
            hp = 100;
            atk = 10;
            Attack();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

        }
    }

보시다 싶이, Knight(부모)의 자식 클래스인 Hero 에서는, protected 요소들에 접근이 가능합니다.

 

#4 private

private는 가장 보안 레벨이 가장 높은 접근 지정자 이며, 아무런 접근 지정자를 붙이지 않을 경우, private로 선언 됩니다.

private 로 선언된 요소들은 어디 에서도 접근이 불가능합니다. 자식클래스와 Main() 함수부에서 접근을 시도해 보도록 하겠습니다.

    class Knight
    {
        private int hp;
        private int atk;

        private void Attack()
        {
            Console.WriteLine("Knight Attack!");
        }
    }

    class Hero : Knight
    {
        void Test()
        {
            hp = 100;
            atk = 10;
            Attack();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Knight knight = new Knight();
            knight.hp = 100;
            knight.atk = 10;
            knight.Attack();
        }
    }

자식 클래스, Main() 함수부 어디에서도 접근이 불가능한 것을 확인 할 수 있습니다.

만약, private로 선언된 요소들에 접근을 하고 싶다면, 아래와 같이 따로 public 함수를 선언해 준 뒤, 선언한 함수를 이용해 접근 해야만 합니다.

   class Knight
    {
        private int hp;
        private int atk;

        private void Attack()
        {
            Console.WriteLine("Knight Attack!");
        }

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

    class Program
    {
        static void Main(string[] args)
        {
            Knight knight = new Knight();
            knight.SetHp(100);
        }
    }
반응형

댓글

Designed by JB FACTORY