0. 들어가기 - 조건문이란?
프로그래밍에서 가장 기초적이면서 중요한 개념으로 조건문이 있다. 조건문이 무엇일까?
조건의 참, 거짓에 따라 서로 다른 작업을 수행할 수 있게 프로그래밍 할 수 있는데, 이러한 개념을 가능하게 해 주는것이 조건문이다. 조건문은 언제 사용할까?
0.1 조건문은 언제 사용할까?
우리가 네이버에 회원가입을 진행하고 있다고 해 보자. 전화번호를 입력하는 란에 깜빡하고 입력하지 않으면 어떻게 될까?
다시말해 개발자는 사용자의 행동에 대한 예외처리를 어떻게 했을까?
입력해야 할 필수 요소를 입력하지 않았기에, 알려주고 입력하라고 표시를 해 준다.
잘못 입력하면 어떻게 될까?
상식적이진 않지만 한글로 써 넣는다고 해 보자. 이때는 다른 문구로 정확하게 썼는지 다시 확인해 보라고 한다.
숫자로 쓰더라도 우리가 휴대폰을 사용하는 형식인 01x-xxxx-xxxx를 벗어나면 문구를 띄워준다.
예외 처리가 1) 공란인 경우, 2) 입력값이 형식에 맞지 않는 경우 두 가지가 있는 것이다.
모든 사용자가 상식적인 행위를 할 리가 없다. 개발자가 생각하는 상식적인 행동에 대한 범위도 보편적일 수 없다.
그렇기에 개발자는 가능한 모든 경우의 수를 파악하고, 해당 내용에 대한 대처를 프로그래밍 해 놓아야 한다.
예외 처리를 위한 구문도 있지만 가장 기초적이고 쉬운 방법으로 조건문을 사용한다.
0.2 조건문의 종류
조건문은 If문, switch문 두 가지이다. c언어와 사용법이 같다.
Java 14부터는 switch문을 더 발전시킨 switch expression이라는 새로운 switch문이 나와 사용할 수 있다.
1. If문
IF문의 기본 문법
if(조건식){
수행문;
} else if(조건식){
수행문;
} else{
수행문;
}
1. 먼저 if(조건식) 괄호 안에 조건식을 넣는다. 조건식은 비교 연산이나 논리 연산이 혼합된 식으로 구성된다.
조건식의 결과는 true or false인 boolean값이므로, 조건식 대신 true or false를 기입할 수는 있겠으나(c와 다르게 Java에서 boolean 타입에 숫자는 올 수 없다), 그럼 사용하는 의미가 없겠다.
2. 조건식 뒤부터 수행문 종료시점까지를 중괄호로 묶어주고 이 중괄호 안쪽 부분이 조건식이 참일 때 수행하는 부분이다. 수행문이 한 문장일 때는 생략할 수 있으나, 가독성이 좋게 무조건 중괄호를 치는 습관을 들이자.
예 : 90점 이상이면 A를 출력하는 코드를 작성해 볼 수 있다.
int score = 100;
if(score >= 90){
System.out.println("A맞았다~");
}
필수 사항은 여기까지이며, 여기서 조건이 맞지 않을 때 추가로 행동하고 싶은 것이 있다면 else를 사용한다.
닫힌 중괄호 뒤에서 else를 써 주고 else상황에서 수행할 내용을 중괄호로 또 묶어주면 된다.
예를 들어 90점 이상이면 A, 90점 미만이면 탈락이라고 출력하는 코드를 작성해 보자.
int score = 85;
if(score >= 90){
System.out.println("A맞았다~");
} else{
System.out.println("너...낙제");
}
여기서 는 score가 85점이므로 탈락이 출력된다.
하지만 공부 안하고 술만 마신 20점과 그래도 공부한 85점을 같이 낙제시키는건 너무 억울하다. 세상에 A만있고 B,C,D는 어디 갔는가? 조건식이 더 필요하다.
이런 상황에서 우리는 else if를 사용할 수 있다.
int score = 75;
if(score >= 90){
System.out.println("A맞았다~");
} else if(score >= 80){
System.out.println("B맞았다");
} else if(score >= 70){
System.out.println("어 C");
} else if(score >= 60){
System.out.println("D는 재수강 하자");
} else{
System.out.println("넌 나가라");
}
이러면 위에서부터 90 이상이 아니라면(if 조건문) 다음 조건문으로 내려오고, 다음 조건문이 아니라면(80도 안돼?) 그다음... 아무 조건문에도 해당되지 않았다면 마지막 else문을 수행한다.
어떤 조건식이든 true가 되어 해당 실행문을 실행했다면 조건문을 빠져나가 다른 조건문은 실행하지 않는다.
여기서 else if와 else는 필수가 아니기에, 쓰지 않아도 문법적 오류는 아니다. 낙제점을 받은 학생은 문구를 출력받을 자격도 없다면 else문을 쓰지 않아도 된다. 그러면 그냥 아무 조건에도 부합하지 않아 실행문을 실행하지 않을 것이다. 하지만 웬만하면 else는 있는게 좋겠다고 생각이 들 것이다.
2. Switch문
switch문은 if-else문이 반복되는 상황일 때 복잡하고 번거롭게 작성하는 부분을 가독성 좋게 만든 것이다.
복잡한 조건식 대신 비교 조건이 특정한 단일 값, 또는 문자열로 표현될 때 switch-case 문을 사용할 수 있다.
2.1 switch문의 기본 문법
switch (식){
case 값1:
실행 문장1;
break;
case 값2:
실행 문장2;
break;
default:
실행 문장n;
}
switch() 괄호 안에 들어오는 식의 값과 일치하는 case문으로 분기하고, 거기서부터 실행 문장을 수행한다.
여기서 switch문을 탈출하는 break가 없다면 다음 case의 문장이라고 스킵하지 않고 실행문장들을 다 수행한다.
원하는 문장만 실행하게 각 case마다 마지막에 break를 배치해 탈출할 수 있도록 하자.
아무 case와도 일치하지 않는 경우 default문을 수행한다.
여기서 주의할 점은 switch()괄호 안에는 조건식이기 때문에 변수가 들어갈 수 있지만
case 옆에는 변수가 들어갈 수 없고 정수, 문자,문자열 리터럴값이 와야 한다. 변수를 사용한다면
case expressions must be constant expressions
라는 오류 메시지를 볼 수 있다. 문자열 또한 변수를 통한 표현이 아닌 값으로 쓴다면 사용할 수 있다.
3. Switch Expression (새로운 switch문)
Java 14부터는 향상된 switch문인 switch expression을 사용할 수 있다.
일단 귀찮게 매번 써줘야 했던 break가 없어지고 대신 ->와 yield 키워드가 도입됐다.
switch문 자체의 리턴값을 받을 수 있는데, 이를 함수의 return처럼 yield를 통해 받거나 간단하게 ->로 받을 수 있다.
case가 많은 경우 표현이 귀찮아서 이럴거면 if문을 쓰지 싶을때가 있다. 예를 들어 case가 12달이고 각 달마다 끝나는 날짜를 표현하고 싶은 경우, 끝나는 날짜가 31인 case는 1, 3, 5, 7, 8, 10, 12월이다. 이를 기존 switch문으로 써보면
int month = 10;
int day;
switch(month){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
day = 31;
break;
case 4: case 6: case 9: case 11:
day = 30;
break;
case 2:
day = 28;
break;
default:
day = 0;
System.out.println("존재하지 않는 달 입니다.");
}
System.out.println(month + "월은 " + day + "일입니다.");
이렇게 귀찮고 길게 나온다.
이걸 새로운 switch문으로 써 보면
int month = 3;
int day = switch (month) {
case 1, 3, 5, 7, 8, 10,12 -> {
System.out.println("한 달은 31일입니다.");
yield 31;
}
case 4,6,9,11 -> {
System.out.println("한 달은 30일입니다.");
yield 30;
}
case 2 ->{
System.out.println("한 달은 28일입니다.");
yield 28;
}
default->{
System.out.println("존재하지 않는 달 입니다.");
yield 0;
}
};
System.out.println(month + "월은 " + day + "일입니다.");
여기서 yield는 블록 안에서만 사용할 수 있으며, 실행 문장이 반환만 있는 경우 화살표 옆에 값만 써 주면 된다.
case 1, 3, 5, 7, 8, 10,12 -> 31; // 반환만 할래
3.1 yield 특이점
자바에서 예약어는 변수명으로 사용할 수 없다. 하지만 yield는 가능하다.
int month = 4;
int yield = 2;
int day = switch (month) {
case 1, 3, 5, 7, 8, 10,12 -> 31;
case 4,6,9,11 -> {
System.out.println("한 달은 30일입니다.");
yield += 2;
yield 30;
}
case 2 ->{
System.out.println("한 달은 28일입니다.");
yield 28;
}
default->{
System.out.println("존재하지 않는 달 입니다.");
yield 0;
}
};
System.out.println(yield);
놀랍게도 이런 형태로 쓰는 경우도 가능했다. 출력값은 4로 잘 나온다.
반환의 형태로 yield 값; 을 사용하는 경우만 명령어로 처리하는 듯 하다.
'개발 > Java' 카테고리의 다른 글
[Java] Scanner 스캐너는 왜 close()를 해야 할까? (0) | 2023.07.25 |
---|---|
[Java]자바의 반복문 (0) | 2023.07.21 |
[Java]자바의 연산자 (0) | 2023.07.19 |
[Java] 자바의 기본 자료형(primitive types 원시 자료형) (0) | 2023.07.18 |
[안드로이드 스튜디오] View뷰가 뭐야? 레이아웃은 뭐야? 빠르게 보자 (1) | 2023.06.09 |