Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# private 변수 완벽 가이드: 접근 한정자와 캡슐화 이해하기

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; }
    }
}