1. 접근 제한자
1-1. 접근 제한자의 종류와 설명
public 모든 곳에서 해당 클래스에 접근이 가능
private 클래스 내부에서만 접근 가능
internal 같은 어셈블리 내에서만 public 으로 접근 가능
protected 클래스의 외부접근은 불가능하나 파생된 클래스에서는 가능
protected internal 같은 어셈블리 내에서만 protected 로 접근 가능

2. 접근제한자의 각 예시

 

2-1. public
namespace ConsoleApp1
{
    public class Student
    {
        public String name;
        public int age;

        public void show()
        {
            Console.WriteLine($"{this.name}학생은 올해로 {this.age}세 입니다.");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Student student1 = new Student();
            student1.name = "김이박";
            student1.age = 20;
            student1.show();

        }
    }
}

public 접근제한자는 Program 클래스와는 다른 클래스임에도 불구하고

무리없이 접근하여 사용가능한 것을 볼 수 있습니다. 


2-2. private 

이번에는 class는 접근제한자를 표기하지않고 필드에는 private를 직접 작성해보겠습니다.

(private는 C#의 default 접근제한자로 만약 필드의 접근제한자에 아무것도 적지않으면 자동으로 private임.)

namespace ConsoleApp1
{
    class Student
    {
        private String name;
        private int age;
        
        public void show()
        {
            Console.WriteLine($"{this.name}학생은 올해로 {this.age}세 입니다.");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Student student1 = new Student();
            student1.name = "김이박";
            student1.age = 20;
            student1.show();

        }
    }
}

이렇게 작성하니 뭔가 에러가 뜨는것을 확인할 수 있는데요

바로 이러한 에러가 나옵니다. '보호수준' 때문에 필드에 접근할 수 없다는 이야기도 함께 나오네요.

위에 설명과 같이 private 접근제한자는 같은 클래스 내부에서만 사용이 가능합니다.

그렇다면 같은 클래스 내부에서만 접근이 가능하다면

우리는 main영역에 다 적어주는 것과 다를 바 없는 불편한 사용을 계속 하게될까요?

아닙니다. 우리는 이러한  private필드에 public 메서드 라는 구멍을 뚫어 접근할 수 있도록 해볼 것 입니다.

이때 필요한 것이 this 인데요. 


this ?  저번 강의에도 조금 언급했듯이 this 속성은 클래스 내부의 필드 자신을 직접 가리키는 것입니다.
이를 이해하기쉽도록 예시를 사용하겠습니다.

namespace ConsoleApp1
{
    class Student
    {
        private String name;
        private int age;
        
        public String getName()
        {
            return name;
        }
        public void setName(String name)
        {
            this.name = name;
        }

        public int getAge(int age)
        {
            return age;
        }
        public void setAge(int age)
        {
            this.age = age;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Student student1 = new Student();
            student1.name = "김이박";
            student1.age = 20;
            student1.show();

        }
    }
}

여러가지 메소드가 추가되었습니다.

잘 보시면 this.name = name , this.age=age 라는 부분을 보실 수 있는데요.

이 부분은 그림으로 설명드리면

이렇게 사용되고 있는 것입니다.

this.name은 필드를 가리키고

name은 들어오는 매개변수를 가리키는 것입니다.

즉 이를 해석하면

필드(name) 에 메서드에 입력되는 매개변수를 담는다.

라고 보시면 됩니다.

두 변수의 이름이 같으니 이를 나누어주는 역할을 하기도 합니다!

 

 

 

 

 

 

이러한 부분의 사용까지 예시를 본면

namespace ConsoleApp1
{
    class Student
    {
        private String name;
        private int age;
        
        public String getName()
        {
            return name;
        }
        public void setName(String name)
        {
            this.name = name;
        }

        public int getAge()
        {
            return age;
        }
        public void setAge(int age)
        {
            this.age = age;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Student student1 = new Student();

            student1.setName("김이박");
            student1.setAge(20);

            Console.WriteLine($"{student1.getName()} 학생은 올해로 {student1.getAge()}입니다.");
            Console.WriteLine();
        }
    }
}
  • 생성자를 만든다
  • 생성자를 통해 set메서드를 사용한다.
  • 사용된 set메서드를 통해 만들어진 필드를 get메서드를 통해 가져온다.

이렇게 사용하는 것입니다. 사실 getter setter 메서드는 자바에서 흔히 사용되는 개념인데요.

C#은 자바와 통하는 부분이 많아서 이렇게 사용할 수 있다는 것을 빼와보았습니다.


2-3. protected

protected 접근제한자는 '파생된' 클래스에서만 사용이 가능하다.

위 '파생된' 이라는 부분은 굉장히 핵심적인 설명입니다.

우리가 지금까지 사용했던 class들은 각자 다른 부분을 적어두고 끌어와서 사용한다는 느낌이 강합니다.

하지만 protected의 경우 class A에서 파생된 class B에서 class A를 사용할 수 있다.  즉 클래스 B에 클래스 A 전체를 담는다는 느낌이 강하죠.

예시를 사용해서 이해를 도와보겠습니다.

아래의 예는 상속이며 이는 추후 설명하겠습니다.

namespace ConsoleApp1
{
    class Student
    {
        protected char student1 = 'A';
    }


    class A_class : Student
    {
        static void Main(string[] args)
        {
            Student st_a = new Student();
            A_class a_cl = new A_class();

            st_a.student1 = 'B'; //class Student에 student1은 protected 접근제한자이다.
                                 //따라서 Student 클래스의 파생된 클래스 A_class 에서만 
                                 //접근이 가능하다.

        }
    }
}

위 코드를 보시면 타이핑과 동시에 표시부분에 에러가 나옵니다. 아래와 같은 오류 내용을 확인 할 수 있는데요

이 내용을 보면 파생된 형식이어야 사용할 수 있다는 에러 내용까지 확인 하실 수 있습니다.

 

 

 

 

코드를 보면 생성자가 두가지 생성되어있는 것을 볼 수 있습니다. 하나는 st_a, 다른 하나는 a_cl 입니다.

student class의 생성자인 st_a 에서 접근이 안되는 것을 보니 두번째인 a_cl 에서 접근해보도록 하겠습니다.

namespace ConsoleApp1
{
    class Student
    {
        protected char student1 = 'A';
    }


    class A_class : Student
    {
        static void Main(string[] args)
        {
            Student st_a = new Student();
            A_class a_cl = new A_class();

            
            a_cl.student1 = 'B';
        }
    }
}

이 코드에서는 Student 클래스에 있는 student1 에 접근 할 수 있는 것을 확인 할 수 있습니다.


다음편은 생성자, 소멸자입니다.

'C#' 카테고리의 다른 글

[C#_10_(1)] Class  (0) 2021.10.08
[C#_9] 배열 (Array)  (0) 2021.10.07
[C#_8] 메서드 method  (0) 2021.10.02
[C#_7] 반복문 제어 (Break, Continue, goto)  (0) 2021.09.29
[C#_6] 반복문(for,foreach,while,do while)  (0) 2021.09.24

+ Recent posts