C#

[C#]캡슐화(Encapsulation)

DevStory 2022. 5. 25.

캡슐화(Encapsulation)

필드와 메서드를 하나로 묶는 과정을 캡슐화라고 합니다. 필드를 private로 선언하여 클래스 외부에서 접근할 수 없도록 하고 public으로 선언된 메서드(getter 및 setter 메서드)를 사용하여 클래스 내부의 필드를 접근하는 것을 캡슐화라고 할 수 있습니다.

 

필드를 private으로 선언하는 이유는 클래스 외부에서 직접 접근할 수 없도록 하기 위해서입니다.

 

getter() 및 setter() 메서드를 public으로 선언하는 이유는 유효성 검사를 통해 클래스 외부에서 private으로 선언된 필드를 접근하기 위해서입니다.


캡슐화 예제 

다음은 캡슐화 개념을 이해하기 위해 예제를 통해 설명합니다. Person 클래스에는 age라는 필드를 private로 선언하여 Person 클래스 외부에서 접근할 수 없도록 합니다.

class Person
{
  private int age;
}

class Program
{
  static void Main(string[] args)
  {
    Person person = new Person();
    // 에러: 보호 수준 때문에 'Person.age'에 액세스할 수 없습니다.
    person.age = 10;
    // 에러: 보호 수준 때문에 'Person.age'에 액세스할 수 없습니다
    Console.WriteLine(person.age);
  }
}

실행 결과

Person 클래스 외부에서 age 필드를 접근하기 위해 getAge() 및 setAge() 메서드를 public으로 선언합니다. getAge() 메서드는 age 변수의 값을 가져오는데 사용되며, setAge() 메서드는 age 변수의 값을 설정하는데 사용됩니다.

class Person
{
  private int age;

  public int getAge()
  {
    return age;
  }

  public void setAge(int age)
  {
    this.age = age;
  } 
}

class Program
{
  static void Main(string[] args)
  {
    Person person = new Person();
    person.setAge(10);
    Console.WriteLine(person.getAge());
  }
}

실행 결과

10

getter() 및 setter() 메서드를 사용하는 이유

캡슐화를 소개하는 부분에서 언급했듯이 getter() 및 setter() 메서드는 private으로 선언된 필드의 값을 가져오거나 설정하기 전에 유효성을 검사할 수 있습니다.

 

예를 들어, Person이라는 클래스는 현실 세계에서 사람을 의미합니다. 나이(age)는 음수가 될 수 없으며, 일반적으로 사람의 나이는 200세를 넘을 수 없습니다. 그러므로 age 필드에 값을 설정하기 전에 전달된 값이 음수인지 그리고 200을 초과한 값인지 체크할 필요가 있습니다.

 

따라서 위 예제는 다음과 같이 변경될 수 있습니다.

class Person
{
  private int age;

  public int getAge()
  {
    return age;
  }

  public void setAge(int age)
  {
    if(0 <= age && age <= 200)
    {
      this.age = age;
    } else
    {
      Console.WriteLine("0 ~ 200 사이의 값이 아닙니다.");
    }
  } 
}

class Program
{
  static void Main(string[] args)
  {
    Person person = new Person();
    person.setAge(2000);
  }
}

실행 결과

0 ~ 200 사이의 값이 아닙니다.

프로퍼티(Property)

프로퍼티는 C#에 도입된 기능으로 getter() 및 setter() 메서드와 유사하지만, 더 간단합니다.

 

다음은 getter() 및 setter() 메서드에서 설명한 예제를 프로퍼티로 변경된 예제입니다. age 필드를 접근하기 위해 Age 프로퍼티를 public으로 선언합니다.

 

Age 프로퍼티 내부에 get 접근자와 set 접근자가 존재합니다. get 접근자에는 필드를 반환하는 로직을 작성하며, set 접근자에는 필드의 값을 설정하는 로직을 작성합니다.

 

set 접근자는 반환 형식이 void인 메서드와 유사하며, value라는 매개 변수를 사용하여 필드의 값을 설정할 수 있습니다.

class Person
{
  private int age;

  public int Age
  {
    get
    {
      return age;
    }
    set
    {
      if (0 <= value && value <= 200)
      {
        age = value;
      }
      else
      {
        Console.WriteLine("0 ~ 200 사이의 값이 아닙니다.");
      }
    }
  }
}

class Program
{
  static void Main(string[] args)
  {
    Person person = new Person();
    person.Age = 300;
    person.Age = 50;
    person.Age = -50;
    Console.WriteLine(person.Age);
  }
}

실행 결과

0 ~ 200 사이의 값이 아닙니다.
0 ~ 200 사이의 값이 아닙니다.
50

정리

  • C#에서 캡슐화는 클래스의 필드를 private로 선언하고 getter() 및 setter() 메서드 혹은 프로퍼티로 필드를 접근하는 방법입니다.
  • getter() 및 setter() 메서드 혹은 프로퍼티를 사용하는 이유는 유효성 검사 때문입니다.
  • C#의 프로퍼티는 getter() 및 setter() 메서드와 유사하지만, 소스코드를 더 간결하게 작성할 수 있습니다.
반응형

'C#' 카테고리의 다른 글

[C#]멀티스레드(MultiThread)  (0) 2022.05.28
[C#]Thread 생성자(Thread Constructor)  (0) 2022.05.28
[C#]확장 메서드(Extension Method)  (0) 2022.05.24
[C#]중첩 클래스(Nested Class)  (0) 2022.05.19
[C#]Partial 클래스(Partial Class)  (0) 2022.05.18

댓글