문자연산
사칙연산의 피연산자로 숫자뿐만이 아니라 문자도 가능하다.
문자는 고유의 유니코드가 있는데 이 유니코드를 저장하기 때문에
문자간의 계산은 숫자간의 계산과 동일하게 처리 된다.
위의 유니코드에서 문자 '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
댓글