본문 바로가기
프로그래밍/C#

[C#] 캡슐화

by 아임코딩 2023. 5. 5.
728x90
반응형

소개

안녕하세요 아임코딩입니다.

이번에는 C#으로 알아보는 객체지향 프로그래밍 언어의 특징 중 하나인 캡슐화에 대해서 알아보겠습니다.

 

유튜브 링크

https://youtu.be/H73jwLlUUz8

 

캡슐화 설명

 

C#에서는 class를 사용하여 객체를 정의하고, 클래스 내부에 필드와 메서드를 정의합니다.

class 를 사용하여 데이터와 그 데이터를 다루는 코드를 하나로 묶는 것입니다.

데이터는 외부에서 접근이 불가능 하도록 private 접근 제한자를 설정하고

데이터를 다루는 메서드에 대해서는 외부에서 접근이 가능하도록 public 접근 제한자를 설정합니다.

 

간단한 클래스를 만들어보고 캡슐화에 대해서 알아보겠습니다.

 

캡슐화 클래스 예시

public class Person
{
	private int age = 10;
	private string name = "tom";
}

 

Person 이라는 클래스를 만들고

필드(데이터)는 int age 와 string name 을 가집니다.

접근 제한자는 private로 설정하면 외부에서 해당 필드에 접근할 수 없게 됩니다.

 

Main 함수에서 Person 클래스가 가진 private int age 에 접근을 시도하면 보호 수준 때문에 액세스할 수 없다는 오류가 발생합니다.

이렇게 필드를 private로 설정하면 캡슐화를 할 수 있습니다.

 

필드를 private으로 설정하는 것만으로는 캡슐화를 완성했다고 말하기는 힘듭니다.

외부 클래스에서 필드 값들을 참조하거나 변경하거나 사용할 수 있도록 메서드를 제공해야합니다.

 

단순하게 필드의 값을 변경하고 필드의 값을 얻어오는 메서드를 정의해보겠습니다.

 

        public class Person
        {
            private int age = 10;
            private string name = "tom";

            public int getAge() //age 값을 반환하는 메서드
            {
                return age;
            }
            public void setAge(int age) //age 값을 설정하는 메서드
            {
                this.age = age;
            }
            public string getName() //name 값을 반환하는 메서드
            {
                return name;
            }
            public void setName(string name)  //name 값을 설정하는 메서드
            {
                this.name = name;
            }
        }

 

private int age 에 대해서는 getAge() 메서드와 setAge() 메서드를 제공합니다.

getAge() 메서드는 메서드가 호출될 때 저장되어있는 age 값을 반환합니다.

setAge() 메서드는 매개변수로 받은 int 형 값을 age에 설정합니다.

 

this.age 에서 사용된 this 키워드는 현재 객체를 가리키는 참조형 키워드입니다.

쉽게 생각하면 this.age 는 Person 클래스 내부에 있는 age 변수라고 생각하면 됩니다.

 

private int name 에 대해서는 getName() 메서드와 setName() 메서드를 제공합니다.

getName() 메서드는 메서드가 호출될 때 저장되어있는 name 값을 반환합니다.

setName() 메서드는 매개변수로 받은 int 형 값을 name에 설정합니다.

 

 

앞서 살펴본 코드들을 합쳐서 실행해보겠습니다.

 

예시 프로그램 실행

 

using System;
namespace Tistory
{
    internal class Program
    {
        public class Person
        {
            private int age = 10;
            private string name = "tom";

            public int getAge() //age 값을 반환하는 메서드
            {
                return age;
            }
            public void setAge(int age) //age 값을 설정하는 메서드
            {
                this.age = age;
            }
            public string getName() //name 값을 반환하는 메서드
            {
                return name;
            }
            public void setName(string name)  //name 값을 설정하는 메서드
            {
                this.name = name;
            }
        }

        static void Main(string[] args)
        {
            Person myP = new Person();          //Person 클래스 객체 myP 생성
            
            Console.WriteLine(myP.getName());   //myP.getName() 호출 후 출력
            Console.WriteLine(myP.getAge());    //myP.getAge() 호출 후 출력

            myP.setAge(50);                     //age를 50으로 설정
            myP.setName("Amanda");              //name을 Amanda로 설정

            Console.WriteLine(myP.getName());   //myP.getName() 호출 후 출력
            Console.WriteLine(myP.getAge());    //myP.getAge() 호출 후 출력
        }
    }
}

 

Person 클래스에 대한 설명은 위에서 했으니 Main 함수 실행에 대해서만 다루겠습니다.

getAge() 와 getName() 메서드를 이용하여 클래스 외부에서 age 와 name 변수값을 참조할 수 있습니다.

setAge() 와 setName() 메서드를 이용하여 클래스 외부에서 age 와 name 변수값을 변경할 수 있습니다.

출력 결과를 보니 변수값을 참조하는 것과 변경이 잘 되는 것을 확인할 수 있습니다.

 

이렇게 C#에서는 데이터 필드는 private 접근 제한자를 이용하여 외부에서 접근할 수 없게 설정하고

필드를 다루는 메서드를 만들고 public 접근 제한자를 이용하여 외부에서 메서드에 접근할 수 있게 만들어서

캡슐화를 완성합니다.

이렇게 캡슐화를 하면 프로그래머의 의도에 벗어난 데이터 필드의 변경은 쉽게 일어나지 않기 때문에 프로그램의 유지보수를 하기 더 쉬워집니다.

 

이상으로 C# 캡슐화에 대해서 알아봤습니다.

 

728x90
반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] 다형성 (메서드 오버로딩) method overloading  (0) 2023.05.05
[C#] 상속  (0) 2023.05.05
[C#] 객체지향 프로그래밍 언어 특징  (0) 2023.05.05
[C#] 메서드  (0) 2023.05.05
[C#] 클래스 class  (0) 2023.05.05