일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 도커
- c# winform
- c언어
- c#
- Data Structure
- 포인터
- Algorithm
- git
- C++
- Python
- jupyter
- c# 윈폼
- Unity
- docker
- 유니티
- C# delegate
- Flutter
- github
- C언어 포인터
- jupyter lab
- c# 추상 클래스
- 플러터
- dart 언어
- gitlab
- vim
- HTML
- 구조체
- 다트 언어
- Houdini
- 깃
Archives
- Today
- Total
nomad-programmer
[Programming/C#] 접근 한정자로 공개 수준 결정 본문
객체 지향 프로그래밍에서 필요한 최소의 기능만을 노출하고 내부를 감출 것을 요구한다. 이것을 은닉성이라고 한다.
객체 지향 프로그래밍의 3대 특성
객체 지향 프로그래밍에는 여러 가지 특성이 있다. 그 중에서도 3대 특성으로 꼽히는 것들이 있다.
이 셋중의 하나가 바로 은닉성이며 나머지 2개는 상속성(Inheritance)과 다형성(Polymorphism)이다.
클래스에 선언되어 있는 필드와 메소드 중에 어떤 것들은 사용자에게 노출할 것이 있는가 하면, 절대로 노출시키지 말아야 하는 것들도 있다. 특히 필드는 상수를 제외하곤 "무조건" 감추는 것이 좋다.
접근 한정자 (Access Modifier)는 감추고 싶은 것은 감추고, 보여주고 싶은 것은 보여줄 수 있도록 코드를 수식하며, 필드, 메소드를 비롯해 프로퍼티 등 모든 요소에 대해 사용할 수 있다.
C#에서 제공하는 접근 한정자는 모두 여섯 가지이며, 다음과 같다.
접근 한정자 | 설명 |
public | 클래스의 내부/외부 모든 곳에서 접근 가능 |
protected | 클래스의 외부에서는 접근할 수 없지만, 파생 클래스에서는 접근 가능 |
private | 클래스의 내부에서만 접근 가능. 파생 클래스에서도 접근 불가능 |
internal | 같은 어셈블리에 있는 코드에서만 public으로 접근 가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가짐. |
protected internal | 같은 어셈블리에 있는 코드에서만 protected로 접근 가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가짐. |
private protected | 같은 어셈블리에 있는 클래스에서 상속받은 클래스 내부에서만 접근이 가능 |
접근 한정자로 수식하지 않은 클래스의 멤버는 무조건 private로 접근 수준이 자동으로 지정된다. 즉, 클래스 내의 멤버는 일단 감추고 보고, 그 후 공개할지를 결정하는 것이 순서라는 뜻이다.
using System;
namespace CSharpExample
{
class WaterHeater
{
protected int temperature;
public void SetTemperature(int temperature)
{
if (temperature < -5 || temperature > 42)
{
throw new Exception("out of temperature range");
}
this.temperature = temperature;
}
internal void TurnOnWater()
{
Console.WriteLine($"turn on water: {temperature}");
}
}
class MainApp
{
static int Main(string[] args)
{
try
{
WaterHeater heater = new WaterHeater();
heater.SetTemperature(20);
heater.TurnOnWater();
heater.SetTemperature(-2);
heater.TurnOnWater();
heater.SetTemperature(50);
heater.TurnOnWater();
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
return 0;
}
}
}
/*
turn on water: 20
turn on water: -2
out of temperature range
*/
'Programming > C#' 카테고리의 다른 글
[Programming/C#] 부모 클래스와 파생 클래스 사이의 형식 변환 (is, as) (0) | 2020.09.08 |
---|---|
[Programming/C#] 상속 : base, base() (0) | 2020.09.08 |
[Programming/C#] this() 생성자 (0) | 2020.09.08 |
[Programming/C#] 객체 복사: 얕은 복사와 깊은 복사 (2) | 2020.09.08 |
[Programming/C#] 생성자와 소멸자 (0) | 2020.09.08 |
Comments