본문 바로가기
JAVA BASE/operator(연산자)

04. [자바] 산술 연산자(문자, 나머지연산 %) feat. 유니코드표

by staticClass 2020. 12. 2.

문자연산

사칙연산의 피연산자로 숫자뿐만이 아니라 문자도 가능하다.

문자는 고유의 유니코드가 있는데 이 유니코드를 저장하기 때문에 

문자간의 계산은 숫자간의 계산과 동일하게 처리 된다.

 

문자 '2'의 유니코드는 50이고, 문자'0'의 유니코드는 48이므로 '2' - '0' = 2 가 된다.
유니코드

위의 유니코드에서 문자 'd'의 숫자가 100, 문자 'a'가 97 이라는걸 확인할수 있다.

문자 'd'에서 'a'를 빼면 다음과 같이 처리된다.

'd' - 'a' → 100 - 97 = 3 

 

 

편의를 위해 문자 옆에 유니코드를 적어두겠음 a(97)

//위 예제에 대한 설명
int i = c1 + 1;  →  int i = a(97) + 1 >> i의 값은 98

c3 = (char)(c1 +1); → c3 = (char)(97 + 1) >> 98의 값을 char로 형변환 하여 c3에 문자 'b(98)'가 대입됨

c2++; → 97++	
c2++; → 98++ >> c2의 값은 c(99)

위의 예제를 보면 문자도 연산이 된다는걸 확인할수 있었다.

 

이제 하나 흥미로운것을 보려한다.

char c1 = 'a';
char c2 = c1 + 1;			// 컴파일 에러 발생.

char c2 = 'a' + 1;			// 컴파일 에러 없음.

알고있는 지식으로는 덧셈 연산자는 int보다 작은 연산자들은 자동으로 int로 형변환 한다고 알고 있다.

어째서 위의 코드는 char c2 = (char)('a'+1); 같이 형변환을 해주지 않아도 문제가 없는 것일까?

이유는 'a'+1이 리터럴 같의 연산이기 때문이라고 한다.

뭔소리인가 하니 상수, 리터럴 간의 연산은 실행 과정동안 변하는 값이 아니기 때문에 

컴파일러가 계산해서 그 결과로 대체 함으로 문제가 없고 보다 효율적인 코드를 만들수 있다고 한다.

 

나머지 연산자 %

나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자이다.

나눗셈처럼 나누는 수(오른쪽 피연산자) 0을 사용할수 없고 나머지 연산자는 주로 홀수, 짝수, 배수 검사 등에 사용한다.

 

int x = 10;
int y = 8;
System.out.printf("%d을 %d로 나누면%n", x, y);
System.out.printf("몫은 %d고 나머지는 %d입니다.", x / y, x % y);

실행결과
10을 8로 나누면
몫은 1이고 나머지는 2입니다.

 

 

System.out.println(-10%8);	// 결과 : -2
System.out.println(10%8);	// 결과 : 2
System.out.println(-10%-8);	// 결과 : -2


System.out.println(10%8);	//  ↓결과는 같다 : 2↓
System.out.println(10%-8);	//  ↑결과는 같다 : 2↑

나머지 연산자(%)는 나누는 수로 음수도 허용하지만 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 결과가 같다.

 

 

 


문자 연산이 된다는 것은 이미 알고 있던 사실이지만
유니코드를 활용하여 여러가지 기능들을 구현할수 있겠다는 생각을 했다.
그리고 이 글을 작성하는 도중에
과거 나를 괴롭힌적 있던 문자형 숫자를 정수형으로 변형 하는 방법에 대해
다시한번 생각해보고 실행해보았다.

2020/12/02 - [Algorithm/내 머리속에서 나온것!] - 문자열을 숫자로 바꾸기 parseInt()는 사용x

 

문자열을 숫자로 바꾸기 parseInt()는 사용x

때는 2019년 시스템을 개발, 유지보수로 일을 한 지 2년 차가 돼가던 시절 매일 반복되는 일정과 드라마에서나 볼 수 있었던 못된 상사! 에게 시달리며 개발이 점점 싫어지고 공부도 하지 않게 되

staticclass.tistory.com

 

댓글