2023.02.20 18일차 Java
18일차
변수, 연산자, String의 메소드를 배웠다. 간단한문제
프로그래머스
4. 제어문
흐름을 제어한다 제어문
실행흐름이 이어나갈수도 있고 빠져나갈수도있다.
그래서 branch 조건문 분기문이라고도한다.
4.2 if문
if : 조건문(분기문)
if 코드 블럭의 명령문이 하나면 {} 생략 가능하지만 생략 하지 말자
System.out.println("이전 실행문");
if (false) {
System.out.println("실행문1");
}
System.out.println("실행문2");
if (false)
System.out.println("실행문3");
System.out.println("실행문4");4.3 else
if의 조건이 false 일 경우실행되는 블럭
else 코드블럭의 명령문이 하나면 {} 생략가능하지만 꼭쓰자
public class C02Else {
public static void main(String[] args) {
//else
//if의 조건이 false 일 경우실행되는 블럭
System.out.println("코드 실행 1");
if(false) {
System.out.println("코드 실행 2");
System.out.println("코드 실행 3");
} else {
System.out.println("코드 실행 4");
System.out.println("코드 실행 5");
}
System.out.println("실행 흐름 이어감");
}
}4.4 else if
조건이 여러개일때 사용 여러개 작성가능 위에서부터 확인하다가 true를 만나면 실행하고 흐름을 빠져나감
public class C03ElisIf {
public static void main(String[] args) {
// else if
// 위 if (else if)의 조건이 false이면 다른 조건 확인
System.out.println("code 1");
if (false) {
System.out.println("code 2");
} else if (true) {
System.out.println("code 3");
}
System.out.println("실행 이어감...");
}
}4.4.1 Math.random()
0 <= Math.random() < 1의 double값 리턴
ex. 0,1,2
int res1 = (int) (Math.random() * 3); 0~2
ex. 1,2,3
int res2 = ((int) (Math.random() * 3)) + 1; 0~2에서 +1 해준다.
로또 번호 1~45
int res3 = (int) (Math.random() * 45) + 1;4.4.2 중첩 if문
여러단계로 중첩되는 경우가 많아서 코드의 실행흐름을 잘 이애할 필요가 있다.
public class IfNestedExample {
public static void main(String[] args) {
int score = (int) (Math.random() * 20) + 81;
System.out.println("점수: " + score);
String grade;
if (score >= 90) {
if (score >= 95) {
grade = "A+";
} else {
grade = "A";
}
} else {
if (score >= 85) {
grade = "B+";
} else {
grade = "B";
}
}
System.out.println("학점: " + grade);
}
}4.5 Switch
switch에 있는 변수값에 따라서 순서대로 실행한다.
값에 따라 실행 흐름을 변경할 때 사용한다.
switch (변수) case (값)
switch안의 변수와 case의 값들을 비교해나감
무조건 위에서부터 확인해나감 break문을 만날때까지 실행함
다 아니라면 default문을 출력하게 할 수 있다. else와 같은 느낌
public class C01Switch {
public static void main(String[] args) {
System.out.println("이전 실행문...");
switch (2) {
case 1:
System.out.println("code 1");
break;
case 2:
System.out.println("code 2");
break;
case 3:
System.out.println("code 3");
break;
default:
System.out.println("code 4");
}
System.out.println("다음 흐름...");
}
}-> 이전 실행문... / code2 / 다음 흐름...
if문으로도 작성가능하다.
if (var1 == 1){
...
} else if(var1 == 2 ) {...}실수로 break;문을 빠뜨리면 case에 값이 일치하는 곳부터 실행한다.
switch (2) {
case 1:
System.out.println("code 1");
case 2:
System.out.println("code 2");
case 3:
System.out.println("code 3");
default:
System.out.println("code 4");
}
System.out.println("다음 흐름...");이전 실행문... / code2 /code3 / 다음 흐름...
break;문을 잘 신경써주되 의도한 것이라면 사용해도 된다.
4.5.2 swtich labeled statement
break없이 코드블럭 작성가능하다. -> {} 중괄호로 묶어서 사용
state문이 하나라면 {}생략도 할 수 있다.
자바 12부터 사용가능하다.
public class C04Switch {
public static void main(String[] args) {
int val = 4;
switch (val) {
case 1:
System.out.println("code 1");
break;
case 2:
System.out.println("code 2");
break;
case 3:
case 4:
System.out.println("code 3, 4");
break;
default:
System.out.println("default code");
break;
}
switch (val) {
case 1 -> System.out.println("code 1"); // 명령문 하나일 때 중괄호 생략 가능
case 2 -> {
System.out.println("code 2");
}
case 3, 4 -> {
System.out.println("code 3, 4");
}
default -> {
System.out.println("default code");
}
}
}
}4.5.2 switch expression
expression = 식 3 + 5같은거 연산은 다른 연산의 일부분, 변수의 값으로 할당되거나 매개변수가 될 수도 있다.
즉 expression은 statement의 일부분임. expression은 결과를 내야하기 때문에 default가 빠지면 안된다.
자바 13부터 가능하다.
4.5.2.1 switch case(:) expression
String res = switch (val) {
case 1: {
yield "값1";
}
case 2: {
yield "값2";
}
case 3: {
String r = "값" + val;
yield r;
}
default : {
yield "값3";
}
};
System.out.println(res);yiled한 값을 바로 변수에 담을 수 있다.
4.5.2.2 switch labeled(->) expression
String res2 = switch (val) {
case 1 -> {
yield "값1";
}
case 2 -> "값2";
case 3 -> {
String r = "값" + val;
yield r;
}
default -> "값3";
};
System.out.println(res2);labeled(->)을 활용한 버전이다.
-> 을 활용하면 yield자체도 없애버릴 수 있다.
public class C07Switch {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("주민등록번호 7번째 자리>");
int num = scanner.nextInt();
String gender1 = "";
switch (num) {
case 1:
case 3:
gender1 = "남자";
break;
case 2:
case 4:
gender1 = "여자";
break;
default:
gender1 = "잘못입력";
}
System.out.println("입력된 성별은 " + gender1 + "입니다.");
String gender2 = switch (num) {
case 1, 3 -> "남자";
case 2, 4 -> "여자";
default -> "잘못입력";
};
System.out.println("입력된 성별은 " + gender2 + "입니다.");
}
}4.6 while
반복문(loop)
1.조건이 true이면 코드블럭실행
2.코드블럭 실행 후 조건확인
3.반복
public class C01While {
public static void main(String[] args) {
System.out.println("이전 실행문..");
boolean con = true;
while (con) {
System.out.println("반복해야할 명령문1");
System.out.println("반복해야할 명령문2");
}
System.out.println("다음 실행문..");
}
}4.7 do - while
조건에 상관없이 일단 한번은 실행시키고 싶을때 사용
1.코드블럭 실행 후 조건확인
2.조건이 true이면 코드블럭 실행
3.반복
public class C03DoWhile {
public static void main(String[] args) {
System.out.println("이전 명령문...");
boolean con = false;
do {
System.out.println("명령문 반복1");
System.out.println("명령문 반복2");
} while (con);
System.out.println("다음 명령문...");
}
}4.7.2 연습문제
확인문제 풀어보기
주사위 두개 던져서 합이 5면 종료
public class ex4 {
public static void main(String[] args) {
int dice1;
int dice2;
do {
dice1 = ((int) (Math.random() * 6)) + 1;
dice2 = ((int) (Math.random() * 6)) + 1;
System.out.printf("%d, %d\n", dice1, dice2);
} while(dice1 + dice2 != 5);
}
}2023.02.20 후기
드디어 제어문을 배운다. 제어문의 반복이 프로그램 그자체라고 해도 과언이 아니다. 유사 프로그램을 만드는 과정의 출발점에 섰다.
프로그래머스를 소개받았다. 하루에 한페이지정도(약 20) 0단계문제를 풀고자 한다. 새로 배운 내용만 해설하고자 한다.
yiled 스위치 expression을 제대로 이해하지 못하고 있었는데 이해하게 되었다.
하지만 줄여서 작성하는 것은 코드에는 많은 도움이 되지만 가독성 문제나 낮은 버전에서의 호환성 문제로 인해서 기존 case문을 사용하려고 한다. 현업에서는 보다 낮은 버전을 사용하는 일이 많다고 들었다.