정말 긴 추석연휴가 지나고 다시 돌아왔다
추석 연휴 간 집안일 돕는다고 하나도 못 쉬었지만 어쩔 수 없지
오늘은 메서드와 구조체에 대해 공부해보자.
저번에 메소드에 대한 간단한 설명을 했었는데
수학에서의 함수라고 불리는 것과도 매우 유사하다.
f(x) = x + 1이라는 함수가 있다면
x에 무슨 수가 들어가든 1이 더해진 결과값이 나올 것이다.
메소드도 비슷하다.
입력되는 값에 맞는 처리과정을 거친 후 결과 값이 도출되는 걸 메소드라고 부른다.
조금 다른 점으로는 void형식인데 void는 반환 형식이 없어서 돌려받는 값은 없지만
보통 내부에서 실행하는 내용을 표시하는 방식으로 구현된다.
예를 들어보자.
int Plus(int a, int b)라는 함수를 만들어서 매개변수에 숫자를 입력하면
두 값을 더해서 출력해주는 함수를 만든다고 가정해보자.
int Plus(int a, int b)
{
int output = a + b;
return output;
}
자 다시 설명해보자면
우리는 int라는 자료형으로 Plus라는 이름을 가진 함수를 만들었다.
이 함수에는 두 가지의 자료를 입력할 수 있는데
int a와 int b이다. 이를 매개변수라고 부르며 함수 내부에 변수를 전달해 주는 역할을 한다.
또한 함수 내부에서만 작동하는 변수이므로 함수 외부에서 해당 변수를 호출해 줄 수 없다.
또한 매개변수가 선언되었으므로 해당 함수를 호출하기 위해서는 매개변수를 반드시 입력해주어야 한다.
1과 3을 더해보자.
Console.WriteLine(Plus(1,3));
int Plus(int a, int b)
{
int output = a + b;
return output;
}
간단하게 Plus함수에 매개변수 자리에 정수를 입력하는 것으로 더하기를 가능하게 만들었다.
이렇 듯 미리 짜놓은 코드대로 작동하게 만들어주는 것이 메소드(함수)이며
위 Plus메소드를 수식으로 표현하자면 {f(x) = a + b} a = 1, b = 3일 것이다.
int형이 아닌 void, float, char, int[], 등등의 다양한 자료형이 존재한다.
특히 눈여겨봐야할 건 void형으로 return값이 없기 때문에 함수 외부로 반출되는 값이 존재하지 않는다.
주로 사용처는 글자를 출력한다거나 외부로 값을 반출하지 않고 함수 내부에서만 처리하는 경우가 있다.
예를 들어보자면
void Hello()
{
Console.WriteLine("Hello, world");
}
같은 경우가 있다.
그냥 출력만 한다거나 여러번 작성하기 힘든 텍스트를 함수 호출 딸깍으로 출력하는 등 다양한 부분에서 사용된다.
또한 오버로딩이라는 기능이 있는데
같은 함수 명이여도 입력되는 매개변수에 따라 다르게 동작하게 만들 수 있다.
void Hello()
{
Console.WriteLine("Hello");
}
void Hello(int a)
{
Console.WriteLine("Bye");
}
그냥 진짜 막썼는데 하여튼
함수를 호출할 때 Hello()로만 호출한다면 Hello를 출력하게 될 것이고
Hello(1)로 호출한다면 Bye를 출력하게 된다.
중요한 건 반환값(자료형)이 아닌 매개변수가 달라야 작동한다는 것이다.
Console.WriteLine()도 오버로딩 된 메소드이며 무려 18개의 오버로딩이 된 것을 확인할 수 있다.
이번에는 구조체에 대해 공부해보자.
구조체는 struct 키워드를 사용하여 선언하며 메소드와 필드로 구성된다.
Enemy goblin;
goblin.HP = 50;
goblin.Damage = 3;
struct Enemy()
{
public string Name;
public int HP;
public int Damage;
}
이런 식으로 해당 객체에 대한 정보를 저장하기 위한 용도로 사용된다.
엥 이거 클래스랑 완전 똑같네요?
구조체는 값 형식으로 스택에 할당되며 복사될 때 그 값이 똑같이 복사되는 반면
클래스는 힙에 할당되고 참조로 전달되며 new를 통해 새 인스턴스를 제작할 때 메모리에 동적으로 할당된다.
그래서 주로 구조체는 작은 크기의 데이터 저장이나 단순 데이터 구조에 사용되며
클래스는 더 복잡한 객체와 다양한 기능을 위해 사용된다.
가장 큰 차이점으로는 구조체는 상속이 불가능하다.
조금 더 심화로 들어가서 제너릭에 대해 공부해보자.
제너릭이란?
클래스나 메소드를 일반화 시켜 다양한 자료형에 대응할 수 있는 기능으로써
제너릭을 사용함으로 코드의 재사용성을 높일 수 있다.
<T>형태의 키워드를 이용하여 선언가능하다.
예시를 들어보자.
internal class Program
{
class Stack<T>
{
private T[] elements; //제너릭 자료형으로 배열 생성
private int top; //stack에 접근할 정수
public Stack()
{
elements = new T[100]; //100의 길이를 가짐
top = 0;
}
public void Push(T item)
{
elements[top++] = item; //배열에 T자료형으로 값 삽입
}
public T Pop()
{
return elements[--top];
}
}
static void Main(string[] args)
{
Stack<int> intStack = new Stack<int>(); //Stack을 정수형으로 선언
intStack.Push(1);
intStack.Push(2);
intStack.Push(3);
Console.WriteLine(intStack.Pop()); //출력 값 3
}
제너릭의 자료형은 선언 시가 아닌 사용 시점에 결정되므로 굉장히 유연하게 사용할 수 있다.
오늘 TTE (TIL THE END라는 뜻)
0922 TIL - Re : C#으로 Text RPG 만들기 (2) | 2024.09.22 |
---|---|
0920 TIL - C#으로 텍스트 게임 만들기 1 (0) | 2024.09.20 |
0913 TIL - C# 기초 문법 심화 (2) | 2024.09.13 |
0912 TIL - 미니 프로젝트 완성! (0) | 2024.09.12 |
0911 TIL - 하다가 막힘... (0) | 2024.09.11 |