본문 바로가기

TIL (since 2023.08.07 ~ )

2023-08-16 TIL (C# - 02)

오늘은 C# 문법 2주차 강의를 듣고 정리하는 시간을 가져보았다. 드디어 1주차에서는 간단하게 입력 및 출력을 하는 것이었다면, 2주차 부터는 본격적으로 로직을 구현하기 위한 문법인 조건문과 반복문부터 배열과 리스트 등 본격적으로 사용해야 하는 지식이 등장했다.

 

처음 C# 공부를 하게 되다보니, 생각보다 엄청 기초적인 것부터 "이게 왜 이렇게 되지..?" 라는 생각이 많이 들기도 했고,

신경쓸 자잘자잘한 부분도 많다보니 아직도 완전히 내 지식으로 받아들여지지 않은 것 같다..ㅠㅠ

 

그래도 꾸준히 계속 VisualStudio를 활용해서 프로젝트를 생성한 뒤 손에 익도록 코드를 직접 따라서 써보기도하고,

쓰면서 왜 이렇게 작성이 되었을까 생각하다 보니 조금이나마 논리적인 설계가 보이기 시작하는 것 같다.

 

또한, 모르는 부분이 있으면 튜터님들을 적극 활용하라는 팀원분의 꿀팁도 있었다(ㅋㅋㅋㅋ)

아직 갈길이 멀고 기초를 다지는 단계인 만큼 조바심 내지않고 나의 페이스대로 지식을 온전히 내것으로 만드는 것에 집중해야겠다.

 

 


조건문

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

 

1. if 문

- 조건식의 결과에 따라 실행 여부를 결정

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

<예시>

int playerScore = 80;

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

 

 

2. else 문

- if 문에서 조건식이 거짓일 경우 실행할 코드를 지정

if (조건식)
{
	//조건식이 참일 경우 실행할 코드
 }
 else
 {
 	//조건식이 거짓일 경우 실행할 코드
  }

<예시>

int itemCount = 5;
string itemName = "HP 포션";

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

 

3. 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 + "입니다.");

 

4. 중첩 조건문

- 하나의 조건문 안에 또 다른 조건문이 포함된 형태

int itemLevel = 3; //아이템 레벨
string itemType = "weapon" //아이템 종류

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

위에서 보이는 구조는 if - else if - else 구조로 된 중첩 조건문이다.

 

5. switch 문

- 변수나 식의 결과에 따라 다른 코드 블록을 실행하는 제어문

- case 문을 사용하여 변수나 식의 결과에 따라 실행할 코드를 지정

switch (변수나 식)
{
	case 값1:
    	// 값1이 나온 경우 실행되는 코드
        break;
    case 값2:
    	// 값2가 나온 경우 실행되는 코드
        break;
    // ...
    default:
    	// 모든 case문에 해당하지 않는 경우 실행되는 코드
        break;
}

 

<예시>

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("게임을 종료합니다.");

 

6. 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("레벨업 불가능");
}

 

 

조건문 심화 실습

1. 홀수 / 짝수 구분하기

- % (나머지 연산)을 이용하여 짝수 구분

Console.Write("번호를 입력하세요: ");
int number = int.Parse(Console.ReadLine());

if (number % 2 == 0)
{
	Console.WriteLine("짝수입니다.");
}
else
{
	Console.WriteLine("홀수입니다.");
}

 

2. 등급 출력

- else if 문에서 사용된 예시를 switch 문(case)으로 변경

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 + "입니다.");

 

3. 로그인 프로그램

- && 와 || 논리연산자 재확인

string id = "myid";
string password = "mypassword";

Console.Write("아이디를 입력하세요: ");
string inputId = Console.ReadLine();
Console.Write("비밀번호를 입력하세요: ");
string inputPassword = Console.ReadLine();

if (inputId == id && inputPassword == password)
{
    Console.WriteLine("로그인 성공!");
}
else
{
    Console.WriteLine("로그인 실패...");
}

 

4. 알파벳 판별 프로그램

- 입력한 문자가 알파벳인지 여부를 판단

Console.Write("문자를 입력하세요: ");
char input = Console.ReadLine()[0];

if (input >= 'a' && input <= 'z' || input >= 'A' && input <= 'Z')
{
    Console.WriteLine("알파벳입니다.");
}
else
{
    Console.WriteLine("알파벳이 아닙니다.");
}

 

 

 

반복문

1. for 문

- 초기식, 조건식, 증감식을 사용하여 작성

- 초기식 : 반복문이 시작될 때 단 한 번 실행

- 조건식 : 반복문이 실행될 때마다 평가되며, 참(true)인 경우 반복문이 계속 실행

- 증감식 : 반복문이 실행될 때마다 실행

for (초기식; 조선식; 증감식)
{
	// 조건식이 참인 경우 실행되는 코드
}

 

<예시>

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

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

// 0 ~ 10 사이의 짝수를 출력
for (int i = 0; i <10; i += 2)
{
	Console.WriteLine(i);
}

 

2. while 문

- 조건식이 참(true)인 동안 코드 블록을 반복적으로 실행

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. 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 문은 반복 조건에 따라 조건문의 실행 횟수가 유동적이며, 이에 따라 코드가 더 간결

- 따라서 어떤 반복문을 사용할 것인지는 상황에 맞게 선택

 

 

4. 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);

 

5. foreach 문

- 배열이나 컬렉션에 대한 반복문을 작성

foreach (자료형 변수 in 배열 또는 컬렉션)
{
	// 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
}

 

<예시>

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

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

 

 

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));
     }
}

 

7. 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이 출력된 이후에는 반복문을 빠져나감
     }
}
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);

 

 

반복문 심화 실습

1. 가위바위보

string[] choices = { "가위", "바위", "보" };
string playerChoice = "";
string computerChoice = choices[new Random().Next(0, 3)];

while (playerChoice != computerChoice)
{
    Console.Write("가위, 바위, 보 중 하나를 선택하세요: ");
    playerChoice = Console.ReadLine();

    Console.WriteLine("컴퓨터: " + computerChoice);

    if (playerChoice == computerChoice)
    {
        Console.WriteLine("비겼습니다!");
    }
    else if ((playerChoice == "가위" && computerChoice == "보") ||
             (playerChoice == "바위" && computerChoice == "가위") ||
             (playerChoice == "보" && computerChoice == "바위"))
    {
        Console.WriteLine("플레이어 승리!");
    }
    else
    {
        Console.WriteLine("컴퓨터 승리!");
    }
}

 

2. 숫자 맞추기

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);
    }
}

 

 


 

배열

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

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");

 

 

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]);

 

3. 학생들의 성적 평균 구하기

int[] scores = new int[5];  // 5명의 학생 성적을 저장할 배열

// 성적 입력 받기
for (int i = 0; i < scores.Length; i++)
{
    Console.Write("학생 " + (i + 1) + "의 성적을 입력하세요: ");
    scores[i] = int.Parse(Console.ReadLine());
}

// 성적 총합 계산
int sum = 0;
for (int i = 0; i < scores.Length; i++)
{
    sum += scores[i];
}

// 성적 평균 출력
double average = (double)sum / scores.Length;
Console.WriteLine("성적 평균은 " + average + "입니다.");

 

 

4. 배열을 활용한 숫자 맞추기 게임

Random random = new Random();  // 랜덤 객체 생성
int[] numbers = new int[3];  // 3개의 숫자를 저장할 배열

// 3개의 랜덤 숫자 생성하여 배열에 저장
for (int i = 0; i < numbers.Length; i++)
{
    numbers[i] = random.Next(1, 10);
}

int attempt = 0;  // 시도 횟수 초기화
while (true)
{
    Console.Write("3개의 숫자를 입력하세요 (1~9): ");
    int[] guesses = new int[3];  // 사용자가 입력한 숫자를 저장할 배열

    // 사용자가 입력한 숫자 배열에 저장
    for (int i = 0; i < guesses.Length; i++)
    {
        guesses[i] = int.Parse(Console.ReadLine());
    }

    int correct = 0;  // 맞춘 숫자의 개수 초기화

    // 숫자 비교 및 맞춘 개수 계산
    for (int i = 0; i < numbers.Length; i++)
    {
        for (int j = 0; j < guesses.Length; j++)
        {
            if (numbers[i] == guesses[j])
            {
                correct++;
                break;
            }
        }
    }

    attempt++;  // 시도 횟수 증가
    Console.WriteLine("시도 #" + attempt + ": " + correct + "개의 숫자를 맞추셨습니다.");

    // 모든 숫자를 맞춘 경우 게임 종료
    if (correct == 3)
    {
        Console.WriteLine("축하합니다! 모든 숫자를 맞추셨습니다.");
        break;
    }
}

 

5. 다차원 배열

- 여러 개의 배열을 하나로 묶어 놓은 배열

- 행과 열로 이루어진 표 형태와 같은 구조

- 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 } }
};

 

※ 다차원 배열을 활용한 프로그래밍 방법

- 복잡한 데이터 구조를 효율적으로 관리

- 2차원 배열은 행, 열로 이루어진 데이터 구조를 다루기 적합

- 3차원 배열은 면, 행, 열로 이루어진 데이터 구조를 다루기 적합

int[,] map = new int[5, 5];
for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 5; j++)
    {
        map[i, j] = i + j;
    }
}

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

 

6. 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();
}

 

 

 

 

 

컬렉션

- 자료를 모아 놓은 데이터 구조

- 배열과 비슷한 자료 구조

- 배열과는 다르게 크기가 가변적

- 사용하기 위해서는 System.Collections.Generic 네임스페이스를 추가

 

 

1. 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);
}

 

2. 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);
}

 

3. Stack

- 후입선출 구조를 가진 자료 구조

 

<예시>

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 (마지막에 추가된 요소)

 

4. Queue

- 선입선출 구조를 가진 자료 구조

 

<예시>

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 (가장 먼저 추가된 요소)

 

5. 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);
}

 

 

 

 

 

배열과 리스트

- 리스트는 동적으로 크기를 조정할 수 있어 배열과는 다르게 유연한 데이터 구조를 구현할 수 있다.

하지만, 리스트를 무분별하게 사용하는 것은 좋지 않음

 

1) 메모리 사용량 증가

- 리스트는 배열보다 메모리 사용량이 많기 때문에 무분별하게 사용시 성능 저하를 유발

 

2) 데이터 접근 시간 증가

- 리스트는 연결 리스트(linked list)로 구현되기 때문에 배열보다 데이터 접근이 느리므로 남발시 성능 저하를 유발

- C# 에서 리스트는 연결 리스트(linked list)로 직접적으로 생성하지 않는 이상, 동적배열을 이용. 또한 리스트가 연결 리스트의 상위 개념이 아니기 때문에 두 컬렉션은 호환이 불가함

(피드백 감사합니다!)

 

3) 코드 복잡도 증가

- 리스트의 유연성이 코드 복잡도를 증가시켜 코드의 가독성과 유지보수성의 저하를 유발

 

따라서, 리스트를 무분별하게 사용하는 것은 좋지 않은 습관

데이터 구조를 선택할 때는, 데이터의 크기와 사용 목적을 고려하여 배열과 리스트 중 적적할 것을 선택

 

 

 

 


 

 

메서드

- 일련의 코드 블록으로, 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위

- 코드의 재사용성과 모듈화를 위해 사용, 필요할 때 호출

 

  • 코드의 재사용성 : 필요할 때 호출하여 작업 수행
  • 모듈화 : 코드를 작은 단위로 분리하고 관리
  • 가독성과 유지보수성 : 코드가 간결해지고 가독성이 향상. 수정시 해당 메서드만 수정함으로 유지보수의 용이
  • 코드의 중복 제거 : 반복적인 작업을 메서드로 묶어 코드 중복 사용 방지
  • 코드의 추상화 : 작업 단위를 추상화

 

1. 메서드 선언과 호출

1. 메서드의 구조와 문법

[접근 제한자] [리털 타입] [메서드 이름] ([매개변수])
{
	// 메서드 실행 코드
 }
  • 접근 제한자(Access Modifier) : 메서드에 접근할 수 있는 범위 지정. 주로 public, private, protected 등을 사용
  • 리턴 타입(Return Type) : 메서드가 반환하는 값의 데이터 타입을 지정. 반환 값이 없을 경우 void 사용
  • 메서드 이름(Method Name) : 메서드 호출시 사용하는 이름
  • 매개변수(Parameters) : 메서드에 전달되는 입력 값. 필요한 경우 0개 이상의 매개변수를 정의
  • 메서드 실행에 코드(Method Body) : 중괄호안에 메서드가 수행하는 작업을 구현하는 코드 작성

<예시>

// 예시 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;
}

 

2. 메서드 호출 방법

[메서드 이름]([전달한 매개변수]);

// 예시
AddNumbers(10, 20);

 

2. 매개변수와 반환값

1. 매개변수의 개념과 활용

- 매개변수는 메서드에 전달되는 입력 값으로, 메서드 내에서 이 값을 활용하여 원하는 작업을 수행 가능

- 매개변수는 메서드의 선언부에 정의, 필요한 경우 0개 이상의 매개변수를 정의

- 매개변수는 메서드 호출 시 전달되는 값에 따라 동적으로 결정

 

<예시>

void PrintFullName(string firstName, string lastName)
{
	Console.WriteLine("Full Name: " + firstName + " " + lastName);
 }
 
 // 메서드 호출
 PrintFullName("John", "Doe");

 

2. 반환값의 개념과 활용

- 반환값은 메서드가 수행한 작업의 결과를 호출자에게 반환하는 값

- 메서드의 리턴 타입에 지정, 해당 타입의 값을 반환

- 메서드 내에서 계산, 조작, 처리한 결과 등을 반환값으로 사용

 

<예시>

 

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

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

 

3. void 형식과 반환값이 없는 메서드

- void는 메서드의 리턴 타입으로 사용, 해당 메서드가 값을 반환하지 않음을 나타냄

- 반환값이 없으면 코드 수행 후 호출자에게 반환하지 않음

 

<예시>

void PrintMessage(string message)
{
    Console.WriteLine("Message: " + message);
}

// 메서드 호출
PrintMessage("Hello, World!");
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);

 

 

 

3. 메서드 오버로딩

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);  // 세 개의 정수 매개변수를 가진 메서드 호출

 

4. 메서드 활용 사례

1. 코드의 재사용성

- 반복적으로 사용되는 코드를 메서드로 분리하여 코드 재사용성 향상

- 동일한 작업을 수행하는 코드를 여러 곳에서 사용시, 메서드로 정의하여 호출

- 중복 코드 제거, 코드 길이 감소, 코드의 가독성과 유지보수성 향상

 

2. 가독성과 유지보수성 개선

- 코드의 일부분을 의미 있는 이름으로 추상화, 코드의 의도를 명확히 전달

- 코드 간소화, 가독성 향상

- 특정 기능 수정 및 추가시, 해당 메서드만 수정하여 유지보수 가능

 

<예시>

// 원의 넓이를 계산하는 메서드
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);

 

 

 

 

재귀 호출

 

1. 재귀 호출 개념과 동작 원리

- 재귀 호출은 메서드가 자기 자신을 호출하는 것

- 문제를 작은 부분으로 분할 후 해결하는 방법, 작은 부분의 해결 방법이 큰 문제의 해결 방법과 동일한 구조를 갖고 있는 경우 적합

- 호출 스택에 호출된 메서드의 정보를 순차적으로 쌓고, 메서드가 반환되면서 스택에서 순차적으로 제거되는 방식

 

<예시>

void CountDown(int n)
{
    if (n <= 0)
    {
        Console.WriteLine("Done");
    }
    else
    {
        Console.WriteLine(n);
        CountDown(n - 1);  // 자기 자신을 호출
    }
}

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

 

2. 재귀 호출의 활용과 주의점

- 복잡한 문제를 단순한 방식으로 해결 가능

- 종료 조건을 명확히 정의해야 하며, 종료 조건을 불만족 시 무한히 재귀 호출이 되어 스택 오버플로우 등의 오류 초래

- 재귀 호출은 메모리 사용량이 크고 실행 속도가 느리므로, 필요한 경우에만 적절히 사용

 

 

 

 

 

구조체

1. 구조체의 개념

- 여러 개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위한 방법

- 값 형식(Value Type)으로 분류, 데이터를 저장하고 필요한 기능 제공

- struct 키워드를 사용하여 선언

- 구조체의 멤버는 변수와 메서드로 구성

 

<예시>

struct Person
{
    public string Name;
    public int Age;

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

 

2. 구조체의 사용

- 구조체는 변수를 선언하여 사용

- 구조체의 멤버에 접근 시, " . " 연산자 사용

 

<예시>

Person person1;
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();

 

'TIL (since 2023.08.07 ~ )' 카테고리의 다른 글

2023-08-18 TIL (C# 기초문법 + 개인과제 1일차)  (0) 2023.08.18
2023-08-17 TIL (C# - 03)  (0) 2023.08.17
2023-08-14 TIL (C# - 01)  (0) 2023.08.14
2023-08-11 TIL  (0) 2023.08.11
2023-08-10 TIL  (0) 2023.08.10