1. 사칙 연산자(+-*/)
사칙 연산자, 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/)은 우리가 일상에서 사용하고 있는 규칙과 다르지 않다.
- 곱셈(*), 나눗셈(/), 나머지(%) 연산자가 덧셈(+), 뺄셈(-) 연산자보다 우선순위가 높다.
- 피연산자가 정수인 경우, 나누는 수로 0을 사용할 수 없다.
- 예제 OperatorEx5.java
import java.util.*;
public class OperatorEx5 {
public static void main(String[] args) {
int a = 10;
int b = 4;
System.out.printf("%d + %d = %d%n", a, b, a + b);
System.out.printf("%d - %d = %d%n", a, b, a - b);
System.out.printf("%d * %d = %d%n", a, b, a * b);
System.out.printf("%d / %d = %d%n", a, b, a / b);
System.out.printf("%d / %f = %f%n", a, (float)b, a / (float)b);
}
}
문자 간의 사칙연산
사칙연산의 피연산자로 숫자뿐만 아니라 문자도 가능하다. 문자는 실제로 해당 문자의 유니코드(부호 없는 정수)로 바뀌어 저장되므로 문자 간의 사칙연산은 정수 간의 연산과 동일하다.
ex) '2' - '0' → 50 - 48 → 2
* 유니코드 문자 '0'은 48, 'A'는 65, 'a'는 97이다.
char ch = 90;
System.out.println(ch++); // 문자 'Z'
System.out.println(ch++); // 문자 '['
System.out.println(ch++); // 문자 '\'
System.out.println(ch++); // 문자 ']'
System.out.println(ch++); // 문자 '^'
System.out.println(ch++); // 문자 '_'
System.out.println(ch++); // 문자 '`'
System.out.println(ch++); // 문자 'a'
System.out.println("========================");
System.out.println((int)' '); // 정수 32
- 예제 OperatorEx13.java
public class OperatorEx13 {
public static void main(String[] args) {
char c1 = 'a';
char c2 = c1 + 1; // 에러. 변수와 리터럴의 합
char c3 = 'a' + 1; // 리터럴과 리터럴의 합
System.out.println(c3); // 결과는 98
}
}
Q. 이 예제에서 char c3 = 'a'+1;은 왜 컴파일 오류가 발생하지 않는가?
A. 'a'+1이 리터럴 간의 연산이기 때문이다. 상수 또는 리터럴 간의 연산은 실행 과정 동안 변하는 값이 아니기 때문에, 컴파일러가 미리 계산해서 그 결과로 대체한다.
* ex) int sec = 60 * 60 * 24; → int sec 86400;
그러나, char c2 = c1+1; 같이 수식에 변수가 들어 있는 경우에는 컴파일러가 미리 계산을 할 수 없기 때문에 아래와 같이 형 변환을 해주어야 한다.
char c2 = c1+1; → char c2 = (char)(c1+1);
- 예제 OperatorEx14.java
public class OperatorEx14 {
public static void main(String[] args) {
char c = 'a';
for (int i = 0; i < 26; i++) { // 블럭{} 안의 문장을 26번을 반복
System.out.print(c++); // 'a'부터 26개의 문자를 출력
}
System.out.println();
c = 'A';
for (int i = 0; i < 26; i++) { // 블럭{} 안의 문장을 26번을 반복
System.out.print(c++); // 'A'부터 26개의 문자를 출력
}
System.out.println();
c = '0';
for (int i = 0; i < 10; i++) { // 블럭{} 안의 문장을 10번을 반복
System.out.print(c++); // '0'부터 10개의 문자를 출력
}
System.out.println();
System.out.println('힣' - '가' + 1); // 한글의 갯수는 정확히 몇개 일까요?
System.out.println(11172 / 19f);
for (int i = '가'; i < '까'; i++) {
System.out.println((char) i);
}
System.out.println('a' - 'A');
}
}
나눗셈(/)으로 소수점 자리 바꾸기
int 타입 간의 나눗셈을 수행하면 결과가 float 타입이나 double 타입이 아닌 int 타입임을 기억해야 한다.
* int 타입 간의 나눗셈은 나눗셈의 결과를 반올림하지 않고 버린다.
(int)(pi * 1000) / 1000f;
(int)(3141.592f) / 1000f;
3141 / 1000f; // 3.141f
버림이 아닌 반올림이 되도록 하려면 어떻게 해야 할까? 반올림을 위해 0.5를 더해주면 된다.
(int)(pi * 1000 + 0.5) / 1000f;
(int)(3141.592 + 0.5) / 1000f;
(int)(3142.092) / 1000f;
3142 / 1000f; // 3.142f
- 예제 OperatorEx16.java
public class OperatorEx16 {
public static void main(String[] args) {
float pi = 3.141592f;
float shortPi = (int) (pi * 1000) / 1000f;
// (int) 3141.592f
// 3141 / 1000f
// 3.141
System.out.println(shortPi);
float shortPi2 = (int) (pi * 1000 + 0.5) / 1000f;
// (int) 3141.592f + 0.5
// 3142 / 1000f
// 3.142
System.out.println(shortPi2);
System.out.println(Math.PI);
System.out.println(Math.floor(pi)); // 내림(정수 기준)
System.out.println(Math.ceil(pi)); // 올림(정수 기준)
System.out.println(Math.round(pi)); // round는 int 타입
}
}
참고문헌 : 남궁성(2016), Java의 정석, 도우출판