do-while 문이란? while 문과 비슷하지만, 조건에 상관 없이 무조건 한 번은 코드를 실행한다.
do-while 구조 do { // 코드 } while (조건식) ;
while 예제 코드)
package loop;
public class DoWhile1 {
public static void main(String[] args) {
int i = 10;
while (i < 3) {
System.out.println("현재 숫자는 : " + i);
i++;
}
}
}
실행 결과)
# i = 10 이기 때문에 while ( i < 3) 조건식은 거짓이 되기 때문에 아무것도 출력되지 않는다.
Dowhile 예제 코드)
package loop;
public class DoWhile2 {
public static void main(String[] args) {
int i = 10;
do {
System.out.println("현재 숫자는 : " + i);
i++;
} while (i < 3);
}
}
실행 결과)
# do-while 문은 최초 한 번은 항상 실행된다. 따라서 먼저 현재 숫자는 : 10이 출력된다.
# 코드 블럭 실행 후 조건식을 검증하는데, i = 10 이기 때문에 while ( i < 3) 조건식은 거짓이 되어 do-while 문 탈출!
문제 : 1부터 하나씩 증가하는 수를 3번 더해라 (1 ~ 3더하기) 1부터 하나씩 증가하는 수이기 때문에 1 + 2 + 3 을 더해야 한다. while 문 사용하지 않고 풀어보자.
문제 코드)
package loop;
public class While2_1 {
public static void main(String[] args) {
int sum = 0;
sum = sum + 1; // sum(0) + 1 > sum(1)
System.out.println("i = " + 1 + ", sum = " + sum);
sum = sum + 2; // sum(1) + 2 > sum(3)
System.out.println("i = " + 2 + ", sum = " + sum);
sum = sum + 3; // sum(3) + 3 > sum(6)
System.out.println("i = " + 3 + ", sum = " + sum);
}
}
실행 결과)
# 코드의 정답은 맞으나 개선할 점이 보이며, 변경에 유연하지 않다.
# 0부터 하나씩 증가하는 수를 3번 더해라 (10 ~ 12 더하기)로 요구사항이 변경될 경우 10 + 11 + 12 계산을 해야하나 코드를 너무 많이 변경해야 한다는 문제가 있다.
문제 :i 부터 하나씩 증가하는 수를 3번 더해라 (i ~ i + 2 더하기) 변수 = i 변수를 사용해서 더 변경하기 쉬운 코드로 만들자.
문제 코드)
package loop;
public class While2_2 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
sum = sum + i; //sum(0) + i(1) > sum(1)
System.out.println(" i = " + i + ", sum = " + sum);
i++; //i=2
sum = sum + i; //sum(1) + i(2) > sum(3)
System.out.println(" i = " + i + ", sum = " + sum);
i++; //i=3
sum = sum + i; //sum(3) + i(3) > sum(1)
System.out.println(" i = " + i + ", sum = " + sum);
}
}
실행 결과)
# 변수 i를 사용한 덕에 i의 값만 변경하면 나머지 코드는 변경하지 않아도 된다.
# i=10 으로 변경하면 다른 코드 변경 없이 10 + 11 + 12 문데도 바로 풀 수 있다.
※ 좋은 코드인지 아닌지는 변경 사항이 발생했을 때 알 수 있다. 변경사항 발생 시 변경 부분이 적을수록 좋은 코드!
새로운 변경사항 등장! 기존 문제 : i부터 하나씩 증가하는 수를 3번 더해라 ( i ~ i+2 더하기) 새로운 문제 : i 부터 하나씩 증가하는 수를 endNum(마지막 수)까지 더해라 ( i ~ endNum 더하기) ● i = 1, endNum = 3 이면, 1 ~ 3 까지 총 3번 더해야한다. ● i = 1, endNum = 10 이면, 1 ~ 10 까지 총 10번 더해야한다. ● i = 10, endNum = 12 이면, 10 ~ 12 까지 총 3번 더해야한다. i=1, endNum=3 으로 문제를 풀자
문제 코드)
package loop;
public class While2_3 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
int endNum = 3;
sum = sum + i;
System.out.println("i = " + i + ", sum = " + sum);
i++;
sum = sum + i;
System.out.println("i = " + i + ", sum = " + sum);
i++;
sum = sum + i;
System.out.println("i = " + i + ", sum = " + sum);
i++;
}
}
실행 결과)
# i = 1, endNum=3 이므로 다음 코드를 총 3번 반복해야 한다.
# i = 1, endNum=10 와 같이 변경하면 해당 코드를 총 10번 반복해야 하므로 코드를 더 많이 추가해야 한다.
# 이 문제를 제대로 풀기 위해서는 코드가 실행되는 횟수를 유연하게 변경할 수 있도록 해야한다.
while 문을 사용한 문제 코드)
package loop;
public class While2_4 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
int endNum = 10;
while (i <= endNum) {
sum = sum + i;
System.out.println("i=" + i + ", sum=" + sum);
i++;
}
}
}
문제 : 평점에 따른 영화 추천하기 요청한 평점 이상의 영화를 찾아 추천하는 프로그램 작성 ● 어바웃타임 : 평점 9점 ● 토이스토리 : 평점 8점 ● 고질라 : 평점 7점 평점 변수는 double rating을 사용, if문 활용하자
문제 코드)
package cond.ex;
public class MovieRateEx {
public static void main(String[] args) {
double rating = 7;
if (rating <= 9) {
System.out.println("'어바웃타임'을 추천합니다.");
}
if (rating <= 8) {
System.out.println("'토이스토리'을 추천합니다.");
}
if (rating <= 7) {
System.out.println("'고질라'을 추천합니다.");
}
}
}
출력 결과)
문제 : 학점에 따른 성취도 출력하기 String grade 라는 문자열을 만들고, 학점에 따라 성취도를 출력하는 프로그램을 작성하자. ● "A" : "탁원할 성과입니다!" ● "B" : "좋은 성과입니다!" ● "C" : "준수한 성과입니다!" ● "D" : "향상이 필요합니다." ● "F" : "불합격입니다." ● 나머지 : "잘못된 학점입니다." switch문을 사용해서 문제를 해결하자
문제 코드)
package cond.ex;
public class GradeSwitchEx {
public static void main(String[] args) {
String grade = "A";
switch(grade) {
case "A":
System.out.println("탁원할 성과입니다!");
break;
case "B":
System.out.println("좋은 성과입니다!");
break;
case "C":
System.out.println("준수한 성과입니다!");
break;
case "D":
System.out.println("향상이 필요합니다.");
break;
case "F":
System.out.println("불합격 입니다.");
break;
default:
System.out.println("잘못된 학점입니다.");
}
}
}
실행 결과)
문제 : 더 큰 숫자 찾기 두개의 정부 변수 a 와 b를 가지고 있다. a 의 값은 10 이고, b 의 값은 20 이다. 삼항 연산자를 사용하여 두 숫자 중 더 큰 숫자를 출력하는 코드를 작성하자.
문제 코드)
package cond.ex;
public class CondOpEx {
public static void main(String[] args) {
int a = 10;
int b = 20;
int max = (a > b) ? a : b;
System.out.println("더 큰 숫자는 " + max + "입니다.");
}
}
실행 결과)
문제 : 홀수 짝수 찾기 정수 x 가 주어진 후 x가 짝수이면 "짝수", x가 홀수이면 "홀수"를 출력하는 프로그램을 작성하자 상항 연산자 사용 필요 ※ 나머지 연산자를 사용하면 쉽게 계산할 수 있다.
문제 풀이)
package cond.ex;
public class EvenOddEx {
public static void main(String[] args) {
int x = 10;
String result = (x % 2 == 0) ? "짝수" : "홀수";
System.out.println("출력 : x = " + x + ", " + result );
}
}
문제 : 학점 계산하기 학생의 점수를 기반으로 학점을 출력하는 자바 프로그램 작성 ● 90점 이상 : "A" ● 80점 이상 90점 미만 : "B" ● 70점 이상 80점 미만 : "C" ● 60점 이상 70점 미만 : "D" ● 60점 미만 : "F" 점수는 변수(int score)로 지정
문제 코드)
package cond.ex;
public class ScoreEx {
public static void main(String[] args) {
int score = 99;
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("학점은 F입니다.");
}
}
}
실행결과)
문제 : 거리에 따른 운송 수단 선택하기 주어진 거리에 따라 가장 적합한 운송 수단을 선택하는 프로그램을 작성하자 ● 거리가 1km 이하면 : "도보" ● 거리가 10km 이하면 : "자전거" ● 거리가 100km 이하면 : "자동차" ● 거리가 100km 초과이면 : "비행기" 거리 변수(int distance)로 지정 후 해당 변수를 기반으로 운송 수단 출력
문제 코드)
package cond.ex;
public class DistanceEx {
public static void main(String[] args) {
int distance = 105;
if (distance <= 1) {
System.out.println("도보");
} else if (distance <= 10) {
System.out.println("자전거");
} else if (distance <= 100) {
System.out.println("자동차");
} else {
System.out.println("비행기");
}
}
}
소스 결과)
문제 : 환율계산기 특정 금액을 미국 달러에서 한국 원으로 변환하는 프로그램을 작성하자. 환율은 1달러당 1300원이라 가정. ● 달러가 0미만이면 : "잘못된 금액입니다." ● 달러가 0일 떄 : "환전할 금액이 없습니다." ● 달러가 0 초과일 때 : "환전 금액은 (계산된 원화 금액)원 입니다." 금액은 변수 (int dollar)로 지정하고, 해당 변수를 깁나으로 한국 원으로 환전 금액 출력
문제 코드)
package cond.ex;
public class ExchangeRateEx {
public static void main(String[] args) {
int dollar = 77;
if (dollar < 0 ) {
System.out.println("잘못된 금액입니다.");
} else if (dollar ==0) {
System.out.println("환전할 금액이 없습니다.");
} else {
int won = dollar * 1300;
System.out.println("환전 금액은 " + won + "원 입니다.");
}
}
}
문제 회원 등급에 따라 다른 쿠폰을 발급하는 프로그램을 만들어보자 이 프로그램은 int grade라는 변수를 사용하며, 회원등급(grade)에 따라 아래 쿠폰을 발급해야 한다. ● 1등급 : 쿠폰 1000 ● 2등급 : 쿠폰 2000 ● 3등급 : 쿠폰 3000 ● 위 등급이 아닌 경우 : 쿠폰 500
각 쿠폰이 발급된 후에는 "발급받은 쿠폰" + 쿠폰값 을 출력해야 한다. 2등급 사용자 출력
if문 사용한 문제 코드)
package cond;
public class switch1 {
public static void main(String[] args) {
int grade = 2;
int coupon;
if (grade == 1) {
coupon = 1000;
} else if (grade == 2) {
coupon = 2000;
} else if (grade ==3) {
coupon = 3000;
} else {
coupon = 500;
}
System.out.println("발급받은 쿠폰 : " + coupon);
}
}
실행 결과)
switch 문이란? if문을 조금 더 편리하게 시용할 수 있는 기능이다. if 문은 비교 연산자를 사용할 수 있지만, switch 문은 단순히 값이 같은지만 비교할수 있다.
- switch 문 예시
switch (조건식) { case value1: // 조건식의 결과 값이 value1일 때 실행되는 코드 break; case value2: // 조건식의 결과 값이 value2일 때 실행되는 코드 break; default: // 조건식의 결과 값이 위의 어떤 값에도 해당하지 않을 때 실행되는 코드 }
조건식의 결과 값이 어떤 case의 값과 일치하면 해당 case의 코드를 실행한다.
break 문은 현재 실행 중인 코드를 끝내고 switch 문을 빠져나가게 하는 역할을 한다.
만약 break 문이 없으면, 일치하는 case 이후의 모든 case 코드들이 순서대로 실행된디. (무한반복..)
default 는 조건식의 결과값이 모든 case 의 값과 일치하지 않을 때 실행된다. if 문의 else와 같다. default 구문은 선택으로 반드시 포함할 필요는 없다. 단 모든 경우를 처리하고 싶을 때 사용 필요
if, else-if, else 구조와 동일하다.
기존 문제 switch문 변경 코드)
package cond;
public class switch2 {
public static void main(String[] args) {
int grade = 2;
int coupon;
switch(grade) {
case 1:
coupon = 1000;
break;
case 2:
coupon = 2000;
break;
case 3:
coupon = 3000;
break;
default:
coupon = 500;
break;
}
System.out.println("발급받은 쿠폰 : " + coupon);
}
}
결과 출력)
※ break 문이 없으면?
break문이 없으면 어떻게 되는지 조건 변경!
2등급도 3등급과 같이 3000원 쿠폰을 준다고 가정해보자.
문제 코드)
package cond;
public class switch3 {
public static void main(String[] args) {
int grade = 2;
int coupon;
switch (grade) {
case 1:
coupon = 1000;
break;
case 2:
case 3:
coupon = 3000;
break;
default:
coupon = 500;
break;
}
System.out.println("발급받을 쿠폰 : " + coupon);
}
}
실행 결과)
grade가 2 등급이면 case2가 실행된다.
case2 에는 break 문이 없다. 그러면 중단하지 않고 바로 다음에 있는 case 3의 코드를 실행한다. 여기서 coupon = 3000; 을 수행하고 break 문을 만나 switch 문을 빠져나간다.
"발급받은 쿠폰 3000" 이 출력된다.
■ if문 vs switch문
switch 문의 조건식을 넣는 부분을 살펴보면 x > 10 과 같은 참, 거짓의 결과가 나오는 조건이 아닌 단순 값만 넣을 수 있다.
switch 문은 조건식이 특정 case 와 같은지만 체크할 수 있다. 즉 값이 같은지 확인하는 연산만 가능하다. (문자열 가능)
if 문은 참 거짓의 결과가 나오는 조건식을 자유롭게 적을 수 있다. 예) x > 10, x == 10
※ swich 문 없이 if 문만 사용해도 되나 특정 값에 따라 코드를 실행할 때는
switch 문이 if 문보다 간결한 코드 작성이 가능하다
# if 문
- 복잡한 조건을 자룰 때 유용
- 다양한 비교 연산자와 논리 연산자 사용 가능
- 다양한 데이터 타입 처리 가능
# switch 문
- 단일 변수의 여러 값을 비교할 때 유용
- 가독성이 좋고, 명확하게 구분되는 값에 대해 처리할 때 적합
- 정수, 문자열, 문자 등의 특정 타입에 대해 사용 가능
■ 새로운 switch 문
# 자바 14부터 새로운 switch 문이 정식 도입되었다.
예제 코드)
package cond;
public class switch3 {
public static void main(String[] args) {
int grade = 3;
int coupon = switch (grade) {
case 1 -> 1000;
case 2 -> 2000;
case 3 -> 3000;
default -> 500;
};
System.out.println("발급받을 쿠폰 : " + coupon);
}
}
문제 연령에 따라 다른 메시지를 출력하는 프로그램을 작성해야 한다. int, age라는 변수를 사용해야 하며 연령에 따라 다음의 출력을 해야한다.
● 7세 이하일 경우 : "미취학" ● 8세 이상 13세 이하일 경우 : "초등학생" ● 14세 이상 16세 이하일 경우 : "중학생" ● 17세 이상 19시 이하일 경우 : "고등학생" ● 20세 이상일 경우 : "성인"
예제 코드)
package cond;
public class If3 {
public static void main(String[] args) {
int age = 14;
if(age <= 7) { //미취학
System.out.println("미취학");
}
if(age >= 8 && age <= 13) { // 8~13 : 초등학생
System.out.println("초등학생");
}
if(age >= 14 && age <= 16) { // 14~16 : 중학생
System.out.println("중학생");
}
if(age >= 17 && age <= 19) { // 17~19 : 고등학생
System.out.println("고등학생");
}
if(age >= 20) { // 20이상 : 성인
System.out.println("성인");
}
}
}
실형 결과)
# 위 코드는 단점이 있다.
불필요한 조건 검사 : 이미 조건을 만족해도 불필요한 다음 조건을 계속 검사한다. 예를 들어 나이가 5살이라면 미취학이 출력된다. 하지만 나머지 if 문을 통한 조건 검사도 모두 실행해야 한다.
코드 효율성 : 8살인 초등학생이라면 미취학을 체크하는 조건인 age <= 7을 통해 나이가 8살이 넘는걸 알 수 있다. 하지만 age >= 8 && age <= 13 이라는 2가지 조건을 모두 수행한다. 여기서 age >= 8 이라는 조건은 앞의 age <= 7이라는 조건과 관련 있으며, 결과적으로 조건을 중복 체크한 것이다.
※ 이런 코드에 else if 를 사용해서 불필요한 조건 검사를 피하고 코드 효율성을 높일 수 있다.
- else if
else if문 이란? if 문의 조건이 거짓일 때 다음 조건을 검사한다. 만약 앞선 if 문이 참이라면 else if를 실행하지 않는다.
- else if 코드
if (condition1) { // 조건 1이 참일 때 실행되는 코드 } else if (condition2) { // 조건 1이 거짓이고, 조건 2가 참일 때 실행되는 코드 } else if (condition3) { // 조건 2이 거짓이고, 조건3이 참일 때 실행되는 코드 } else { // 모든 조건이 거짓일 때 실행되는 코드 }
# 쉽게 생각해서 전체 if문을 하나로 묶는다고 보면 된다.
특정 조건이 만족하면 해당 코드를 실행하고 if 문 전체를 빠져나온다.
특정 조건을 만족하지 않으면 다음 조건을 검사힌다.
※ 핵심은 순서대로 맞는 조건을 찾아보고, 맞는 조건이 있으면 1개만 실행되는 것이다.
- else 생략 코드
if (condition1) { // 조건1이 참일 때 실행되는 코드 } else if (condition2) { // 조건1이 거짓이고, 조건2가 참일 때 실행되는 코드 }
else if를 사용한 예제 코드)
package cond;
public class if4 {
public static void main(String[] args) {
int age = 18;
if(age <= 7) { // ~7 : 미취학
System.out.println("미취학");
} else if (age <= 13) { // 8~13 : 초등학생
System.out.println("초등학생");
} else if (age <= 16) { //14~16 : 중학생
System.out.println("중학생");
} else if (age <= 19) { // 17~19 : 고등학생
System.out.println("고등학생");
} else { // 20~ : 성인
System.out.println("성인");
}
}
}
if문이란? if문은 특정 조건이 참인지 확인하고, 그 조건이 참(true)일 경우 특정 코드 블록을 실행한다.
if (condition) { // 조검이 참일 때 실행되는 코드 }
※ 코드 블록 : { } (중괄호) 사이에 있는 코드
예제 코드)
package cond;
public class If1 {
public static void main(String[] args) {
int age = 20; // 사용자 나이
if (age >= 18) { // age의 값은 20으로 조건이 참이다.
System.out.println("성인입니다."); // if문에 있는 코드 블록 실행
}
if (age < 18) { // age값이 20으로 조건이 거짓이다.
System.out.println("미성년자입니다."); // 해당 블록 미실행
}
}
}
실행 결과)
- else문
else 문이란? if문에서 만족하는 조건이 없을 때 실행하는 코드를 제공한다.
if (condition) { // 조건이 참일 때 실행되는 코드 } else { // 만족하는 조건이 없을 때 실행되는 코드 }
- else 문을 사용하면 앞서 진행헀던 코드를 더 간략하게 바꿀 수 있다.
기존 : 만약 18살 이상이면 "성인입니다"를 출력하고, 만약 18살 미만이면 "미성년자입니다."를 출력한다
변경 : 만약 18살 이상이면 "성인입니다."를 출력하고 그렇지 않으면 "미성년자입니다."를 출력한다.
예제 코드)
package cond;
public class If2 {
public static void main(String[] args) {
int age = 20; // 사용자 나이
if (age >= 18) {
System.out.println("성인입니다."); // 조건이 참일 때
} else {
System.out.println("미성년자입니다.");
}
}
}