연산을 수행하는 기호(+, -, *, /)
연산자의 작업 대상(변수, 상수, 리터럴, 수식)
연산 수행 직전에 발생하는 피연산자의 자동 형변환
단항 연산자는 피연산자가 단 하나뿐인 연산자를 말하며, 부호 연산자(+, -), 증감 연산자(++,--), 논리 부정 연산자(!)가 있다.
부호 연산자는 양수 및 음수를 표시하며 boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용 가능하다.
연산 수행 시 피연산자 타입 변환이 필요하다.
증감 연산자는 변수의 값을 1 증가시키거나 1 감소시키는 연산자로 연산 수행 시 피연산자 타입 변환이 불필요하다.
/*
증감 연산자 - 피연산자의 타입 변환 불필요
++i와 i=i+1의 연산 속도 차이 없음
*/
public class IncreaseDecreaseOperatorExample {
public static void main(String[] args) {
int x = 10;
int y = 10;
int z;
// 증감 연산자는 피연산자의 타입 변환 불필요
byte b = 5;
byte bb = b++;
System.out.println(bb);
System.out.println("-------");
x++; // 10 -> 11
++x; // 12
System.out.println("x : " + x); // 12
System.out.println("--------");
y--; // 10 -> 9
--y; // 8
System.out.println("y : " + y); // 8
System.out.println("--------");
z = x++; // z = x; x = x+1;
System.out.println("z : " + z); // 12
System.out.println("x : " + x); // 13
System.out.println("--------");
z = ++x;
System.out.println("z : " + z); // 14
System.out.println("x : " + x); // 14
}
}
논리 부정 연산자는 true를 false로, false를 true로 변경하기 때문에 boolean 타입에만 사용 가능하다.
피연산자들의 타입이 동일하지 않을 경우 타입 일치시킨 후 연산을 수행한다.
두 피연산자가 모두 int타입인 경우, 나누기 연산 결과는 int타입이다. int타입은 소수점을 저장하지 못하므로 정수만 남고 소수점 이하는 버려진다.
올바른 연산결과를 얻기 위해서는 두 피연산자 중 어느 한 쪽을 실수형으로 형변환 해야한다.
public class ArithmeticOperatorExample {
public static void main(String[] args) {
int v1 = 5;
int v2 = 2;
int result1 = v1 + v2;
System.out.println("result1 : " + result1);
int result2 = v1 - v2;
System.out.println("result2 : " + result2);
int result3 = v1 * v2;
System.out.println("result3 : " + result3);
int result4 = v1 / v2;
System.out.println("result4 : " + result4);
// 소수점 이하의 수까지 구하기 위해서는 피연산자 중 하나는 실수 타입이어야함
double result6 = (double) v1 / v2;
System.out.println("result6 : " + result6); // 2.5
// int 타입의 연산 결과는 int인데 이를 double 타입으로 저장한다고 해서 소수점 이하의 값이 출력되지 않음
double result = v1 / v2;
System.out.println("result : " + result); // 2.0
int result5 = v1 % v2;
System.out.println("result5 : " + result5);
}
}
피연산자 중 한쪽이 문자열이면 + 연산자는 다른 피연산자를 문자열로 변환하고 서로 결합한다.
String str1 = "JDK" + 6.0; // JDK6.0
두 피연산자의 값이 같은지 다른지를 비교하는 연산자로 기본형과 참조형에 사용할 수 있다.
기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 객체의 주소값을 비교하여 같은 객체를 가리키고 있는지 알 수 있다.
비교 연산 수행 전 피연산자의 타입을 일치시켜 비교하는데 한 가지 예외가 있다. 바로 0.1 == 0.1f
의 경우인데 비교 연산 수행 결과 false가 나온다. 0.1f가 double 타입으로 변환되어 0.1 == 0.1
는 true가 나올 것 같지만 실수의 저장 방식인 부동 소수점 방식이 0.1을 정확히 표현할 수 없어 0.1의 근사값으로 표현되는데 이 값은 0.1보다 큰 값이 된다. 그 결과 false가 출력되는데 이를 해결하기 위해서는 피연산자 모두 float 타입으로 변환해서 비교하거나 정수 타입으로 변환해서 비교해야 한다.
기본 타입 변수 값 비교 시 ==
연산자를 사용하지만 참조 타입인 String 변수 비교 시 equals() 메서드를 사용한다.
&&와 &는 결과가 동일하지만 연산 과정이 다르다.
&&는 하나라도 false면 전체 연산식이 false이기 때문에 앞의 피연산자가 false면 뒤의 피연산자는 평가하지 않고 바로 false를 출력한다. 한편, &는 두 피연산자 모두 평가해서 결과를 출력하기 때문에 &보다 &&이 더 효율적이며 ||와 |도 마찬가지이다.
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char ch = ' ';
System.out.printf("문자 하나 입력하세요 : ");
String input = sc.nextLine();
ch = input.charAt(0);
if ('0' <= ch && ch <= '9') {
System.out.printf("입력하신 문자는 숫자입니다.%n");
}
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) {
System.out.printf("입력하신 문자는 영문자입니다.%n");
}
}
}