반복제어, 배열(1차원배열)

이정현
∙∙조회 3

20260930 반복제어, 배열(1차원배열)

반복 제어

반복문에서 반복문을 중간에 끝내야 하거나 건너뛰어야 하는 상황에서 사용

  • break : 반복문을 즉시 끝냄
  • continue : 이번 회차의 남아있는 코드를 건너뛰고 다음 회차로 넘어감

break

반복을 즉시 끝냄

  • 보통 반복을 진행하면서 달성하고자 하는 것을 달성하면 해당 반복을 종료할 때 사용
csharp
using System;

int target = 0;

for (int i = 100; i <= 1000; i++)
{
    if (i % 13 == 0 && i % 7 == 3)
    {
        target = i;
        break;   // 첫 번째로 찾은 것이면 됨
    }
}

Console.WriteLine($"조건을 만족하는 첫 수: {target}");

무한 루프에서 조건을 만족하면 빠져나가도록 할 때도 사용

csharp
using System;

int balance = 100;
int turn = 0;

while (true)
{
    turn++;
    balance -= turn * 7;

    Console.WriteLine($"{turn} 턴 뒤 잔액: {balance}");

    if (balance <= 0)
    {
        break;
    }
}

Console.WriteLine($"{turn} 턴에 잔액이 다 떨어짐");

중첩 반복에서는 하나만 끝냄

csharp
// 반복문안의 반복문 예시
using System;

for (int i = 1; i <= 3; i++)
{
    Console.WriteLine($"바깥 {i}");

    for (int j = 1; j <= 5; j++)
    {
        if (j == 3)
        {
            break;   // 안쪽 반복만 끝냄
        }

        Console.WriteLine($"    안쪽 {j}");
    }
}

Console.WriteLine("전부 종료");

중첩문을 한번에 빠져나가게끔 만들 수 도있다

csharp
// 예시1
using System;

bool found = false;
int foundI = 0;
int foundJ = 0;

// 여기 조건식에 !found를 추가하여 한번에 빠져나가도록 되어있다.
for (int i = 1; i <= 9 && !found; i++) 
{
    for (int j = 1; j <= 9; j++)
    {
        if (i * j == 24 && i < j)
        {
            foundI = i;
            foundJ = j;
            found = true;
            break;      // 안쪽 종료
        }
    }
}

Console.WriteLine($"찾음: {found}");
Console.WriteLine($"{foundI} × {foundJ} = 24");

//예시2
using System;

bool found = false;
int foundI = 0;
int foundJ = 0;

for (int i = 1; i <= 9; i++)
{
    for (int j = 1; j <= 9; j++)
    {
        if (i * j == 24 && i < j)
        {
            foundI = i;
            foundJ = j;
            found = true;
            break;
        }
    }

    //여기에 found를 확인하여 break;를 실행하는 조건을 추가하여 더이상 반복을 진행하지 않고 나가도록 되어있다.
    if (found)
    {
        break;
    }
}

Console.WriteLine($"{foundI} × {foundJ} = 24");

continue

반복문 자체는 계속 되어야 하지만 해당 회차만 넘어가야 하는 경우 사용. continue 이후의 코드는 건너뛰고 다음 회차로 넘어감. continue 이전 코드는 실행.

csharp
using System;

for (int i = 1; i <= 4; i++)
{
    Console.WriteLine($"{i} 회차 시작");

    if (i == 2)
    {
        Console.WriteLine("  건너뜀");
        continue;
    }

    Console.WriteLine($"{i} 회차 끝");
}

반복중 처리할 수 없는값이 발생할 경우 건너뛰는데 사용하기도 한다

csharp
using System;

int dividend = 100;

for (int i = -3; i <= 3; i++)
{
    if (i == 0)
    {
        Console.WriteLine("0 으로는 나눌 수 없어 건너뜀");
        continue;
    }

    Console.WriteLine($"{dividend} / {i} = {dividend / i}");
}

while에서 사용할 때 잘못 사용하게 될 경우 의도치 안게 무한루프에 빠질 수 도있다.

csharp
// 의도치 않은 무한루프 예시
// 실행하면 끝나지 않음
using System;

int i = 0;

while (i < 10)
{
    if (i % 2 == 0)
    {
        continue;   // i 가 0 인 채로 계속 돌아옴
    }

    Console.Write($"{i} ");
    i++;
}

goto 문법은 존재하나 사용하지 않는것이 좋다.

배열(1차원 배열)

같은 타입의 값 여러 개를 하나의 이름으로 묶어 두는 것

csharp
// 예시
// 예를들어 score를 여러개 가지고 있고 싶을 때 배열로(scores) 만들어줌
using System;

int[] scores = { 90, 85, 77 };

int total = 0;

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

Console.WriteLine($"총점: {total}");

  • 배열 내부의 각각의 항복을 요소라고 한다.
  • 배열의 index는 0부터 시작한다 ([i] <- 여기 들어가는게 index)

배열은 참조형이라서 생성을 해줘야 한다(new 타입[갯수] 혹은 데이더형[] 변수 = {값, 값, 값}) 보통은 선언과 생성을 한줄에 적는다.

csharp
// 배열 생성 예시
using System;

int[] numbers = new int[5];

Console.WriteLine($"칸 개수: {numbers.Length}");

배열 선언시 타입별 기본값

타입기본값
int, long, short, byte0
float, double, decimal0
boolfalse
char\0(아무것도 없는 문자)
string값이 없음을 뜻하는 상태

index

인덱스가 범위를 벗어나면 컴파일에는 오류가 안나지만 실행중 오류가 발생하며 프로그램이 멈춘다

csharp
// 예시
using System;

int[] numbers = new int[3];     // 유효한 인덱스는 0, 1, 2

numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;                // 실행 중 오류

Console.WriteLine("여기까지 오지 못함");

선언과 동시에 값 넣기

배열 생성방법

csharp
// 방법 1 — new 와 타입을 모두 적음
using System;

int[] a = new int[] { 10, 20, 30 };

// 방법 2 — 개수까지 적음 (나열한 값의 수와 같아야 함)
int[] b = new int[3] { 10, 20, 30 };

// 방법 3 — 선언에 타입이 있으므로 new 를 생략함
int[] c = { 10, 20, 30 };

Console.WriteLine($"{a.Length}, {b.Length}, {c.Length}");
Console.WriteLine($"{a[1]}, {b[1]}, {c[1]}");

방법 3가지 모두 같은 결과를 가진다.(방법3이 편하다)

  • 주의: 배열은 같은 타입의 값만 담을 수 있다.
    • int[] numbers = { 10, "스물", 30 }; 이렇게 하면 오류가 발생한다.
  • 사이즈가 0인 배열도 선언은 가능하지만 접근하려고 하면 오류가 발생한다.
    • string[] empty = new string[0]; 이렇게 하면 생성은 가능하지만 접근이 안된다.
  • 배열.Length를 할 경우 int형을 반환한다. 실수를 살리고 싶으면 형 변환이 필요하다.

foreach문

배열의 값을 처음부터 끝까지 하나씩 꺼내 쓰는 것이 목적일 경우나 인덱스가 필요 없는 경우 foreach문이 더 간단함 foreach문에서 가져오는 변수에는 할당이 불가능 하기 때문에 읽을 때만 사용하는 것이 좋다.

csharp
//예시1
foreach (타입 변수이름 in 배열)
{
    // 변수이름에 요소가 하나씩 들어옴
}

//예시2
using System;

string[] languages = { "C#", "Java", "Python" };

foreach (string language in languages)
{
    Console.WriteLine(language);
}

for문과 foreach문을 사용할 상황에 대한 비교

상황알맞은 것
값만 필요함foreach
몇 번째인지 알아야 함for
요소의 값을 바꿔야 함for
거꾸로 혹은 두 칸씩 건너뛰며 돌아야 함for
배열 두 개를 같은 인덱스로 나란히 다뤄야 함for
전체를 한번 훑는 것이 전부임foreach