아직 매번 적을 때 제목이나 태그가 바뀌는건 기분 탓이다.
일련의 코드 블록, 특정한 작업을 수행하기 위해서 사용되는 독립적인 기능 단위
함수라고 생각하면 편하다. 내가 반복적으로 사용할 것 같거나 수행은 명확하나 코드가 길 경우 따로 메서드로 분리하여 작성하는 것이 좋다.
static int Add(int x, int y) // main이 static이기 때문에
{
int sum = x+y;
return sum;
}
어떤 두 수를 합치는 수행을 할 때마다 변수를 선언해서 두 값을 합쳐도 되지만, Add함수를 구현해 놓는다면 간단하게 Add(x,y)를 통해서 코드의 줄 수를 줄이고 가독성을 높일 수 있다.
기본 제공해주는 기능으로 클래스(class), 구조체(struct), 열거형(enum)이 있다.
public class Player //class method
{
public string name {get; set;} //이후에 나올
public int age {get; set;} //생성자 자동구현 프로퍼티
}
public struct Item //struct method
{
public string name {get; set;} //구조체에도 사용가능
public int price = 10; //기본 값(default)을 설정 할 수 있다.
}
public enum JobEnum //enum method
{
Warrior = 1, //초기 값을 설정 하지 않으면 0
Archer,//2 이후에 값을 할당해주지 않으면 +1씩 늘어난다.
Mage//3
}
열거형은 처음보는 것 이었는데,
이를 활용하면 여러 번 값을 선언할 필요 없이 단 한번으로 수행을 마칠 수 있다.
변수를 받아도 해당 값은 enum형이기 때문에 [열거형 이름].ToSting() 로 문자열로 바꿔주거나 (int)[열거형 이름] 을 통해서 정수형을 바꿔줘야한다.
foreach(JobEnum job in Enum.GetValue(typeof(JobEnum)))//열거형의 반복문 사용법
{
Console.WriteLine(job.ToString()); //[Warrior, Archer, Mage]
Console.WriteLine((int)job); //[1,2,3]
}
이를 잘 이용하는 것이 재밌고 중요하다.
(같은 이름 형태라도 문자형과 숫자형으로 나눌 수 있다.)
언제나 그렇듯 우리가 보지 못하는 곳 메모리적인 영향이 크다.
클래스는 힙(heap) 영역에 저장하고, 구조체는 스텍(stack) 영역에 저장한다.
간단히 말하면 지난 주에 배운 배열과 리스트 정도의 차이이다.
클래스는 영역이 더 크고 자유롭지만, 가비지 컬렉션 등에 의해서 값이 영향을 받을 수 있다. (또한, 참조형태의 값이기 때문에 변화에 취약하다.)
구조체의 경우 스택에 위치하기에 크기는 작더라고 값의 변화에 덜 취약하다.
배열과 리스트처럼 크기와 중요도에 따라 무엇으로 구현할지 정해야한다.
(앞에 살짝 스포가 있었다)
Player player = new Player();
에서 new Player() 는 실제로 값이 있는 곳(주소) 를 player에게 할당한다.
그렇기에 우리가 흔히 하던
Player player2 = player;
같은 수행을 하게 된다면,
player2에 player 의 주소 값을 주는 행위 이므로, player2 의 값을 변화시키면 player의 값 또한 바뀌게 될 것이다.
그렇기에 class 형태에 값을 주는 것은 위험하고, 변경할 때도 주의해야 한다.
그렇다면 클래스의 장점은 무엇일까?
바로 상속이라는 사기적인 능력을 사용할 수 있는 것이다.
가상 메서드(virtual) : 가능성의 영역, 재정의(상속)가 되어 있을 수 있고 없을 수 있다. 재정의가 되어있는지 확인하고 없으면 기존의 방법을 수행한다.
추상 메서드(abstract) : 강제성을 가진다. 추상 매서드로 상속한 값은 무조건 재정의를 해야한다. (하지 않으면 오류가 난다.)
추상 형태에만 사용가능하기 때문에 모두 추상 메서드로 만들고 상속하여야한다.
오버라이딩 : 덮어쓰기, 하나의 수행을 자신의 상태에 맞게 변화시키는 것, 더 세부적으로 만드는 느낌.
오버로딩 : 같은 이름의 메서드가 여러가지 수행을 할 수 있는 것. (변수가 달라여 선언 가능)
Add(int x, int y);
Add(int x, int y, int z);
오버로딩으로 3개의 값을 합을 구현한다면, 같은 메서드로 다른 수행을 할 수 있다.
///
생성자 : 기본적으로 메서드를 호출 할 때, 사용하는 방법
프로퍼티 : 속성 값을 변환하거나 할당하는 법.
현재는 모두 public을 이용하고 참조하는 것에 어려움이 없지만, 코드가 길어지고, private 과 같은 방식으로 값을 은닉하면 원하는 값에 접근하기 어렵다.
자동 프로퍼티 : 변수의 이름과 {get; set;} 을 선언하면 기본적으로 그 값을 받는 법과 할당하는 법을 만들어주는 기능.