[Java] 조건문, 반복문
2024. 1. 21. 17:24ㆍ공부 중/Java
1. 조건문
조건문 | 허용되는 타입 |
if문 | Boolean, boolean |
switch문 | byte, Byte, short, Short, char, Character, int, Integer, String, enum |
다만, switch
문의 괄호 안에는 long
타입을 사용할 수 없습니다.
가. if문
//1번
if(a > b) {
if(a > c) {
System.out.println(a);
}else {
System.out.println(c);
}
}else {
if(b > c) {
System.out.println(b);
}else {
System.out.println(c);
}
}
//2번
if(a > b) {
if(a > c) {
System.out.println(a);
}else {
System.out.println(c);
}
}else if(b > c) {
System.out.println(b);
}else {
System.out.println(c);
}
2번을 사용해라.
판단 기준(a
)이 달라지면 새로운 if문을 생성하라.
나. short circuit
short circuit : 짧은 단위의 논리연산
int a = 3, b = 5, c = 4;
boolean flag = true;
flag = flag && (++a > 6);
System.out.println(flag + ", a : " + a);
// true, a : 4
int a = 3, b = 5, c = 4;
boolean flag = false;
flag = flag && (++a > 6);
System.out.println(flag + ", a : " + a);
// false, a : 3
자바는 짧은 단위의 논리 연산을 지원한다.
다. switch-case문
월별로 마지막 날을 출력하는 프로그램을 switch-case문으로 만들어 보았다.
int month = 1;
switch(month) {
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 :
System.out.println(31);
break;
case 4 :
case 6 :
case 9 :
case 11 :
System.out.println(30);
break;
case 2 :
System.out.println(28);
default :
System.out.println("i dont know");
}
너무 길고 비효율적이다.
int month = 1;
switch(month) {
case 4 :
case 6 :
case 9 :
case 11 :
System.out.println(30);
break;
case 2 :
System.out.println(28);
default :
System.out.println(31);
}
유사 작업은 모아서 처리하고 압도적으로 많이 사용되는 경우를 default
에서 처리하자.
잘 사용하면 굉장히 효율적이다.
2. 반복문
반복문의 4가지 요소 : 초기식, 조건식, 증감식, 실행문
import java.util.Random;
public class Lang_07 {
public static void main(String[] args) {
byFor();
byWhile();
}
private static void byFor() {
int sum = 0;
int cnt = 100;
double avg = 0;
Random rand = new Random();
for(int i = 0; i < cnt; i++){
sum += rand.nextInt(6) + 1; //0~5 + 1
}
avg = 1.0*sum/cnt;
System.out.printf("sum: %d, avg: %.1f%n", sum, avg);
}
public static void byWhile() {
int sum = 0;
int cnt = 100;
double avg = 0;
Random rand = new Random();
int i =0;
while(i< cnt){
sum += rand.nextInt(6) + 1; // 0~5 +1
i++;
}
avg = 1.0*sum/cnt;
System.out.printf("sum: %d, avg: %.1f%n", sum, avg);
}
}
/*
sum: 335, avg: 3.4
sum: 327, avg: 3.3
*/
%.1f
: float 소수점 1자리까지 반올림.
public class Atest {
public static void main(String[] args) {
float f = 3.3338f;
System.out.printf("f : %.3f %n", f);
f = 3.3335f;
System.out.printf("f : %.3f %n", f);
}
}
/*
f : 3.334
f : 3.333
*/
f = 3.3335f;
:3.3354
로 반올림되어야 하지만 실수의 표현 한계(3.3334....
)로 실제론3.333
으로 반올림됨.
그냥 믿지 말자.
가. rabel break, rabel continue
중첩된 반복문을 break
, continue
하는 방법.
label:for(int i = 1; i <= 9; i++) {
for(int j = 1; j <= 9; j++) {
if(i==3) {
break label;
}
if(j==4){
contiune label;
}
System.out.println(i + "*" + j + " = " + i*j);
}
System.out.println("---------------------");
}
label
자리는 label
가 아닌 아무런 단어가 와도 된다.
나. 개선된 for문
int arr[] = {4,5,6,7,8,9};
int s = 0;
for(int data : arr){
s++;
if(s == 2) {
data = 999;
}
System.out.println(data);
}
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
/*
4
999
6
7
8
9
4
5
6
7
8
9
*/
for(int data : arr){
의 data
는 arr
의 값을 복사한 복사본이다.
값을 수정한다고 해서 원본이 변하진 않는다.
실제로 arr[1]
는 999
로 수정되지 않는다.
단, 경우에 따라서 수정되는 경우가 있다.
복사해 온 값이 주소값이면 원본은 수정된다.
잘 구분해서 사용하자.
Java는 아니지만 참고할 수 있는 경우다.
'공부 중 > Java' 카테고리의 다른 글
[Java] 다형성 (0) | 2024.01.22 |
---|---|
[Java] 상속 (0) | 2024.01.21 |
[Java] 객체지향 (0) | 2024.01.21 |
[Java] 배열 (0) | 2024.01.21 |
[Java] 자료형과 연산자 (0) | 2024.01.21 |