자바 - 제어문, 조건문, 반복문, 분기문
<목차>
- 제어문(Control Statement)이란?
- 조건문(Conditional Statement)
- 반복문(Loop Statement)
- 분기문(Branching Statement)
- 그 외(for each)
• 제어문(Control Statement)이란?
제어문은 프로그램의 흐름을 제어하고 조건에 따라 코드를 실행하거나 반복하는 데 사용한다.
제어문은 어떤 프로그래밍 언어에서든 가장 중요하다고 보면 된다. 뼈대가 되는 구조 중 하나이며, 다양한 유형들이 존재하기 때문이다.
이전 게시물에서 예시에서도 간간히 사용된 적이 있다.
종류
- 조건문(Conditional Statements)
- 반복문(Loop Statements)
- 분기문(Branching Statement)
• 조건문(Control Statement)
조건문은 프로그램의 실행 흐름을 제어하는 데 주로 사용된다. 조건을 비교해서 평가 후 그 결과에 따라 특정 코드 블록을 실행하거나 스킵하도록 한다. 주요 조건문들은 'if', 'else if', 'else', 'switch'이다.
1. if 문
'if' 문은 가장 기본적인 조건문으로 주어진 조건이 참(True)이면 해당 코드 블록을 실행한다.
2. if - else 문
조건이 참일 때와 거짓일 때 각가 다른 코드 블록을 실행한다.
3. if - else if - else 문
여러 조건을 순차적으로 평가 후 조건에 충족되는 코드 블록을 실행한다.
※ if 문에 들어갈 조건에는 '비교 연산자', 'and', 'or', 'not' 등이 있다.
[비교 연산자]
x < y | x가 y보다 작다 |
x > y | x가 y보다 크다 |
x == y | x와 y가 같다 |
x != y | x와 y는 같지 않다 |
x >= y | x는 y보다 크거나 같다 |
x <= y | x는 y보다 작거나 같다 |
[논리 연산(위에서부터 and, or, not)]
x && y | x와 y 모두 참이어야 참이다 |
x || y | x 또는 y 둘 중 적어도 하나가 참이면 참 |
!x | x가 거짓이면 참 |
이외에도 contains를 이용해서 리스트 자료형에 특정 자료가 있는지 조사하여 참/거짓을 반환할 수 있다.
// if 문
if (조건) {
// 조건이 참일 경우 실행
}
// if-else 문
if (조건) {
// 조건이 참일 때 실행되는 코드
} else {
// 조건이 거짓일 때 실행되는 코드
}
// if-else if-else 문
if (조건1) {
// 조건1이 참일 때 실행 됨
else if (조건2) {
// 조건2가 참일 때 실행 됨
else {
// 모든 조건이 거짓일 때 실행되는 코드
}
4. switch 문
다양한 값에 따라 다른 코드 블록을 실행할 때 사용된다. 특정 변수나 표현식의 값을 평가하고 그 값에 따라 'case' 문 블록을 실행한다.
※ switch 문을 if 문으로 대체 가능하지만 if문을 switch 문으로 대체할 수는 없다.
switch (변수 또는 표현식) {
case 값1 or 조건1:
// 해당 경우에 대한 코드
break;
case 값2:
// 해당 경우에 대한 코드
break;
.
.
.
default:
// 모든 case에 맞지 않을 때 실행되는 코드
}
• 반복문(Loop Statement)
반복문은 특정 조건을 만족하는 동안 코드를 블록을 반복적으로 실행하는 데 사용한다.
반복문은 프로그래밍에서 매우 중요한 구성 요소 중 하나로, 동일한 코드를 여러 번 수행해야 하는 경우 유용하게 사용된다. 주요 반복문은 'for', 'while', 'do-while'이다.
1. for 반복문
for 문은 (초기값; 조건문; 증가치)의 세 부분으로 구성된다. 초기값은 처음 실행될 때 한 번만 실행되고, 조건문은 매 반복 시마다 비교한다. 조건문의 결과가 참(True)인 경우 반복문이 계속 실행된다. 증가치는 각 반복이 끝날 때마다 실행된다.
<예시>
public class sample {
public static void main (String[] args) {
for (int i = 0; i <= 12; i++) {
System.out.println(i); // i가 12가 될때까지 출력된다.
}
}
}
// 증가치가 'i++' 후행이므로 마지막 12를 출력한 뒤 i는 13이 된다.
<예시 - for문과 if문을 사용한 예시>
public class sample {
public static void main (String[] args) {
for (int i = 1; i<= 20; i++) {
if (i%2 == 0) {
System.out.println(i+"는 짝수입니다.");
}
else {
System.out.println(i+"는 홀수입니다.");
}
}
}
}
<예시 - for-continue>
반복문을 실행하고 있는 도중 continue를 만나면 반복문의 처음(조건문)으로 돌아간다.
200보다 작은 값들을 출력하는 예시다.
조건문에서 numbers[i]의 값이 200보다 크면 contiue로 다시 조건문으로 비교하러 간다.
public class sample {
public static void main (String[] args) {
int[] numbers = {25, 13, 7, 30, 49, 70, 125, 512, 55};
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] >= 200) {
continue;
}
System.out.println(numbers[i]);
}
}
}
<결과>
25 13 7 30 49 70 125 55 |
<예시 - 이중 for문>
for문을 여러 개 사용하는 방법도 있다. 대표적인 예시가 구구단이다.
public class sample {
public static void main (String[] args) {
for (int i = 0; i <= 9; i++) {
for (int j = 0; j <= 9; j++) {
System.out.print(i+"*"+j +" = " + i*j+" ");
}
System.out.println("");
}
}
}
2. while 문
while 반복문은 조건이 '참'인 동안에만 계속 코드를 실행한다. 무한 실행(무한 루프)이 될 수 있기 때문에 초기 조건 검사를 꼭 해야 하며, 조건이 거짓이면 코드는 실행되지 않을 수 있다.
<예시 - "7번 죽으면 Game Over">
public class sample {
public static void main (String[] args) {
int life = 7;
while (life >= 1) {
System.out.println("캐릭터가 사망했습니다");
life--;
if (life == 0) {
System.out.println("게임 패배");
}
}
}
}
<결과>
캐릭터가 사망했습니다 캐릭터가 사망했습니다 캐릭터가 사망했습니다 캐릭터가 사망했습니다 캐릭터가 사망했습니다 캐릭터가 사망했습니다 캐릭터가 사망했습니다 게임 패배 |
<예시 - 무한 루프>
임의의 값을 받아 특정 값인 경우 프로그램이 멈추도록 작성했다.
만약 스캐너를 통해서 값을 받아오는 대기 시간 없이 계속해서 프로그램이 실행되면 걷잡을 수 없는 렉이 발생할 수 있다.
프로그래밍을 작성하는 프로그램에 따라 작동 중인 코드를 정지시키는 버튼이 있거나 단축키 컨트롤 c를 누르면 멈추는 기능이 있을 수 있다. 무한 루프에 빠지지 않게 주의해야 한다.
import java.util.Scanner;
public class sample {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("'" + "0"+ "'" + "을 누르면 종료됩니다.");
while (true) { // 무한 루프
System.out.println("아무 정수를 입력하세요.");
int number = sc.nextInt();
if (number == 0) {
System.out.println("프로그램 종료");
break; // 0이 입력되면 while문을 종료한다.
}
}
sc.close();
}
}
중간에 사용된 'break'는 while문을 강제로 중지시켜야 하는 경우 사용되는 키워드다.
<예시 - while-continue : 짝수만 출력>
for문에서도 다뤘던 continue와 사용 방법이 정말 똑같다. 기존의 while문은 참이 아닌 경우 반복문을 종료하였지만 해당 키워드를 사용하면 다시 조건문으로 되돌아가서 반복문을 실행한다.
public class sample {
public static void main (String[] args) {
int i = 1;
while (i <= 30) {
if (i % 2 != 0) {
i++;
continue;
}
System.out.print(i + " ");
i++;
}
}
}
3. do-while 문
'do-while'문은 'while'문과 비슷하지만, 조건문이 코드를 실행 후 확인하여 수행한다. 그렇기 때문에 코드 실행이 최소 한 번은 실행된다. 즉, 코드부터 실행한 후 조건문을 확인한다는 것이다.
<예시>
import java.util.Scanner;
public class sample {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
String str;
do {
System.out.println("임의의 숫자를 입력해주세요.");
int number = sc.nextInt();
System.out.println("입력하신 숫자는 " + number + "입니다.");
System.out.println("계속 하시겠습니까? (y/n)");
str = sc.next();
} while (str.equalsIgnoreCase("y")); // y일 경우(참) 계속 진행
System.out.println("종료");
sc.close();
}
}
• 분기문(Branching Statement)
분기문은 프로그램의 흐름을 변환해 줄 때 사용한다.
반복문에서 나왔던 'for-continue' 또는 'while-continue'에서 사용된 'continue' 또는 'break' 그리고 값을 반환할 때 사용하는 'return' 등이 분기문이다.
• 그 외(for each)
'for each' 반복문은 배열과 컬렉션 타입(리스트, 집합, 맵 등)의 요소를 순회하고 각 요소에 대한 작업을 수행하는 반복문이다. Java 5 버전부터 추가된 기능으로, 코드를 간결하게 작성할 수 있고, 요소에 쉽게 접근할 수 있는 반복문이다.
'for each' 루프를 사용하면 반복자(iterator)를 직접 관리하지 않고도 각 요소를 접근할 수 있다. 그렇기 때문에 코드를 보다 간결하게 작성하여 가독성을 높일 수 있다.
단, 그럼에도 불구하고 for each보다 반복자를 사용해야 하는 경우가 있다.
주의해야 되는 내용으로는 컬렉션의 내용을 수정할 경우 'for each' 문에서는 오류가 발생할 수 있지만, 반복자를 사용하면 안전하게 각 요소를 순회할 수 있다. 각 요소에 대한 수정, 삭제를 하지 않고 읽기 전용으로 사용하는 경우 'for each' 문이 더 가독성과 코드의 간결성을 두고 보면 좋다고 할 수 있다.
이전에 다룬 배열, 리스트, 집합, 맵 등 게시물에서 예시로 다룬 적이 있다.
[참고 - https://bluenoa.tistory.com/81#text5]
자바 - 리스트(List)
리스트란? ArrayList와 LinkedList 제네릭스(Generics) 제네릭스의 특징 리스트와 배열의 차이점 추가내용 • 리스트란? 리스트는 배열과 비슷하지만 좀 더 편의 기능이 많다고 볼 수 있다. 그 차이점은
bluenoa.tistory.com
[참고 - https://bluenoa.tistory.com/82#text3]
자바 - Map, 집합, 상수 집합
맵(Map)이란? Map 인터페이스의 주요 메서드 Map 자료형의 구현 가능한 종류 집합(Set)이란? 집합의 주요 메서드 집합의 종류 상수 집합(Constant Set) • 맵(Map)이란? 맵은 키-값(Key-Value)을 쌍으로 구성되
bluenoa.tistory.com
<예시 - for-each 문>
public class sample {
public static void main (String[] args) {
// 배열 순회
int[] numbers = {1,2,4,6,8,10};
for (int number : numbers) {
System.out.println(number);
}
// 리스트 순회
String[] str = {"겐지", "트레이서", "위도우", "한조", "솜브라"};
List<String> names = new ArrayList<>(Arrays.asList(str));
for (String name : names) {
System.out.println(name);
}
}
}
<결과>
1 2 4 6 8 10 한조 겐지 트레이서 위도우 솜브라 |