1) 오버플로우, 언더플로우
- 오버플로우(overflow) : 타입이 허용하는 최대값을 벗어나는 것
- 언더플로우(underflow) : 타입이 허용하는 최소값을 벗어나는 것
정수 타입 연산에서 오버플로 또는 언더플로가 발생하면 해당 정수 타입의 최소값 또는 최대값으로 되돌아간다.
byte타입일 경우 최대값 127에서 1을 더하면 128이 되어 오버플로가 발생하여 연산 결과는 최소값인 -128이 된다. 그리고 나서 다시 1을 더하면 -127이 된다.

2) 비교연산자
- 동등(==, !=) 또는 크기(<,<=,>,>=)를 평가해서 boolean 타입인 true, false를 산출
- 흐름제어문인 조건문(if), 반복문(for, while)에서 실행 흐름을 제어할 때 주로 사용
두 피연산자를 비교하는데 사용되는 연산자다. 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 true와 false 둘 중 하나이다.
비교 연산자 역시 이항 연산자이므로 비교하는 피연산자의 타입이 서로 다른 경우에는 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 채 비교해야 한다.
| 구분 | 연산식 | 설명 | |||
| 동등비교 | 피연산자1 | == | 피연산자2 | 두 피연산자의 값이 같은지를 검사 | |
| 피연산자1 | != | 피연산자2 | 두 피연산자의 값이 다른지를 검사 | ||
| 크기비교 | 피연산자1 | > | 피연산자2 | 피연산자1이 큰지를 검사 | |
| 피연산자1 | >= | 피연산자2 | 피연산자1이 크거나 같은지를 검사 | ||
| 피연산자1 | < | 피연산자2 | 피연산자1이 작은지를 검사 | ||
| 피연산자1 | <= | 피연산자2 | 피연산자1이 작거나 같은지를 검사 | ||
문자열을 비교할 때는 동등(==, !=) 연산자 대신 equals()와 !equals()를 사용
동등연산자는 두 변수의 주소(참조)를 비교
equals()는 두 문자열의 내용을 비교
3) Infinity, NaN(Not a Number)
나눗셈(/) 또는 나머지(%) 연산에서 좌측 피연산자가 정수이고 우측 피연산자가 0일 경우 무한대의 값을 정수로 표현할 수 없기 때문에 예외(ArithmeticException)가 발생한다.
하지만 좌측 피연산자가 실수이거나 우측 피연산자가 0.0 또는 0.0f이면 예외가 발생하지 않고 연산의 결과는 Infinity(무한대) 또는 NaN(Not a Number)이 된다.
Infinity 또는 NaN 상태에서 계속해서 연산을 수행하면 어떤 연산을 하더라도 결과는 계속해서 Infinity와 NaN이 되므로 데이터가 엉망이 될 수 있다.
그렇기 때문에 /와 % 연산의 결과가 Infinity 또는 NaN인지 먼저 확인하고 다음 연산을 수행하는 것이 좋다. 확인하기 위해서는 Double.inInfinite()와 Double.isNaN를 사용한다. 이렇게 하면 변수값이 Infinity 또는 NaN일 경우 true를, 그렇지 않다면 false를 산출한다.
public static void signOperatorSample8() {
Scanner sc = new Scanner(System.in);
//실수형 오류처리
System.out.println("--x 데이터 입력--");
double x = sc.nextDouble();
System.out.println("--y 데이터 입력--");
double y = sc.nextDouble();
double z = x/y;
double w = x % y;
//double 타입은 오류가 발생하지 않음
System.out.println(z);
System.out.println(w);
//따라서 연산 결과를 boolean 타입의 변수를 이용하여 처리
boolean result = Double.isInfinite(z);
System.out.println(result);
boolean result2 = Double.isNaN(w);
System.out.println(result2);
if(result || result2) {
System.out.println("값 산출 불가");
}else {
System.out.println(z+2);
System.out.println(w+2);
}
}

4) 주석
- 주석 또는 코멘트(comment)는 프로그래밍에 있어 내용을 메모하는 목적으로 쓰인다
| 한줄 주석 | 블록 주석 | 문서 주석 | TODO 주석 | 중요한 주석 |
| 짧은 설명을 추가할 때 사용 | 여러 줄에 걸친 주석을 작성할 때 사용 | 클래스, 메서드, 필드 등의 설명을 작성하는데 사용 | 나중에 작업해야 할 항목을 작성하는데 사용 | 이슈가 발생할 수 있는 곳에 작성 |
| // | /* */ | /** */ | // TODO: | // FIXME: |
5) String 문자열 비교
String 참조변수 타입은 고유의 주소값이 부여된다. 서로 다른 주소값을 가진 객체가 생성돼도 데이터가 같다면 덮어씌움.
== 연산자로 비교하면 메모리 주소를 비교한다.
java에서 문자열 리터럴은 String pool이라는 데이터 영역에 저장되는데, 같은 문자열이 있는 경우 하나의 객체로 관리한다. 따라서 name1, name2의 "홍길동" 문자열은 같은 객체를 참조하게 된다. name1 == name2 비교연산은 메모리 상에서 같은 객체를 참조하는지 확인하므로, result1의 결과가 true가 된다
result2는 String data type으로 name3, name4 객체참조변수를 선언하고,
new 키워드로 생성자 메서드를 호출했기 때문에 새로운 객체가 생성되는데, 이 객체는
힙 메모리 영역에 할당되므로 문자열 리터럴과 다른 메모리 영역을 가진다.
새로운 객체가 생성되면 새로운 주소가 생성되어서 name3 == name4 비교연산은
변수의 주소를 비교하게 되고 따라서 false가 출력된다
문자열의 데이터를 비교하려면 equals() 메서드를 사용해야 한다
public static void singOperatorSamle13() {
String name1 = "홍길동";
String name2 = "홍길동";
System.out.println(System.identityHashCode(name1));
System.out.println(System.identityHashCode(name2));
boolean result1 = (name1 == name2);
System.out.println("result : "+ result1);
String name3 = new String("홍길동");
String name4 = new String("홍길동");
System.out.println(System.identityHashCode(name3));
System.out.println(System.identityHashCode(name4));
boolean result2 = (name3 == name4);
System.out.println("result2 : "+ result2);
boolean result3 = (name3.equals(name4));
System.out.println("result3 : "+ result3);
}
'JAVA, JSP' 카테고리의 다른 글
| setAttribute, getAttribute, request.getParameter, session객체, JDBC 프로그램 순서 7단계 (1) | 2024.07.16 |
|---|---|
| 기능적/비기능적 요구사항, post, get방식, jsp 문법 구조, include (0) | 2024.07.15 |
| post, get 방식, Wrapper class (0) | 2024.07.10 |
| 생성자 메서드 오버로딩, static, 메서드 오버라이딩, 추상 클래스, 추상 메서드, interface (0) | 2024.07.08 |
| java - 아스키 코드, 이스케이프 문자, 변수 타입(정수형), 디버깅, 캐스팅, indexOf(), Scanner, if문, 증가연산자, Eclipse jdk 경로 설정 (0) | 2024.07.04 |