C# private 변수란 무엇인가?
private 접근 한정자(Access Modifier)는 클래스 내부의 멤버 변수와 멤버 함수를 외부의 다른 함수나 객체로부터 숨기는 역할을 합니다. private으로 선언된 멤버는 오직 같은 클래스 내부에 정의된 함수만 접근할 수 있으며, 해당 클래스의 인스턴스를 통해서도 직접 접근이 불가능합니다.
이러한 특성은 객체 지향 프로그래밍의 핵심 원칙인 캡슐화(Encapsulation)를 구현하는 데 매우 중요합니다. 데이터를 외부로부터 보호하고, 공개된 메서드(public method)를 통해서만 값을 변경하거나 조회하도록 강제함으로써 코드의 안정성과 유지보수성을 크게 높일 수 있습니다.
private 변수 선언 방법
private 변수는 다음과 같이 간단하게 선언할 수 있습니다.
private double length;
만약 private으로 선언된 length 변수를 클래스 외부에서 접근하려고 시도하면 다음과 같은 컴파일 오류가 발생합니다.
'BoxApplication.Box.length' is inaccessible due to its protection level
('BoxApplication.Box.length'는 보호 수준으로 인해 액세스할 수 없습니다)
예제 코드
아래 예제에서 Box 클래스의 length, breadth, height 필드는 모두 private으로 선언되어 있습니다. 따라서 외부 클래스인 BoxTester에서는 이 변수들에 직접 접근할 수 없고, 반드시 public으로 제공되는 setLength(), setBreadth(), setHeight() 같은 setter 메서드를 통해서만 값을 설정할 수 있습니다.
using System;
namespace BoxApplication {
class Box {
private double length; // 상자의 길이
private double breadth; // 상자의 너비
private double height; // 상자의 높이
public void setLength(double len) {
length = len;
}
public void setBreadth(double bre) {
breadth = bre;
}
public void setHeight(double hei) {
height = hei;
}
public double getVolume() {
return length * breadth * height;
}
}
class BoxTester {
static void Main(string[] args) {
Box Box1 = new Box(); // Box 타입의 Box1 선언
Box Box2 = new Box();
double volume;
// 클래스 외부에서 private 변수에 접근하면 컴파일 오류가 발생합니다.
// Box1.length = 10;
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// 두 번째 상자(Box2) 사양 설정
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// 첫 번째 상자의 부피 계산
volume = Box1.getVolume();
Console.WriteLine("Box1의 부피 : {0}", volume);
// 두 번째 상자의 부피 계산
volume = Box2.getVolume();
Console.WriteLine("Box2의 부피 : {0}", volume);
Console.ReadKey();
}
}
}
실행 결과
Box1의 부피 : 210
Box2의 부피 : 1560
핵심 정리
- 접근 범위 제한: private 멤버는 동일한 클래스 내부에서만 접근할 수 있습니다.
- 캡슐화 구현: 데이터를 숨기고 public 메서드를 통해서만 조작하게 하여 무분별한 값 변경을 방지합니다.
- 컴파일 오류 발생: 외부에서 private 변수에 직접 접근하면 'inaccessible due to its protection level' 오류가 나타납니다.
- 더 나은 대안: C#에서는 프로퍼티(Property)를 활용하면 getter/setter 로직을 더욱 간결하게 작성할 수 있습니다.
프로퍼티를 활용한 개선 방법
참고로 위처럼 setter/getter 메서드를 일일이 작성하는 대신, C#의 프로퍼티(Property) 기능을 사용하면 다음과 같이 더 깔끔하게 캡슐화를 구현할 수 있습니다.
class Box {
private double length;
public double Length {
get { return length; }
set { length = value; }
}
}