C# 클래스와 객체지향 - 08. 속성
속성에 대해 얘기하기전에 속성이 필요한 이유에 대해서 알아보겠습니다.
예를들어 너비(width), 높이(height) 그리고 사각형의 넓이를 구하는 Area() 메서드까지 가지고 있는 Box() 클래스가 있다고 가정해봅시다.
분명 코드상에는 문제가 없다고 생각했지만 너비와 높이를 음수로 입력하는 기이한 상황이 발생했더니 음수의 결과값이 나오는 현상이 발생했습니다.
이러한 상황을 미연에 방지하기 위해 클래스를 만들 때 일어날 상황을 원천적으로 봉쇄하는 것이 필요합니다.
다양한 방법이 있지만 하나씩 알아보겠습니다.
[캡슐화]
class Box
{
private int width;
private int height;
public Box(int width, int height)
{
if(width > 0 || height > 0)
{
this.width = width;
this.height = height;
}
else
{
Console.WriteLine("너비와 높이는 자연수로 초기화해주세요!");
}
}
public int Area()
{
return this.width * this.height;
}
}
위와 같은 방법으로 생성자에 width 와 height 가 자연수인지 확인하는 코드를 추가했습니다.
이제 문제가 발생해도 쉽게 깨달을 수 있지만, 한 번 생성한 width 와 height 를 바꿀 수 없습니다.
게다가 width 와 height 에 어떤 값이 들어있는지 알 수 없는 상황이 발생했습니다.
[겟터와 셋터]
일단 public으로 변수를 선언해버릴며녀 외부에서 마음대로 값을 변경이 가능해지고, private로 선언하면 외부에서 값을 건드릴 수 없습니다.
이러한 문제점을 해결하기 위해 겟터(Getter) 와 셋터(Setter) 가 있습니다.
코드를 통해 자세하게 알아보겠습니다.
class Box
{
// 변수
private int width;
private int height;
// 생성자
public Box(int width, int height)
{
if( width > 0 || height > 0)
{
this.width = width;
this.height = height;
}
else { Console.WriteLine("너비와 높이는 자연수로 초기화해주세요");
}
// 인스턴스 메서드
public int Area() { return this.width * this.height; }
// 겟터(Getter)
public int GetWidth() { return width; }
public int GetHeight() { return height; }
// 셋터(Setter)
public void SetWidth(int width)
{
if(width > 0) {this.width = width; }
else { Console.WriteLine("너비는 자연수로 입력해주세요"); }
}
public void SetHeight(int height)
{
if(height > 0) {this.height = height; }
else { Console.WriteLine("높이는 자연수로 입력해주세요"); }
}
}
이렇게 겟터와 셋터를 사용하면 안전하게 값을 넣고 빼는것이 가능해집니다.
하지만 이것은 코드가 너무 길기 때문에 코드를 조금 줄일 필요가 있어 보입니다.
[일반적인 속성 생성 방법]
속성은 겟터와 셋터를 손쉽게 만들 수 있는 방법입니다. 속성을 만드는 방법이 굉장히 다양하지만 일반적으로 다음과 같은 형태를 갖습니다.
private int [변수 이름];
public int [속성 이름]
{
get { return [변수 이름]; }
set { [변수 이름] = value; }
}
이렇게 만들어진 속성은 다음과 같이 사용합니다.
[인스턴스 이름].[속성 이름] // 겟터 호출
[인스턴스 이름].[속성 이름] = [값] // 셋터 호출
이렇게 보면 무슨말인지 이해하기 상당히 어렵습니다.
예제를 통해 어떻게 사용하는지 확인해보겠습니다.
class Program
{
class Box
{
// 변수와 속성
private int width;
public int Width
{
get { return width; }
set
{
if (value > 0) { width = value; }
else { Console.WriteLine("너비는 자연수를 입력해주세요") };
}
}
private int height;
public int Height;
{
get { return height; }
set
{
if (value > 0) { height = value; }
else { Console.WriteLine("높이는 자연수를 입력해주세요") };
}
}
// 생성자
public Box(int width, int height)
{
Width = width;
Height = height;
}
// 인스턴스 메서드
public int Area() { return this.width * this.height; }
}
static void Main(stirng[] args)
{
Box box = new Box(-10, -20);
box.Width = -200;
box.Height = -100;
}
}
[실행 결과]
너비는 자연수를 입력해주세요
높이는 자연수를 입력해주세요
너비는 자연수를 입력해주세요
높이는 자연수를 입력해주세요