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 |