Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

동구의_C# & Unity_개발일지

2024.01.02 내일배움캠프 7일차 TIL C#_ProGramming(C# 문법) 본문

C#

2024.01.02 내일배움캠프 7일차 TIL C#_ProGramming(C# 문법)

mongle_0l 2024. 1. 2. 07:46
2024년 갑진년 (甲辰年)

‘푸른 용의 해’ 육십간지의 41번째로 푸른색의 '갑’과 용을 의미하는 ‘진’이 만나 ‘청룡(靑龍)’을 의미

2024년! 새해가 밝았다!! (TIL 작성 기준 하루가 지났지만^^) 이번 연도 목표는 당연 컨대 취업!!

캠프에서 같이 공부하고 있는 사람 모두 건강하고 원하는 목표를 이루길!! ~~ ^へ^ ~~

 

캠프 7일차로 접어들었다. 저번 주차에 이어서 C# 문법 강의를 들으면서 학습과 실습을 하였다.

이번 주차는 개인 과제 제출이 우선순위인 만큼 최대한 제출일 전까지 개인 과제인 "던전을 떠나기 전 마을에서 장비를 구하는 게임을 텍스트로 구현" 을 완성할 수 있도록 할 것이다.

1월 5일까지 개인 과제 제출!

1월 8일까지 2차 개인 과제 제출


C# 문법 종합반 2주차

조건문과 반복문
배열과 컬렌션
메서드와 구조체

 

 

01. 조건문

✔️ 조건문은 주어진 조건식의 결과에 따라 프로그램의 제어 흐름을 변경하는 제어문

 

1-1) if 문

  • if 문은 조건식의 결과에 따라 실행 여부를 결정하는 조건문입니다.
# 실행할 코드가 여러줄인 경우
if (조건식)
{
    // 조건식이 참일 경우 실행할 코드
}

# 실행할 코드가 한줄인 경우
if (조건식)
    // 조건식이 참일 경우 실행할 코드


# if 문 기초
int playerScore = 80;
        
if (playerScore >= 70) 
{
    Console.WriteLine("플레이어의 점수는 70점 이상입니다. 합격입니다!");
}
Console.WriteLine("프로그램이 종료됩니다.");

1-2) else 문

  • else 문은 if 문에서 조건식이 거짓일 경우 실행할 코드를 지정하는 조건문입니다.
if (조건식)
{
    // 조건식이 참일 경우 실행할 코드
}
else
{
    // 조건식이 거짓일 경우 실행할 코드
}


# else 문 기초
int itemCount = 5;
string itemName = "HP 포션";

if (itemCount > 0)
{
    Console.WriteLine($"보유한 {itemName}의 수량: {itemCount}");
}
else
{
    Console.WriteLine($"보유한 {itemName}이 없습니다.");
}

1-3) else if 문

  • else if 문은 if 문의 조건식이 거짓일 때, 새로운 조건식을 사용하여 실행 여부를 결정하는 조건문입니다.
  • else 문은 생략이 가능하다.
if (조건식1)
{
    // 조건식1이 참일 경우 실행할 코드
}
else if (조건식2)
{
    // 조건식2가 참일 경우 실행할 코드
}
else
{
    // 모든 조건식이 거짓일 경우 실행할 코드
}


# 예시
int playerScore = 100;
string playerRank = "";

if (playerScore >= 90)
{
    playerRank = "Diamond";
}
else if (playerScore >= 80)
{
    playerRank = "Platinum";
}
else if (playerScore >= 70)
{
    playerRank = "Gold";
}
else if (playerScore >= 60)
{
    playerRank = "Silver";
}
else
{
    playerRank = "Bronze";
}

Console.WriteLine("플레이어의 등급은 " + playerRank + "입니다.");

1-4) 중첩 조건문

  • 하나의 조건문 안에 또 다른 조건문이 포함된 형태의 조건문입니다.
int itemLevel = 3; // 아이템 레벨
string itemType = "Weapon"; // 아이템 종류

if (itemType == "Weapon")
{
    if (itemLevel == 1)
    {
        // 레벨 1 무기 효과
        Console.WriteLine("공격력이 10 증가했습니다.");
    }
    else if (itemLevel == 2)
    {
        // 레벨 2 무기 효과
        Console.WriteLine("공격력이 20 증가했습니다.");
    }
    else
    {
        // 그 외 무기 레벨
        Console.WriteLine("잘못된 아이템 레벨입니다.");
    }
}
else if (itemType == "Armor")
{
    if (itemLevel == 1)
    {
        // 레벨 1 방어구 효과
        Console.WriteLine("방어력이 10 증가했습니다.");
    }
    else if (itemLevel == 2)
    {
        // 레벨 2 방어구 효과
        Console.WriteLine("방어력이 20 증가했습니다.");
    }
    else
    {
        // 그 외 방어구 레벨
        Console.WriteLine("잘못된 아이템 레벨입니다.");
    }
}
else
{
    // 그 외 아이템 종류
    Console.WriteLine("잘못된 아이템 종류입니다.");
}

1-5) switch 문

  • switch 문은 변수나 식의 결과에 따라 다른 코드 블록을 실행하는 제어문입니다.
  • case 문을 사용하여 변수나 식의 결과에 따라 실행할 코드를 지정합니다.
switch (변수나 식)
{
    case 값1:
        // 값1이 나온 경우 실행되는 코드
        break;
    case 값2:
        // 값2가 나온 경우 실행되는 코드
        break;
    // ...
    default:
        // 모든 case문에 해당하지 않는 경우 실행되는 코드
        break;
}


# switch문 기초
Console.WriteLine("게임을 시작합니다.");
Console.WriteLine("1: 전사 / 2: 마법사 / 3: 궁수");
Console.Write("직업을 선택하세요: ");
string job = Console.ReadLine();

switch (job)
{
    case "1":
        Console.WriteLine("전사를 선택하셨습니다.");
        break;
    case "2":
        Console.WriteLine("마법사를 선택하셨습니다.");
        break;
    case "3":
        Console.WriteLine("궁수를 선택하셨습니다.");
        break;
    default:
        Console.WriteLine("올바른 값을 입력해주세요.");
        break;
}

Console.WriteLine("게임을 종료합니다.");

1-6) 3항 연산자

  • 3항 연산자는 if 문의 간단한 형태로, 조건식의 결과에 따라 두 값을 선택하는 연산자입니다.
(조건식) ? 참일 경우 값 : 거짓일 경우 값;
int currentExp = 1200;
int requiredExp = 2000;

# 삼항 연산자
string result = (currentExp >= requiredExp) ? "레벨업 가능" : "레벨업 불가능";
Console.WriteLine(result);


# if else 문
if (currentExp >= requiredExp)
{
    Console.WriteLine("레벨업 가능");
}
else
{
    Console.WriteLine("레벨업 불가능");
}

02. 조건문 심화 실습

  • else if 문에서 사용된 예시를 switch 문으로 변경
# 등급 출력
int playerScore = 100;
string playerRank = "";

switch (playerScore / 10)
{
	case 10:
	case 9:
		playerRank = "Diamond";
		break;
	case 8:
		playerRank = "Platinum";
		break;
	case 7:
		playerRank = "Gold";
		break;
	case 6:
		playerRank = "Silver";
		break;
	default:
		playerRank = "Bronze";
		break;
}

Console.WriteLine("플레이어의 등급은 " + playerRank + "입니다.");

 

03. 반복문

✔️ 일련의 명령문을 반복해서 실행하는 제어문

 

3-1) for 문

  • for 문은 초기식, 조건식, 증감식을 사용하여 반복문을 작성합니다.
  • 초기식은 반복문이 시작될 때 단 한 번 실행되고, 조건식은 반복문이 실행될 때마다 평가되며, 참(true)인 경우 반복문이 계속 실행됩니다. 증감식은 반복문이 실행될 때마다 실행되는 식입니다.
for (초기식; 조건식; 증감식)
{
    // 조건식이 참인 경우 실행되는 코드
}


# for 문 기초
for (int i = 0; i < 10; i++) 
{
  Console.WriteLine(i);
}


# 예시
for (int i = 0; i < 10; i++) 
{
  Console.WriteLine(i);
}

int i = 0;
for (i = 0 ; i < 10 ; i++)
{
    Console.WriteLine(i);
}

3-2) while 문

  • while 문은 조건식이 참(true)인 동안 코드 블록을 반복적으로 실행합니다.
while (조건식)
{
    // 조건식이 참인 경우 실행되는 코드
}


# while문 기초
int i = 0;
while (i < 10)
{
    Console.WriteLine(i);
    i++;
}


# 예시
int count = 0;
while (count < 10)
{
    Console.WriteLine("적을 처치했습니다! 남은 적 수: " + (10 - count - 1));
    count++;
}

Console.WriteLine("축하합니다! 게임에서 승리하셨습니다!");

3-3) for 문 vs while 문

# for 문
int sum = 0;

for (int i = 1; i <= 5; i++)
{
    sum += i;
}

Console.WriteLine("1부터 5까지의 합은 " + sum + "입니다.");


# while 문
int sum = 0;
int i = 1;

while (i <= 5)
{
    sum += i;
    i++;
}

Console.WriteLine("1부터 5까지의 합은 " + sum + "입니다.");
for 문은 반복 횟수가 정해져 있을 때!
while 문은 조건식이 주어져 있을 때!

 

3-4) do-while 문

  • do-while 문은 while 문과 비슷하지만, 조건식을 검사하기 전에 먼저 코드 블록을 한 번 실행하는 점이 다릅니다.
do
{
    // 조건식이 참인 경우 실행되는 코드
}
while (조건식);


# 예시
int sum = 0;
int num;

do
{
    Console.Write("숫자를 입력하세요 (0 입력 시 종료): ");
    num = int.Parse(Console.ReadLine());
    sum += num;
} while (num != 0);

Console.WriteLine("합계: " + sum);

3-5) foreach 문

  • foreach 문은 배열이나 컬렉션에 대한 반복문을 작성할 때 사용합니다.
foreach (자료형 변수 in 배열 또는 컬렉션)
{
    // 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
}


# 예시
string[] inventory = { "검", "방패", "활", "화살", "물약" };

foreach (string item in inventory)
{
    Console.WriteLine(item);
}

3-6) 중첩반복문

# 이차원 반복문
for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 3; j++)
    {
        Console.WriteLine("i: {0}, j: {1}", i, j);
    }
}


# 구구단 출력
for (int i = 2; i <= 9; i++)
{
    for (int j = 1; j <= 9; j++)
    {
        Console.WriteLine(i + " x " + j + " = " + (i * j));
    }
}

3-7) Break & Continue

  • break는 반복문을 중지시키는 역할
  • continue는 현재 반복을 중지하고 다음 반복을 진행하는 역할
# break와 continue 기초
for (int i = 1; i <= 10; i++)
{
    if (i % 3 == 0)
    {
        continue; // 3의 배수인 경우 다음 숫자로 넘어감
    }

    Console.WriteLine(i);
    if (i == 7)
    {
        break; // 7이 출력된 이후에는 반복문을 빠져나감
    }
}


# break와 continue 예제
int sum = 0;

while (true)
{
    Console.Write("숫자를 입력하세요: ");
    int input = int.Parse(Console.ReadLine());

    if (input == 0)
    {
        Console.WriteLine("프로그램을 종료합니다.");
        break;
    }

    if (input < 0)
    {
        Console.WriteLine("음수는 무시합니다.");
        continue;
    }

    sum += input;
    Console.WriteLine("현재까지의 합: " + sum);
}

Console.WriteLine("합계: " + sum);

04. 반복문 심화 실습

# 숫자 맞추기
int targetNumber = new Random().Next(1, 101); ;
int guess = 0;
int count = 0;

Console.WriteLine("1부터 100 사이의 숫자를 맞춰보세요.");

while (guess != targetNumber)
{
    Console.Write("추측한 숫자를 입력하세요: ");
    guess = int.Parse(Console.ReadLine());
    count++;

    if (guess < targetNumber)
    {
        Console.WriteLine("좀 더 큰 숫자를 입력하세요.");
    }
    else if (guess > targetNumber)
    {
        Console.WriteLine("좀 더 작은 숫자를 입력하세요.");
    }
    else
    {
        Console.WriteLine("축하합니다! 숫자를 맞추셨습니다.");
        Console.WriteLine("시도한 횟수: " + count);
    }
}

 

05. 배열

✔️ 동일한 자료형의 값들이 연속적으로 저장되는 자료 구조

 

5-1) 1차원 배열

  • 동일한 데이터 유형을 가지는 데이터 요소들을 한 번에 모아서 다룰 수 있는 구조
  • 인덱스를 사용하여 요소에 접근 가능
  • 선언된 크기만큼의 공간을 메모리에 할당받음
// 배열 선언
데이터_유형[] 배열_이름;

// 배열 초기화
배열_이름 = new 데이터_유형[크기];

// 배열을 한 줄로 선언 및 초기화
데이터_유형[] 배열_이름 = new 데이터_유형[크기];

// 배열 요소에 접근
배열_이름[인덱스] = 값;
값 = 배열_이름[인덱스];
int[] array1 = new int[5];       // 크기가 5인 int형 배열 선언
string[] array2 = new string[3]; // 크기가 3인 string형 배열 선언
int num = 0;

// 배열 초기화
array1[0] = 1;
array1[1] = 2;
array1[2] = 3;
array1[3] = 4;
array1[4] = 5;

num = array1[0];
int[] itemPrices = { 100, 200, 300, 400, 500 };
int totalPrice = 0;

for (int i = 0; i < itemPrices.Length; i++)
{
    totalPrice += itemPrices[i];
}

Console.WriteLine("총 아이템 가격: " + totalPrice + " gold");

5-2) 게임 캐릭터의 능력치 배열 만들기

// 플레이어의 공격력, 방어력, 체력, 스피드를 저장할 배열
int[] playerStats = new int[4]; 

// 능력치를 랜덤으로 생성하여 배열에 저장
Random rand = new Random();
for (int i = 0; i < playerStats.Length; i++)
{
    playerStats[i] = rand.Next(1, 11);
}

// 능력치 출력
Console.WriteLine("플레이어의 공격력: "  + playerStats[0]);
Console.WriteLine("플레이어의 방어력: "  + playerStats[1]);
Console.WriteLine("플레이어의 체력: "    + playerStats[2]);
Console.WriteLine("플레이어의 스피드: "  + playerStats[3]);

5-3) 다차원 배열

  • 여러 개의 배열을 하나로 묶어 놓은 배열
  • 행과 열로 이루어진 표 형태와 같은 구조
  • 2차원, 3차원 등의 형태의 배열을 의미
  • C#에서는 다차원 배열을 선언할 때 각 차원의 크기를 지정하여 생성합니다.
// 2차원 배열의 선언과 초기화
int[,] array3 = new int[2, 3];  // 2행 3열의 int형 2차원 배열 선언

// 다차원 배열 초기화
array3[0, 0] = 1;
array3[0, 1] = 2;
array3[0, 2] = 3;
array3[1, 0] = 4;
array3[1, 1] = 5;
array3[1, 2] = 6;

// 선언과 함께 초기화
int[,] array2D = new int[3, 4] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
// 3차원 배열의 선언과 초기화
int[,,] array3D = new int[2, 3, 4] 
{
    { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } },
    { { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } }
};

5-4) 2차원 배열을 사용하여 게임 맵을 구현

int[,] map = new int[5, 5] 
{ 
    { 1, 1, 1, 1, 1 }, 
    { 1, 0, 0, 0, 1 }, 
    { 1, 0, 1, 0, 1 }, 
    { 1, 0, 0, 0, 1 }, 
    { 1, 1, 1, 1, 1 } 
};

for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 5; j++)
    {
        if (map[i, j] == 1)
        {
            Console.Write("■");
        }
        else
        {
            Console.Write("□");
        }
    }
    Console.WriteLine();
}

06. 컬렉션

✔️ 컬렉션(Collection)은 자료를 모아 놓은 데이터 구조를 의미
  • 컬렉션은 배열과 비슷한 자료 구조
  • 배열과는 다르게 크기가 가변적
  • C#에서는 다양한 종류의 컬렉션을 제공
  • 사용하기 위해서는 System.Collections.Generic 네임스페이스를 추가

6-1) List

  • List는 가변적인 크기를 갖는 배열
  • List를 생성할 때는 List에 담을 자료형을 지정
List<int> numbers = new List<int>(); // 빈 리스트 생성
numbers.Add(1); // 리스트에 데이터 추가
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2); // 리스트에서 데이터 삭제

foreach(int number in numbers) // 리스트 데이터 출력
{
    Console.WriteLine(number);
}

6-2) Dictionary

  • 딕셔너리(Dictionary)는 키와 값으로 구성된 데이터를 저장
  • 딕셔너리는 중복된 키를 가질 수 없으며, 키와 값의 쌍을 이루어 데이터를 저장
using System.Collections.Generic;

Dictionary<string, int> scores = new Dictionary<string, int>(); // 빈 딕셔너리 생성
scores.Add("Alice", 100); // 딕셔너리에 데이터 추가
scores.Add("Bob", 80);
scores.Add("Charlie", 90);
scores.Remove("Bob"); // 딕셔너리에서 데이터 삭제

foreach(KeyValuePair<string, int> pair in scores) // 딕셔너리 데이터 출력
{
    Console.WriteLine(pair.Key + ": " + pair.Value);
}

6-3) Stack(스택)

  • Stack은 후입선출(LIFO) 구조를 가진 자료 구조
Stack<int> stack1 = new Stack<int>();  // int형 Stack 선언

// Stack에 요소 추가
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);

// Stack에서 요소 가져오기
int value = stack1.Pop(); // value = 3 (마지막에 추가된 요소)

6-4) Queue(큐)

  • Queue는 선입선출(FIFO) 구조를 가진 자료 구조
Queue<int> queue1 = new Queue<int>(); // int형 Queue 선언

// Queue에 요소 추가
queue1.Enqueue(1);
queue1.Enqueue(2);
queue1.Enqueue(3);

// Queue에서 요소 가져오기
int value = queue1.Dequeue(); // value = 1 (가장 먼저 추가된 요소)

6-5) Stack(스택)과 Queue(큐) 차이 ▶중요◀
둘 다 데이터를 저장하고 관리하는 자료 구조이다. 그러나 그들 간에는 몇 가지 기본적인 차이가 있다.
LIFO(Last In First Out) 형태로 데이터를 저장하는 구조를 스택,
FIFO(First In First Out) 형태로 데이터를 저장하는 구조를 큐라고 한다.

(feat.Chat GPT)

1. 데이터의 삽입과 삭제 순서:
스택(Stack): Last In, First Out (LIFO) 순서를 따릅니다. 가장 최근에 삽입된 데이터가 가장 먼저 삭제됩니다. 책을 쌓아놓은 것처럼 생각할 수 있습니다.
큐(Queue): First In, First Out (FIFO) 순서를 따릅니다. 가장 먼저 삽입된 데이터가 가장 먼저 삭제됩니다. 줄을 서 있는 것처럼 생각할 수 있습니다.

2. 활용 예시:
스택(Stack): 함수 호출 시의 메모리 관리, 실행 중인 함수의 복귀 주소 저장 등에 사용됩니다.
큐(Queue): 대기열이나 작업 큐 등 데이터의 처리 순서가 중요한 경우에 사용됩니다.

3.주요 연산:
스택(Stack): 주로 push(삽입)와 pop(삭제) 연산을 사용합니다.
큐(Queue): 주로 enqueue(삽입)와 dequeue(삭제) 연산을 사용합니다.

4. 구현:
스택(Stack): 일반적으로 배열(Array) 또는 연결 리스트(Linked List)를 사용하여 구현됩니다.
큐(Queue): 또한 배열(Array) 또는 연결 리스트(Linked List)를 사용하여 구현됩니다.

5. 사용 예시:
스택(Stack): 웹 브라우저의 뒤로 가기 기능, 수식의 괄호 검사, 실행 취소 기능 등에 사용됩니다.
큐(Queue): 프린터 대기열, 작업 스케줄링, BFS(너비 우선 탐색) 알고리즘 등에 사용됩니다.

 

6-6) HashSet

  • HashSet은 중복되지 않은 요소들로 이루어진 집합
HashSet<int> set1 = new HashSet<int>();  // int형 HashSet 선언

// HashSet에 요소 추가
set1.Add(1);
set1.Add(2);
set1.Add(3);

// HashSet에서 요소 가져오기
foreach (int element in set1)
{
    Console.WriteLine(element);
}

07. 배열과 리스트

리스트는 동적으로 크기를 조정할 수 있어 배열과는 다르게 유연한 데이터 구조를 구현할 수 있습니다. 하지만, 리스트를 무분별하게 사용하는 것은 좋지 않은 습관입니다.

 

  1. 메모리 사용량 증가: 리스트는 동적으로 크기를 조정할 수 있어 배열보다 많은 메모리를 사용합니다. 따라서, 많은 데이터를 다루는 경우 리스트를 무분별하게 사용하면 메모리 사용량이 급격히 증가하여 성능 저하를 유발할 수 있습니다.
  2. 데이터 접근 시간 증가: 리스트는 연결 리스트(linked list)로 구현되기 때문에, 인덱스를 이용한 데이터 접근이 배열보다 느립니다. 리스트에서 특정 인덱스의 데이터를 찾기 위해서는 연결된 노드를 모두 순회해야 하기 때문입니다. 이러한 이유로, 리스트를 무분별하게 사용하면 데이터 접근 시간이 증가하여 성능이 저하될 수 있습니다.
  3. 코드 복잡도 증가: 리스트는 동적으로 크기를 조정할 수 있기 때문에, 데이터 추가, 삭제 등의 작업이 배열보다 간편합니다. 하지만, 이러한 유연성은 코드 복잡도를 증가시킬 수 있습니다. 리스트를 사용할 때는 데이터 추가, 삭제 등의 작업을 적절히 처리하는 코드를 작성해야 하므로, 코드의 가독성과 유지 보수성이 저하될 수 있습니다.

따라서, 리스트를 무분별하게 사용하는 것은 좋지 않은 습관입니다. 데이터 구조를 선택할 때는, 데이터의 크기와 사용 목적을 고려하여 배열과 리스트 중 적절한 것을 선택해야 합니다.

 

08. 메서드

8-1) 메서드란?

  • 메서드(Method)는 일련의 코드 블록으로, 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위입니다.
  • 코드의 재사용성과 모듈화를 위해 사용되며, 필요할 때 호출하여 실행됩니다.
  • 튜터님이 예시로 들어준 아침, 점심, 저녁 양치 예시 생각하기!

8-2) 메서드의 역할과 중요성

  • 코드의 재사용성: 메서드를 사용하면 동일한 작업을 반복해서 구현하지 않아도 됩니다. 필요할 때 메서드를 호출하여 작업을 수행할 수 있습니다.
  • 모듈화: 메서드를 사용하여 코드를 작은 단위로 분리하고 관리할 수 있습니다. 각 메서드는 특정한 기능을 수행하므로 코드의 구조가 더욱 명확해집니다.
  • 가독성과 유지보수성: 메서드를 사용하면 코드가 간결해지고 가독성이 좋아집니다. 또한, 코드 수정이 필요한 경우 해당 메서드만 수정하면 되므로 유지보수가 용이해집니다.
  • 코드의 중복 제거: 반복적인 작업을 메서드로 묶어서 사용하면 코드 중복을 방지할 수 있습니다.
  • 코드의 추상화: 메서드를 통해 작업 단위를 추상화하고, 메서드 이름을 통해 해당 작업이 어떤 역할을 하는지 파악할 수 있습니다.

09. 메서드 선언과 호출

9-1) 메서드의 구조와 문법

[접근 제한자] [리턴 타입] [메서드 이름]([매개변수])
{
    // 메서드 실행 코드
}


# 예시
// 예시 1: 반환 값이 없는 메서드
public void SayHello()
{
    Console.WriteLine("안녕하세요!");
}

// 예시 2: 매개변수가 있는 메서드
public void GreetPerson(string name)
{
    Console.WriteLine("안녕하세요, " + name + "님!");
}

// 예시 3: 반환 값이 있는 메서드
public int AddNumbers(int a, int b)
{
    int sum = a + b;
    return sum;
}
  • 접근 제한자(Access Modifier): 메서드에 접근할 수 있는 범위를 지정합니다. 주로 public, private, protected 등을 사용합니다.
  • 리턴 타입(Return Type): 메서드가 반환하는 값의 데이터 타입을 지정합니다. 반환 값이 없을 경우 void를 사용합니다.
  • 메서드 이름(Method Name): 메서드를 호출하기 위해 사용하는 이름입니다. 호출할 때 이 이름을 사용합니다.
  • 매개변수(Parameters): 메서드에 전달되는 입력 값으로, 필요한 경우 0개 이상의 매개변수를 정의할 수 있습니다.
  • 메서드 실행에 코드(Method Body): 중괄호({}) 안에 메서드가 수행하는 작업을 구현하는 코드를 작성합니다.

9-2) 메서드 호출 방법

  • 메서드를 호출하기 위해서는 메서드 이름과 필요한 매개변수를 전달하여 호출합니다.
  • 메서드 호출은 다음과 같은 형식으로 이루어집니다:
[메서드 이름]([전달할 매개변수]);


# 예시
AddNumbers(10, 20);
  • 호출 시 전달되는 매개변수는 메서드의 매개변수와 순서와 타입이 일치해야 합니다.
  • 메서드는 호출되면 해당 메서드의 실행 코드를 수행하고, 필요한 경우 리턴 값이 있다면 반환합니다.

10. 매개변수와 반환값

10-1) 매개변수의 개념과 활용

  • 매개변수는 메서드에 전달되는 입력 값으로, 메서드 내에서 이 값을 활용하여 원하는 작업을 수행할 수 있습니다.
  • 매개변수는 메서드의 선언부에 정의되며, 필요한 경우 0개 이상의 매개변수를 정의할 수 있습니다.
  • 매개변수는 메서드 호출 시 전달되는 값에 따라 동적으로 결정되며, 호출 시에는 해당 매개변수의 값을 전달해야 합니다.
# 예제
void PrintFullName(string firstName, string lastName)
{
    Console.WriteLine("Full Name: " + firstName + " " + lastName);
}

// 메서드 호출
PrintFullName("John", "Doe");

10-2) 반환값의 개념과 활용

  • 반환값은 메서드가 수행한 작업의 결과를 호출자에게 반환하는 값입니다.
  • 반환값은 메서드의 리턴 타입에 지정되며, 해당 타입의 값을 반환해야 합니다.
  • 메서드 내에서 계산, 조작, 처리한 결과 등을 반환값으로 사용할 수 있습니다.
# 예제
int AddNumbers(int a, int b)
{
    int sum = a + b;
    return sum;
}

// 메서드 호출 및 반환값 사용
int result = AddNumbers(10, 20);
Console.WriteLine("Sum: " + result);

10-3) void 형식과 반환값이 없는 메서드

  • void는 메서드의 리턴 타입으로 사용되며, 해당 메서드가 값을 반환하지 않음을 나타냅니다.
  • 반환값이 없는 메서드는 호출되면 메서드의 실행 코드를 수행하고 호출자에게 반환하지 않습니다.
void PrintMessage(string message)
{
    Console.WriteLine("Message: " + message);
}

// 메서드 호출
PrintMessage("Hello, World!");

10-4) 사용 예시

# 메서드 기초
void PrintLine()
{
    for (int i = 0; i < 10; i++)
    {
        Console.Write("=");
    }
    Console.WriteLine();
}

void PrintLine2(int count)
{
    for (int i = 0; i < count; i++)
    {
        Console.Write("=");
    }
    Console.WriteLine();
}

int Add(int a, int b)
{
    return a + b;
}


[사용 예시]
PrintLine();
PrintLine2(20);

int result = Add(10, 20);
Console.WriteLine(result);

11. 메서드 오버로딩

11-1) 오버로딩 개념과 활용

  • 메서드 오버로딩은 동일한 이름의 메서드를 다양한 매개변수 목록으로 다중 정의하는 개념입니다.
  • 매개변수의 개수, 타입, 순서가 다른 여러 메서드를 동일한 이름으로 정의하여 메서드 호출 시 매개변수의 형태에 따라 적절한 메서드가 선택되도록 할 수 있습니다.
  • 오버로딩은 메서드의 기능이나 작업은 동일하지만 입력값에 따라 다르게 동작해야 할 때 사용됩니다.
void PrintMessage(string message)
{
    Console.WriteLine("Message: " + message);
}

void PrintMessage(int number)
{
    Console.WriteLine("Number: " + number);
}

// 메서드 호출
PrintMessage("Hello, World!");  // 문자열 매개변수를 가진 메서드 호출
PrintMessage(10);  // 정수 매개변수를 가진 메서드 호출


# 오버로딩 기초
int AddNumbers(int a, int b)
{
    return a + b;
}

int AddNumbers(int a, int b, int c)
{
    return a + b + c;
}

// 메서드 호출
int sum1 = AddNumbers(10, 20);  // 두 개의 정수 매개변수를 가진 메서드 호출
int sum2 = AddNumbers(10, 20, 30);  // 세 개의 정수 매개변수를 가진 메서드 호출

11. 재귀 호출

11-1) 재귀 호출 개념과 동작 원리

  • 재귀 호출은 메서드가 자기 자신을 호출하는 것을 의미합니다.
  • 재귀 호출은 문제를 작은 부분으로 분할하여 해결하는 방법 중 하나로, 작은 부분의 해결 방법이 큰 문제의 해결 방법과 동일한 구조를 갖고 있는 경우에 적합합니다.
  • 재귀 호출은 호출 스택에 호출된 메서드의 정보를 순차적으로 쌓고, 메서드가 반환되면서 스택에서 순차적으로 제거되는 방식으로 동작합니다.
# 재귀 호출 기초
void CountDown(int n)
{
    if (n <= 0)
    {
        Console.WriteLine("Done");
    }
    else
    {
        Console.WriteLine(n);
        CountDown(n - 1);  // 자기 자신을 호출
    }
}

// 메서드 호출
CountDown(5);

11-2) 재귀 호출의 활용과 주의점

  • 재귀 호출은 복잡한 문제를 단순한 방식으로 해결할 수 있는 장점이 있습니다.
  • 재귀 호출을 사용할 때 주의해야 할 점은 종료 조건을 명확히 정의해야 하며, 종료 조건을 만족하지 못하면 무한히 재귀 호출이 반복되어 스택 오버플로우 등의 오류가 발생할 수 있습니다.
  • 재귀 호출은 메모리 사용량이 더 크고 실행 속도가 느릴 수 있으므로, 필요한 경우에만 적절히 사용하는 것이 좋습니다.

12. 메서드 활용 사례

12-1)  메서드를 사용한 코드의 재사용성

  • 메서드는 일련의 작업을 수행하는 코드 블록으로, 반복적으로 사용되는 코드를 메서드로 분리함으로써 코드의 재사용성을 높일 수 있습니다.
  • 동일한 작업을 수행하는 코드를 여러 곳에서 사용해야 할 때, 해당 작업을 메서드로 정의하고 필요한 곳에서 메서드를 호출하여 재사용할 수 있습니다.
  • 이를 통해 중복 코드를 제거하고, 코드의 길이를 줄이고, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

12-2) 메서드를 활용한 가독성과 유지보수성 개선

  • 메서드는 코드의 일부분을 의미 있는 이름으로 추상화하고, 해당 메서드를 호출함으로써 코드의 의도를 명확히 전달할 수 있습니다.
  • 긴 코드를 작은 단위로 분리하여 메서드로 정의하면, 코드가 간결해지고 가독성이 향상됩니다.
  • 또한, 코드를 작은 단위로 분리하여 메서드로 관리하면, 유지보수가 용이해집니다. 특정 기능을 수정하거나 추가해야 할 때, 해당 메서드만 수정하면 되기 때문에 다른 부분에 영향을 주지 않고도 유지보수가 가능합니다.

12-3) 예제

// 원의 넓이를 계산하는 메서드
double CalculateCircleArea(double radius)
{
    double area = Math.PI * radius * radius;
    return area;
}

// 사각형의 넓이를 계산하는 메서드
double CalculateRectangleArea(double width, double height)
{
    double area = width * height;
    return area;
}

// 메서드 활용
double circleArea = CalculateCircleArea(5.0);
double rectangleArea = CalculateRectangleArea(3.0, 4.0);

Console.WriteLine("원의 넓이: " + circleArea);
Console.WriteLine("사각형의 넓이: " + rectangleArea);

13. 구조체

13-1) 구조체란?

  • 여러 개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위한 방법입니다.
  • 구조체는 값 형식(Value Type)으로 분류되며, 데이터를 저장하고 필요한 기능을 제공할 수 있습니다.
  • 구조체는 struct 키워드를 사용하여 선언합니다. 
  • 구조체의 멤버는 변수와 메서드로 구성될 수 있습니다.
struct Person
{
    public string Name;
    public int Age;

    public void PrintInfo()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}


# 구조체의 사용
Person person1;
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();

13-2) 구조체의 사용

  • 구조체는 변수를 선언하여 사용할 수 있습니다.
  • 구조체의 멤버에는 접근할 때 . 연산자를 사용합니다.
Person person1;
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();

작성하다 보니 내용이 많아졌다 ㅠ 문법이고 공부한 내용 하나하나 거를 타선이 없어 예제 코드와 설명이 다 들어감...

이어서 남은 내용인 풀제 풀이는 다음 장에서 작성하도록 하자!