조건문과 반복문은 프로그램의 흐름 제어를 위한 기본적인 제어 구조이다. 조건문은 특정 조건에 따라 코드의 실행 여부를 결정하고, 반복문은 조건이 만족될 때까지 코드 블록을 반복 실행한다.
if문은 주어진 조건이 true일 경우, 해당 블록 내의 코드를 실행
if (조건식) {
// 조건이 true일 때 실행되는 코드
}
if문의 조건이 true이면 if 블록의 코드가 실행되고, false이면 else 블록의 코드가 실행
if (조건식) {
// 조건이 true일 때 실행되는 코드
} else {
// 조건이 false일 때 실행되는 코드
}
여러 개의 조건문을 처리하기 위해 if - else if - else 문을 사용한다. 각 조건을 순차적으로 검사하며, 첫 번째로 true인 조건의 블록이 실행되고, 나머지 조건들은 무시된다. 마지막 else 블록은 모든 조건이 false일 때 실행된다.
if (조건식1) {
// 조건식1이 true일 때 실행되는 코드
} else if (조건식2) {
// 조건식2가 true일 때 실행되는 코드
} else {
// 위의 모든 조건이 false일 때 실행되는 코드
}
/*
매개변수 안에 있는 args 를 통해 외부로부터 입력을 받을 수 있다.
arge는 배열의 형태로 선언되어 있어 배열의 형태로 값을 꺼내오면 된다.
여러 값을 넣으려면 숫자 넣고 스페이스를 통해 구분하면 된다.
*/
// if / else if / else
public static void main(String[] args) {
int score = Integer.parseInt(args[0]); // 문자열을 int로 변환 , arge 의 타입이 strong 이기 때문에.
System.out.println(score);
char grade = ' ';
if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
}else if (score >= 70) {
grade = 'C';
}else{
grade = 'D';
}
System.out.println(grade);
}
switch문은 주어진 변수가 어떤 값을 가지느냐에 따라 실행될 코드를 결정한다. 조건문(if)과는 달리, 변수의 값에 따라 분기 처리를 한다.
switch문의 입력 변수 자료형은 byte, short, char, int, enum, String만 가능하다.break 문은 각 case의 마지막에 위치하여, 다음 case 문이 실행되지 않도록 switch문을 빠져나가게 한다.default는 모든 case와 일치하지 않는 경우에 실행된다.Pattern Matching for Switch 적용된 코드 (Java 17 이후)
public String test(Object obj) {
return switch(obj) {
case Integer i -> "An integer";
case String s -> "A string";
case Cat c -> "A Cat"; // Cat이라는 클래스가 선언된 경우
default -> "I don't know what it is";
};
}
JDK 17 이전의 코드
public String test2(Object obj) {
if (obj instanceof Integer) {
return "An integer";
} else if (obj instanceof String) {
return "A string";
} else if (obj instanceof Cat) { // Cat이라는 클래스가 선언된 경우
return "A Cat";
} else {
return "I don't know what it is";
}
}
enum(열거형 타입): enum은 일정한 상수의 집합을 정의하는 참조 자료형이며, Java 5 이후부터 도입되었다.
예제 코드
// switch
public static void main(String[] args) {
int month = Integer.parseInt(args[0]); // 문자열 -> 정수타입으로
String monthString;
switch (month) {
case 1 ->
monthString = "January";
case 2 ->
monthString = "February";
case 3 ->
monthString = "March";
case 4 ->
monthString = "April";
case 5 ->
monthString = "May";
case 6 ->
monthString = "June";
case 7 ->
monthString = "July";
case 8 ->
monthString = "August";
case 9 ->
monthString = "September";
case 10 ->
monthString = "October";
case 11 ->
monthString = "November";
case 12 ->
monthString = "December";
default ->
monthString = "Invalid month"; // 유효하지 않은 범위의 값을 입력받았을 때 예외처리
}
System.out.println(monthString);
}
// switch 연습 예제
public static void main(String[] args) {
String week = "";
switch (args[0]) {
case "월요일":
week = "Start if the work week";
break;
case "금요일":
week = " Almost weekend";
break;
default:
week = "Midweek";
break;
}
System.out.println(week);
}
for문은 일정 횟수만큼 실행문을 반복적으로 수행할 때 사용된다. for문은 초기화, 조건식, 증감식을 포함한 세 가지 부분으로 구성되며, 반복문의 흐름은 초기화 → 조건식 → 실행문 → 증감식 순서로 진행된다.
for (초기화식; 조건문; 증감식) {
// 반복 실행할 코드
}
public static void main(String[] args) {
// for문을 이용해서 1~50까지 출력하기
for(int i = 1; i <= 50; i++){
System.out.println(i);
}
// 1~50 범위 안에서 짝수만 출력
for(int j = 1; j <= 50; j++){
if(j % 2 == 0){
System.out.println(j);
}
}
} public static void main(String[] args) {
// arguments로 입력받은 args 배열 출력하기
for(int k = 0; k < args.length; k++){ // 10 20 30 40 50
System.out.println(args[k]);
}
}[수행 흐름]
true이면 블록이 실행되고, false이면 반복이 종료true일 때 실행되는 코드for each문은 향상된 for문으로, 배열이나 컬렉션과 같은 데이터 구조에서 요소를 하나씩 순회하며 처리할 때 사용된다. 일반 for문보다 코드가 간결하고, 반복 구조의 요소를 직접 참조할 수 있다.
for (자료형 변수명 : iterable) {
// 반복 실행할 코드
}
public static void main(String[] args) {
String[] numbers = {"one", "two", "three", "four"};
for (String number : numbers) { // 선언한 number 변수는 for안에서 사용할 수 있게 된다.
System.out.println(number);
}
}public static void main(String[] args) {
// arguments로 입력받은 args 배열 출력하기
for(int k = 0; k < args.length; k++){ // 10 20 30 40 50
System.out.println(args[k]);
}
System.out.println("*-------------*");
// for each문 변환
for(String arg : args){
System.out.println(arg);
}
}for each문은 Collection 인터페이스를 구현하는 클래스(ArrayList, LinkedList, HashMap 등)에서도 사용할 수 있다.
// java에서 제공해주는 자료 구조 Collection 관련 클래스 사용
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for(Integer i : list){
System.out.println(i);
}
continue문은 반복문 내부에서 사용되어, 블록 내의 남은 코드들을 건너뛰고 다음 반복으로 이동시킨다. 주로 특정 조건을 만족할 때 해당 반복을 건너뛰고 싶을 때 사용한다.
public static void main(String[] args) {
// 0~60까지 숫자 중 3의 배수만 출력하기 (continue 사용)
for (int i = 0; i <= 60; i++) {
int value = i + 1;
if (value % 3 != 0) {
continue;
}
System.out.println(value + " 는 3의 배수");
}
System.out.println("*----------------------*");
// 0~60까지 숫자 중 3의 배수만 출력하기 (continue 사용 X)
for (int j = 0; j <= 60; j++) {
int value = j + 1;
if (value % 3 == 0) {
System.out.println(value + " 는 3의 배수");
}
}
}이중 for문은 for문 내부에 또 다른 for문을 포함하는 중첩 반복문
바깥 for문이 한 번 실행될 때마다, 안쪽 for문은 조건문 횟수만큼 반복된다.
public static void main(String[] args) {
// 이중 for문
// 3번 중에 한번마다 4번씩 돌아감 그래서 총 돌아가는 횟수는 12회
for (int i = 0; i < 3; i++) { // i = 0, 1, 2
for (int j = 0; j < 4; j++) { // j = 0, 1, 2, 3
System.out.println("i = " + i + ", j = " + j);
}
}
// 구구단
for (int i = 2; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.println(i + " * " + j + " = " + i * j);
}
System.out.println("*--------------------*");
}
}while문은 조건식이 true일 동안 계속해서 반복 실행된다.
주로 반복 횟수가 정해져 있지 않고, 특정 조건이 만족될 때까지 반복해야 하는 경우에 사용되며, for문과 같이 break, continue 사용 가능하다.
while (조건문) {
// 반복 실행할 코드
}
조건문: 반복이 계속될 조건을 정의, 조건이 false가 되면 반복이 종료
예제 코드
public static void main(String[] args) {
// while 문 사용하여 1~5까지 출력해보기
int i = 1;
while (i <= 5){
System.out.println(i);
i++;
}
// '10번 찍어 안 넘어가는 나무 없다' 속담을 while 문을 사용하여 출력하기
int j = 1;
while (j <= 10){
System.out.println("나무를 " + j++ + "번 찍었습니다.");
}
System.out.println("나무 넘어갑니다.");
}
break문은 while문을 강제로 종료시킬 때 사용, 반복 중에 특정 조건이 충족되면, 즉시 반복문을 벗어난다.
// break문 사용
int coffee = 10;
int money = 300;
while (money > 0) {
System.out.println("돈을 받았으니 커피를 줍니다.");
coffee--;
System.out.println("남은 커피의 양은 " + coffee + "입니다.");
if (coffee == 0) {
System.out.println("커피가 다 떨어졌습니다. 판매를 중지합니다.");
break;
}
}continue문은 반복문 내에서 특정 조건을 건너뛰고, 다음 반복을 수행하고자 할 때 사용된다.
while문의 경우, continue문을 만나면 조건식으로 돌아가 다음 반복을 시작한다.
// 0 ~ 60까지의 숫자 중 3의 배수만 출력(continue 사용)
int num = 0;
while (num < 60) {
num++;
if (num % 3 != 0) {
continue;
}
System.out.println(num);
}while문과 비슷하지만, 조건문을 뒤에 두어 블록을 먼저 실행한 후 조건식을 평가하기 때문에
최소 한 번은 반드시 실행된다.
// do-while
int k = 0;
do{
k++; // k = 1
System.out.println(k); // k = 1
}while(k < 5); // k = 1로 조건식 체크, true면 do 로 돌아가서 동작 진행, false면 do문 실행이 안되고 빠져나간다.
// do-while 문으로 0~60까지 숫자 중 3 배수 출력해보기
int l = 0;
do{
l++;
if (l % 3 == 0) {
System.out.println(l + "는 3의 배수");
}
}while(l <= 60);true일 경우 블록이 반복된다.continue와 break문을 사용할 수 있으며, 반복을 제어할 수 있다.while문:true일 때만 블록을 실행.false이면 블록이 한 번도 실행되지 않을 수 있다.do-while문:false라도 블록이 한 번은 실행된다.배열은 동일한 자료형의 여러 값을 하나의 변수에 저장할 수 있는 자료 구조. 배열의 각 요소는 인덱스를 사용하여 접근할 수 있으며, 인덱스는 0부터 시작한다.
배열을 선언할 때는 자료형 뒤에 대괄호 []를 붙힌다. 배열을 선언할 때 배열의 크기(길이)를 명시하거나, 값을 바로 할당할 수 있다.
int[] lottoNumbers; // 정수형 배열 선언
int lottoNumbers[]; // 위와 동일한 정수형 배열 선언 방식
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; // 문자열 배열 선언과 초기화
String[] weeks = new String[7]; // 크기가 7인 문자열 배열 선언
배열을 선언한 후에 값을 저장할 수 있다. 배열의 특정 인덱스에 값을 할당하면, 해당 위치에 값이 저장된다.
// String[] 문자열 배열 선언, 값 저장
String[] arrayString = new String[10];
arrayString[0] = "첫 번째";
arrayString[1] = "두 번째";
System.out.println(arrayString[2]); // 값을 할당하지 않은 값을 조회하면 null로 출력된다. (비어있음)
배열을 선언하면서 동시에 초기화할 수도 있다.
// 선언, 초기화(값 저장)
String[] arrayString2 = {"첫 번째", "두 번째"};
System.out.println(arrayString2[0]);
System.out.println(arrayString2[1]);
// System.out.println(arrayString2[2]); // 배열에 존재하지 않는 인덱스로 접근하게 된다면 실행 오류가 뜨면서 강제 종료가 된다.(컴파일 오류X)
System.out.println(arrayString2.length);
배열의 요소에 접근하기 위해서는 인덱스를 사용해야 하며, 배열의 인덱스는 0부터 시작한다.
String[] arrayString2 = {"첫 번째", "두 번째"};
System.out.println(arrayString2[0]); // "첫 번째" 출력
System.out.println(arrayString2[1]); // "두 번째" 출력
System.out.println(arrayString2[2]); // ArrayIndexOutOfBoundsException 발생
인덱스 범위를 벗어난 값에 접근하려고 하면, ArrayIndexOutOfBoundsException 예외가 발생하며 프로그램이 종료된다.
배열의 길이는 length 속성을 사용하여 구할 수 있다. 배열의 길이는 배열에 저장된 요소의 개수를 나타내며, for문을 사용하여 배열의 모든 요소를 순회할 때 유용하다.
// arguments로 입력받은 args 배열 출력하기
for(int k = 0; k < args.length; k++){ // 10 20 30 40 50
System.out.println(args[k]);
}