모카스터디/Java

연산자와 반복문과 조건문

softmoca__ 2024. 10. 1. 17:56
목차

오버 플로우와 언더플로우

정수 타입 연산에서 오버/언더플로우가 발생되면 실행 에러가 발생하지 않고, 정수 타입의 최소/최대값으로 되돌아간다.

byte value =127;
value++;                   // value 값에 1을 더함 
System.out.println(value); // -128

최대값 +1 -> 최소값

최소값 -1 -> 최대값

 

 

정확한 계산은 정수 연산으로

public class AccuracyExample1 {
	public static void main(String[] args) {
		int apple = 1;
		double pieceUnit = 0.1;
		int number = 7;
		
		double result = apple - number*pieceUnit;
		System.out.println("사과 1개에서 남은 양: " + result); //0.2999999999993
	}
}

위 예제는 사과 1개를 0.1 단위의 10조각으로 보고, 그 중 7조각(0.7)을 뺀 3조각(0.3)을 result변수에 저장한다.

 

public class AccuracyExample2 {
	public static void main(String[] args) {
		int apple = 1;
		int totalPieces = apple * 10;
		int number = 7;
		
		int result = totalPieces - number; 
		System.out.println("10조각에서 남은 조각: " + result); //3
		System.out.println("사과 1개에서 남은 양: " + result/10.0);  //0.3
	}
}

실수는 부동 소수점 방식을 사용해서 실수타입은 정확하지 않다.

정확한 계산이 필요하다면 정수 연산으로 변경해야한다.

 

 

 

나눗셈 연산 후 NaN과 Infinity 처리

5/ 0.0  -> Infinity
5 % 0.0 -> NaN
public class InfinityAndNaNCheckExample {
	public static void main(String[] args) {
		int x = 5;
		double y = 0.0;
		double z = x / y;
		//double z = x % y;
		
	
		System.out.println(z + 2);		//잘못된 코드  런타임 에러
		
		//알맞은 코드
		if(Double.isInfinite(z) || Double.isNaN(z)) { 
			System.out.println("값 산출 불가"); 
		} else { 
			System.out.println(z + 2); 
		}
	}
}

 

 

 

If문

public class IfElseIfElseExample {
    public static void main(String[] args) {
        int number = 75;

        if (number > 90) {
            System.out.println("90 보다 크다 !");
        } else if (number > 60) {
            System.out.println("60과 90 사이다 !");
        } else {
            System.out.println("60 이하이다 !");
        }
    }
}

 

아래 코드와 같이 실행문이 한 줄일 경우에는 중괄호는 생략 가능하다.

public class IfElseIfElseExample {
    public static void main(String[] args) {
        int number = 75;

        if (number > 90)
            System.out.println("The number is greater than 90");
        else if (number > 60)
            System.out.println("The number is greater than 60 but less than or equal to 90");
        else
            System.out.println("The number is 60 or less");
    }
}

 

중괄호 생략시 주의 !

if (condition)
    statement1;
    statement2;  // 의도와 달리 항상 실행됨

가능하면 늘 중괄호를 사용하자 !


Switch문

Switch 문의 괄호에는 정수타입문자열타입 변수를 사용할 수 있다.

Java 12 이후 부터는 Switch 문에서 Expression(표현식)을 사용할 수 있다.

break 문을 없애는 대신에 화살표와 중괄호를 사용해 가독성이 좋아졌다.

public class SwitchValueExample {
	public static void main(String[] args) {
		String grade = "B";
		
		//Java 11 이전 문법
		int score1 = 0;
		switch(grade) {
		    case "A":
		    	score1 = 100;
		    	break;
		    case "B":
		    	int result = 100 - 20;
		    	score1 = result;
		    	break;
		    default:
		    	score1 = 60;
		}
		System.out.println("score1: " + score1);
		
		//Java 12부터 가능
		int score2 = switch(grade) {
			case "A" -> 100;
			case "B" -> {
				int result = 100 - 20;
				//Java 13부터 가능
				yield result;
			}
			default -> 60;
		};
		System.out.println("score2: " + score2);
	}
}

Switch Expression을 사용하면 스위치된 값을 변수에 바로 대입할수 있다.

단일 값일 경우에는 화살표 오른쪽에 값을 기술하면되고,
중괄호를 사용할 경우에는 yield(Java13부터) 키워드로 값을 저장하면 된다.

단, 이 경우(Switch Expression사용)에는 default가 반드시 존재해야한다.

 

 

 

for 문

for(int i=1; i<=10; i++) {
    System.out.print(i + " ");
}

[1] 초기화식이 제일 먼저 실행

[2] 조건식을 평가해서 true면 [3] 실행문 실행, false면 for문 종료하고 블록 건너뛰기

[2] 조건식이 true가 되어 [3] 실행문을 모두 실행하면 [4]증감식이 실행된다.

그리고 다시 [2] 조건식을 평가한다. ~~ 반복.

 

while 문

int i = 1;
    while (i<=10) {
        System.out.print(i + " ");
        i++;
    }

[1] 조건식 평가 후 평가결과가 true면 [2] 실행문실행

[2] 실행문 모두 실행하면 [1] 조건식을 다시 평가 

다시 조건식이 true라면 [2]->[1]로 진행, false라면 while문 종료.

 

 

continue 문

 continue문은 반복문에서만 사용되며, 블록 내부에서 continue문이 실행되면

for 문의 증감식 또는  while문, do-while문의 조건식으로 바로 이동한다.

 

 

 

break 문

break문은 반복문과 switch문을 종료할 때 사용한다.

 

이름(레이블)이 있는 중첩 반복문에서의 break와 continue

Outter: for(char upper='A'; upper<='Z'; upper++) {
            for(char lower='a'; lower<='z'; lower++) {
                System.out.println(upper + "-" + lower);
                if(lower=='g') {
                    break Outter;
                }
            }
}

반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료시키지 않는다.

중첩된 반복문에서 바깥쪽 반복문 까지 종료시키려면 바깥쪽 반복문에 이름(레이블)을 붙이고,  'break 이름(레이블)';을 사용하면 된다.

(continue도 마찬가지이다)

 

break : 반복문을 그 즉시 종료.

continue : 반복문 아래 코드 실행하지 않고 바로 for문의 증감식, while문의 조건식으로 이동.

 

 

배열 및 컬렉션 항목 반목을 위한 향상된 for문

카운터 변수와 증감식을 사용하지 않고, 항목의 개수만큼 반복한 후 자동으로 for문을 빠져나간다.

 - 향상된 for문에는 증가하는 인덱스 값이 감추어져있어서, 인덱스 값을 직접 사용해야 하는 경우에는 향상된 for문은 지양 !

for문이 실행되면 [1] 배열에서 가져올 항목이 있을 경우 

[2] 변수에 항목을 저장하고, [3] 실행문을 실행한다.

다시 반복해서 [1]배열에서 가져올 다음 항목이 존재하면

[2] -> [3] -> [1]로 진행하고, 가져올 다음 항목이 없다면 for문을 종료한다.