반복제어, 배열(1차원배열)
20260930 반복제어, 배열(1차원배열)
반복 제어
반복문에서 반복문을 중간에 끝내야 하거나 건너뛰어야 하는 상황에서 사용
- break : 반복문을 즉시 끝냄
- continue : 이번 회차의 남아있는 코드를 건너뛰고 다음 회차로 넘어감
break
반복을 즉시 끝냄
- 보통 반복을 진행하면서 달성하고자 하는 것을 달성하면 해당 반복을 종료할 때 사용
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}");
무한 루프에서 조건을 만족하면 빠져나가도록 할 때도 사용
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} 턴에 잔액이 다 떨어짐");
중첩 반복에서는 하나만 끝냄
// 반복문안의 반복문 예시
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("전부 종료");
중첩문을 한번에 빠져나가게끔 만들 수 도있다
// 예시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 이전 코드는 실행.
using System;
for (int i = 1; i <= 4; i++)
{
Console.WriteLine($"{i} 회차 시작");
if (i == 2)
{
Console.WriteLine(" 건너뜀");
continue;
}
Console.WriteLine($"{i} 회차 끝");
}
반복중 처리할 수 없는값이 발생할 경우 건너뛰는데 사용하기도 한다
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에서 사용할 때 잘못 사용하게 될 경우 의도치 안게 무한루프에 빠질 수 도있다.
// 의도치 않은 무한루프 예시
// 실행하면 끝나지 않음
using System;
int i = 0;
while (i < 10)
{
if (i % 2 == 0)
{
continue; // i 가 0 인 채로 계속 돌아옴
}
Console.Write($"{i} ");
i++;
}
goto 문법은 존재하나 사용하지 않는것이 좋다.
배열(1차원 배열)
같은 타입의 값 여러 개를 하나의 이름으로 묶어 두는 것
// 예시
// 예를들어 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 타입[갯수] 혹은 데이더형[] 변수 = {값, 값, 값}) 보통은 선언과 생성을 한줄에 적는다.
// 배열 생성 예시
using System;
int[] numbers = new int[5];
Console.WriteLine($"칸 개수: {numbers.Length}");
배열 선언시 타입별 기본값
| 타입 | 기본값 |
|---|---|
| int, long, short, byte | 0 |
| float, double, decimal | 0 |
| bool | false |
| char | \0(아무것도 없는 문자) |
| string | 값이 없음을 뜻하는 상태 |
index
인덱스가 범위를 벗어나면 컴파일에는 오류가 안나지만 실행중 오류가 발생하며 프로그램이 멈춘다
// 예시
using System;
int[] numbers = new int[3]; // 유효한 인덱스는 0, 1, 2
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40; // 실행 중 오류
Console.WriteLine("여기까지 오지 못함");
선언과 동시에 값 넣기
배열 생성방법
// 방법 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문에서 가져오는 변수에는 할당이 불가능 하기 때문에 읽을 때만 사용하는 것이 좋다.
//예시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 |



