일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 자동구현프로퍼티
- 이것이C#이다
- 클래스
- 가변배열
- 메소드숨기기
- 프로퍼티
- this 키워드
- 컬렉션 초기화
- 배열
- 인터페이스 예제
- 인덱서
- 인터페이스 상속
- 일반화 클래스
- c#
- 무명형식
- 접근 한정자
- 오버라이딩
- base()
- is
- 인터페이스의 프로퍼티
- 프로퍼티와 생성자
- 튜플
- 분할 클래스
- 중첩클래스
- as
- 배열초기화
- 형식변환
- System.Array
- 클래스 연습문제
- 추상 프로퍼티
- Today
- Total
제로의영역
7.7 접근 한정자로 공개 수준 결정하기(은닉성) 본문
* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.
* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.
(1) 객체지향 프로그래밍의 3대 특성인 은닉성, 상속성, 다형성 중 은닉성에 대한 글.
(2) 정의: 필요한 최소의 기능만을 노출하고 내부를 감추는 것.
(3) 용도
1) 클래스에 선언되어 있는 필드와 메소드 중 감추어야 할 것이 있을 때 사용.
2) 필드(클래스 안에 선언된 변수들)는 상수를 제외하고는 "무조건" 감추는 것이 좋음.
3) 필드, 메소드, 프로퍼티 등 모든 요소에 대해 사용 가능.
(4) 사용법
1) 접근 한정자(Access Modifier)를 사용하여 코드를 수식함.
>> 접근 한정자를 맨 앞에 붙임: public class MyClass, public void PrintMember(MyClass mc).. 등
2) 접근 한정자로 수식하지 않은 클래스의 멤버는 무조건 private로 접근 수준이 자동으로 지정.
(5) 접근 한정자의 종류 기능
1) public
A. 클래스의 내부/외부 모든 곳에서 접근 가능
B. 확장된 기능을 만들거나 상속을 하는 등의 기능을 위해 사용.
2) protected
A. 클래스 내부, 파생클래스(자식클래스)에서는 접근 가능, 클래스의 외부에서는 접근 불가능. >> 파생클래스: 상속을 받아 만든 클
래스.
B. 기능 보완 및 커스터마이징을 위해 사용.
3) private
A. 클래스의 내부에서만 접근 가능, 파생클래스에서는 접근 불가능.
B. 외부로 노출되면 안되는 민감한 정보와 혼란을 줄 수 있는 코드를 클래스 내부에서만 사용하기 위해서 사용.
-------------------------------------------------------------------------------------------------------------------------------
* 여기 부터는 어셈블리 단위로 사용되는 한정자.
* 어셈블리(책에서는 설명이 없음):
1. 버전 관리되고 배포 되는 프로그램의 단위
2. .NET의 실행 가능한 프로그램 또는 실행프로그램의 일부
3. 한 프로젝트가 뽑아내는 결과물 >> 가장 이해가 쉬운 말인듯
4) internal
A. 같은 어셈블리에 있는 코드에서만 public으로 접근 가능, 다른 어셈블리에 있는 코드에서는 private과 동일 >> 외부
프로젝트에서는 접근이 안되고 같은 프로젝트 내에서 접근이 가능.
B. 도움 클래스 등을 만드는데 사용.
5) protected internal: 같은 어셈블리에 있는 코드에서만 protected로 접근 가능, 다른 어셈블리에 있는 코드에서는
private과 동일. >> 같은 프로젝트 코드와 상속받은 프로젝트에서는 접근 가능하지만 다른 프로젝트에서는 접근 불가
능.
6) private protected: 같은 어셈블리에 있는 클래스에서 자식 클래스 내부에서만 접근 가능.
총체적으로 책만 봐서는 이해 불가능하여 검색해서 보완 정리함.
예제)
using System;
namespace ex7_8
{
class WaterHeater
{
protected int temperature; // protected로 수식했기 때문에 외부에서 접근 불가능
public void SetTemperature(int temperature)
{
if (temperature < -5 || temperature > 42)
{
throw new Exception("Out of temperature range"); // catch 블록을 실행
}
this.temperature = temperature; //클래스 변수가 protect로 수식 되었기 때문에 this 키워드를 통해 클래스 변수에 접근
}
internal void TurnOnWater() // internal로 수식했기 때문에 같은 어셈블리에서만 접근 가능
{
Console.WriteLine($"Turn on water:{temperature}");
}
}
class MainApp
{
static void Main(string[] args)
{
try
{
WaterHeater heater = new WaterHeater(); //heater를 생성
heater.SetTemperature(20); //변수가 20인 SetTemperature() 호출
heater.TurnOnWater(); //TurnOnWater() 호출
heater.SetTemperature(-2); //변수가 -2인 SetTemperature()호출
heater.TurnOnWater(); //TurnOnWater() 호출
heater.SetTemperature(50); //변수가 50인 SetTemperature()호출
heater.TurnOnWater(); //TurnOnWater() 호출
}
catch(Exception e) // 변수가 50인 SetTemperature에서 예외가 발생해서 throw로 점프
{
Console.WriteLine(e.Message);
}
}
}
}
출력결과:
Turn on water:20
Turn on water:-2
Out of temperature range
'C#' 카테고리의 다른 글
7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is와 as 2. (0) | 2019.05.31 |
---|---|
7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is와 as 1. (0) | 2019.05.30 |
7.8 상속으로 코드 재활용하기(base키워드) (0) | 2019.05.29 |
7.6.2 this() 생성자 (0) | 2019.05.27 |
7.6 this 키워드 (0) | 2019.05.27 |