데이터의 형태와 데이터의 형태를 다루는 행위를 하나의 세트로 묶어내는 것이다.
장점
1) 중요한 데이터를 보호할 수 있다는 것
2) 캡슐화는 데이터 자체를 정의하는 private 변수와, 데이터를 다루는 방법에 대해 서술하는 public한 getter(get으로 시작하는 메소드), setter 메소드(set으로 시작하는 메소드)
3) 다른 사람들이 데이터를 다룰 때에는 정해진 규칙의 메소드에만 접근이 가능하므로 데이터 악용의 소지가 없어진다.
setter 메소드에서 'this'의 키워드는 '객체 형태에 주어진 변수'
this키워드
객체의 변수인지, 메소드의 매개변수인지를 구분하는 방법
class Car001
{
private string color;
public void setColor(string color)
{
this.color = color; //this키워드를 사용해서 객체의 변수인지, 메소드의 매개변수인지를 구분하는 방법
}
public string getColor()
{
return color;
}
class Ex002{
public void Run()
{
Car002 car = new Car002();
//객체의 프로퍼티에 직접 할당함
car.Size = "세단";
car.Color = "하얀";
}
}
class Car002
{
private string size;
private string color;
//메소드 형태의 괄호가 생략되는 set과 get을 함께 묶어버림
public string Size
{
set { size = value; }
get { return size; }
}
public string Color
{
set { color = value; }
get { return color; }
}
}
public string Color { get; set; }
public string Size { get; set; }
'메소드화'한다면 앞으로 다른 개발자가 여러분의 프로그램을 유지 보수할 때 해당 메소드 기반으로 공통으로 기능을 구현할 수 있게 된다. 만약 '메소드화'를 안한 프로그램에서 해당 로직에 오류가 났다면 지금까지 구현했던 로직을 수정하기 위해 여기저기 파일을 열어보면서 수정을 해야 하는 난감한 상황이 발생할 수 있다. 하지만 만약 메소드화했다면 해당 로직에서 오류가 났을 경우 공통 기능을 담당하는 메소드만 수정하면 되기 때문에 더욱 더 관리가 편한 프로그램이 될 것이다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RoadBook.CsharpBasic.Chapter05.Examples
{
class Ex006
{
public void Run()
{
int number01 = 10;
int number02 = 3;
// dynamic : 데이터가 할당되어도 다른 타입으로 변경이 가능하다.
dynamic result01 = Sum(number01, number02);
dynamic result02 = Minus(number01, number02);
dynamic result03 = Multiple(number01, number02);
dynamic result04 = Divide(number01, number02);
Console.WriteLine("{0}과 {1}의 사칙연산 결과 값 : {2}, {3}, {4}, {5}", number01, number02, result01,result02,result03,result04);
}
// private int 메소드명 : int값이 최종 리턴값이다.
// void : ~이 하나도 없는 ...리턴해줄 값이 없음
private int Sum(int number01, int number02)
{
return number01 + number02;
}
private int Minus(int number01, int number02)
{
return number01 - number02;
}
private int Multiple(int number01, int number02)
{
return number01 * number02;
}
private double Divide(int number01, int number02)
{
return (double)number01 / number02; //소수점으로 결과가 나올 수 있기 때문에 double형을 리턴 타입으로 지정한다.
}
}
}
namespace RoadBook.CsharpBasic.Chapter05.Examples
{
class Ex007
{
public void Run()
{
dynamic result = Sum(1, 2, 3, 4, 5);
Console.WriteLine("1~5까지의 합은 {0}", result);
}
private int Sum(params int[] number)
/*
* param 매개변수는 1차원 배열 형태, 배열이란 데이터를 하나만 담는 변수의 확장형으로 여러개의 데이터를 한번에 담을 수 있는 기능
* 1) 1~5 매개변수로 전달
* 2) number 매개변수는 [1,2,3,4,5] 값을 한번에 담는다.
* 3) 반복문을 통해서 result값을 계속 갱신
*/
{
int result = 0;
for(int idx = 0; idx < number.Length; idx++)
{
result += number[idx];
}
return result;
}
}
}