자바의 정석 Chapter03 연산자
1. 연산자
1.1 연산자와 피연산자
연산자
연산을 수행하는 기호(+, -, *, /)
피연산자
연산자의 작업 대상(변수, 상수, 리터럴, 수식)
1.2 연산자의 종류와 우선순위
- 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다.
- 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.
- 단항, 부호, 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽 ->
- 복잡한 연산식에는 괄호()를 사용하여 우선순위 정한다.
1.3 산술 변환
연산 수행 직전에 발생하는 피연산자의 자동 형변환
- 두 피연산자의 타입을 같게 일치시킨다. (큰 타입으로 일치)
- 피연산자의 타입이 int보다 작은 타입(byte, short, char)이면 int로 변환된다.
2. 단항 연산자
단항 연산자는 피연산자가 단 하나뿐인 연산자를 말하며, 부호 연산자(+, -), 증감 연산자(++,--), 논리 부정 연산자(!)가 있다.
2.1 부호 연산자
부호 연산자는 양수 및 음수를 표시하며 boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용 가능하다.
연산 수행 시 피연산자 타입 변환이 필요하다.
2.2 증감 연산자
증감 연산자는 변수의 값을 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
}
}
2.3 논리 부정 연산자
논리 부정 연산자는 true를 false로, false를 true로 변경하기 때문에 boolean 타입에만 사용 가능하다.
3. 이항 연산자
3.1 산술 연산자
피연산자들의 타입이 동일하지 않을 경우 타입 일치시킨 후 연산을 수행한다.
두 피연산자가 모두 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);
}
}
3.2 문자열 결합 연산자
피연산자 중 한쪽이 문자열이면 + 연산자는 다른 피연산자를 문자열로 변환하고 서로 결합한다.
String str1 = "JDK" + 6.0; // JDK6.0
4. 비교 연산자
4.1 등가비교 연산자
두 피연산자의 값이 같은지 다른지를 비교하는 연산자로 기본형과 참조형에 사용할 수 있다.
기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 객체의 주소값을 비교하여 같은 객체를 가리키고 있는지 알 수 있다.
비교 연산 수행 전 피연산자의 타입을 일치시켜 비교하는데 한 가지 예외가 있다. 바로 0.1 == 0.1f
의 경우인데 비교 연산 수행 결과 false가 나온다. 0.1f가 double 타입으로 변환되어 0.1 == 0.1
는 true가 나올 것 같지만 실수의 저장 방식인 부동 소수점 방식이 0.1을 정확히 표현할 수 없어 0.1의 근사값으로 표현되는데 이 값은 0.1보다 큰 값이 된다. 그 결과 false가 출력되는데 이를 해결하기 위해서는 피연산자 모두 float 타입으로 변환해서 비교하거나 정수 타입으로 변환해서 비교해야 한다.
문자열 비교
기본 타입 변수 값 비교 시 ==
연산자를 사용하지만 참조 타입인 String 변수 비교 시 equals() 메서드를 사용한다.
5. 논리 연산자
&&와 &는 결과가 동일하지만 연산 과정이 다르다.
&&는 하나라도 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");
}
}
}
출처
- 자바의 정석 - 남궁성 지음
- 혼자 공부하는 자바 - 신용권 지음
Author And Source
이 문제에 관하여(자바의 정석 Chapter03 연산자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@im_lily/자바의-정석-Chapter03저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)