오버 플로우와 언더플로우
정수 타입 연산에서 오버/언더플로우가 발생되면 실행 에러가 발생하지 않고, 정수 타입의 최소/최대값으로 되돌아간다.
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문을 종료한다.
'모카스터디 > Java' 카테고리의 다른 글
변수와 기본타입과 타입변환(캐스팅) (0) | 2024.09.30 |
---|---|
자바의 특징 및 자바 프로그램 실행과정 (1) | 2024.09.30 |
자바 문자열 및 배열 (0) | 2024.09.14 |