연산은 자바에서 처음 기초부터 시작할 때 가장 헷갈리고 어렵다.
사용하다보면 점점 익숙해져 편리해지는데 이 또한 시간이 적게 걸리는 것이 아니다.
우선 연산 방향과 우선순위를 알아보기전 연산자의 종류부터 아래 링크를 통해 알아보자.
2022.02.28 - [IT Program/Java Basic] - 자바(java) 연산자 & 연산자 종류 & 단항연산자 & 이항연산자 & 삼항연산자
자바(java) 연산자 & 연산자 종류 & 단항연산자 & 이항연산자 & 삼항연산자
연산이란 데이터를 처리하여 결과를 산출하는 것을 연산이라한다. 연산자란 연산에 사용되는 표시나 기호를 연산자라 칭한다. 피연산자란 연산되는 데이터를 말한다. 아래 예시를 살펴보자 x +
dongwoonew.tistory.com
연산엔 단 하나의 연산자만 들어가는 경우가 있지만, 보통은 여러가지의 연산자를 섞어서 쓰기 마련이다.
여러가지 처리를 한번에 하기 위해서 말이다.
우선 우리는 학교를 다닐 당시 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/)을 할 때 곱셈과 나눗셈에 우선순위가 있는 것을 알고있다.
연산자 또한 이것과 마찬가지로 각자의 우선순위로써 먼저 처리되는 순서가 존재한다.
해당 순서와 연산 방향을 표로 정리해보았다.
참고사항으로 가지고 있어보도록하자.
연산자 | 연산방향 | 우선순위 |
증감(++,--), 부호(+,-), 비트(~), 논리(!) | <---------------- | 높다 낮다 |
산술(%,*,/) | -----------------> |
|
산술(+,-) | ||
쉬프트(<<,>>,>>>) | ||
비교(<,>,<=,>=,instanceof) | ||
비교(==,!=) | ||
논리(&) | ||
논리(^) | ||
논리(|) | ||
논리(&&) | ||
논리(||) | ||
조건(?:) | ||
대입(=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=) | <---------------- |
위의 표와 해당 링크의 우선순위를 글로 정리하면 다음과 같다.
우선순위 : 단항>이항>삼항
우선순위 : 산술>비교>논리>대입
단항, 대입 연산자 외 다른 연산의 방향은 왼쪽에서 오른쪽으로 진행한다.
자주 쓰는 연산자에 대해 알아보도록 한다.
우리는 산술연산자(+,-,*,/)는 초등학교때 많이 배웠으므로 생략을 하고 우선적으로
증감연산자, 논리 부정 연산자, 비교연산자, 논리 연산자에 대해 알아보겠다.
우선 증감연산자이다.
증감 연산자(++,--)란 값을 1을 더하거나 빼는 연산자를 말한다.
****************************************여기서 주의할 점이 있다.
증감연산자는 변수의 앞과 뒤에 붙이는 차이에 따라 값이 다르게 출력될 수 있다.
다음 표를 보자.
a는 내가 임의로 지은 피연산자(변수명)이다.
++과 --의 위치를 잘 살펴보도록하자.
++a | 다른 연산을 수행하기 전 값을 1 증가시킨다. |
--a | 다른 연산을 수행하기 전 값을 1 감소시킨다. |
a++ | 다른 연산을 수행한 후 값을 1 증가시킨다. |
a-- | 다른 연산을 수행한 후 값을 1 증가시킨다. |
설명을 잘 보면
다른 연산을 수행하기전
다른 연산을 수행한 후
로 나뉘어져 있다.
이게 무슨 뜻일까?
우리는 해당 증감 연산자를 단 하나로 단일로 사용할때가 있지만 그렇지 않은 경우도 있다.
증감 연산자만 사용하게 된다면 모든 값은 우리가 생각하듯이 a + 1, a - 1로 동일할 것이다.
코드를 통해 확인해보자.
int wesley = 4;
int harry = 15;
++wesley;
++harry;
System.out.println("wesley result = " + wesley);
System.out.println("harry result = " + harry);
++wesley와 ++harry는 연산을 하기 전 증가를 시켜준다.
그렇다면 우리의 예상으론 wesley는 5, harry의 값은 16이 나와야 할 것이다.
코드를 확인해보자.
우리의 생각대로 값이 나오는것을 확인할 수 있다.
그렇다면 우리는 의문 한가지를 가질 수 있다.
연산을 하기전에 값을 올려준다 했으니
wesley와 harry의 값을 더하는 연산을 6번라인과 7번라인 사이에 넣게 된다면
연산 전에 값을 증가시키니 답은 21이 나올거라고 생각이 들 수 있다.
코드를 통해 확인해보자.
int wesley = 4;
int harry = 15;
int tistory = wesley + harry;
++wesley;
++harry;
System.out.println("wesley result = " + wesley);
System.out.println("harry result = " + harry);
System.out.println("wesley + harry = " + tistory);
우리의 예상대로 되는지 실행시켜보도록 하자
우리의 예상은 완전히 빗나갓다.
분명 wesley + harry를 통해 연산을 했기 때문이다.
하지만 그와중에 10번 라인의 wesley의 값과
11번 라인의 harry의 값은 출력했을때 증가했음을 알 수 있다.
이건 java의 특성때문이다.
위에서부터 읽기때문에 wesley에 4를 저장하고 harry에 15를 저장하고 wesley와 harry를 더한값을 tistory에
저장한다.
그다음 wesley의 값을 증가시키고
harry의 값을 증가시켜 준것이다.
만약 int tistory = wesley + harry의 라인을 9번라인과 10번라인에 넣게되면 어떤 결과를 가져올까
코드를 통해 알아보도록 하자.
int wesley = 4;
int harry = 15;
++wesley;
++harry;
int tistory = wesley + harry;
System.out.println("wesley result = " + wesley);
System.out.println("harry result = " + harry);
System.out.println("wesley + harry = " + tistory);
앞서 말한것처럼 위에서부터 읽는다면 이렇게 써야 tistory의 값이 5 + 16으로 21이 되야할것이다.
연산전 값을 증가시킨 후 더한다.
결과를 확인해보자.
이로써 우리는 코드를 적을 때 코드의 위치를 생각해야 한다는 것을 알 수있다.
위치에 따라 값이 변하기도 하기 때문이다.
그렇다면 이상태에서 wesley++과 harry++을 쓰면 어떻게될까?
연산을 한 후 증가를 시키니 tistory에는 19가 나와야 할까?
한번 확인해보자.
int wesley = 4;
int harry = 15;
wesley++;
harry++;
int tistory = wesley + harry;
System.out.println("wesley result = " + wesley);
System.out.println("harry result = " + harry);
System.out.println("wesley + harry = " + tistory);
우리의 예상은 또 다시 보기좋게 틀렸다.
항상 확인하는 습관을 들이도록 하자
왜 21이 나온것일까?
9번 라인의 연산을 실행 한 후 연산이 되는것이 아니란말인가?
라는 의문이 생길것이다.
이 해답은 이미 느낌적으로 알 수 있을것이다.
wesley++, harry++은 이미 이 자체로 증감연산자 단일로 사용이 된것이다.
앞에서 연산을 하는 과정이 들어가있다면 어떨까 ?
코드로 확인해보자.
int wesley = 4;
int harry = 15;
int tistory = wesley + harry;
wesley++;
harry++;
System.out.println("wesley result = " + wesley);
System.out.println("harry result = " + harry);
System.out.println("wesley + harry = " + tistory);
19로 나오는 것을 확인할 수 있다.
wesley와 harry 또한 값이 증가하였다.
지금까지의 과정을 통해 우리는 java 구문의 위치의 중요성을 알 수 있다.
지금까지 한 과정이 연산 전 후로 나뉘어 보인것 처럼 보이지만
해당 과정은 그저 int tistory = wesley + harry; 의 구문 위치에 따라 값이 바뀌는 것을 알수 있던것이다.
wesley++과 ++wesley 는 지금까지의 예시에서 단일로 사용된 것으로써 연산 전후는 상관이 없던 내용이다.
우리는 이런식으로 증감 연산자에 대해 착각을 하는 것이였다.
나는 자바를 처음 개발언어로 시작했기 때문에 특성또한 모르고 아무것도 몰랐던 상태에서 배울때
굉장히 애를 먹었던 내용이다.
이 문구는 꼭 읽기를 바란다.
그렇다면 우리는 이제 증감 연산자의 연산 전후에 대해 알아보아야한다.
우리는 여기서 또 하나 다른 예시를 적어본다.
해당 코드를 보자
int x = 4;
int y = 15;
int z;
z = ++x;
System.out.println("z = " + z);
System.out.println("x = " + x);
System.out.println("-----------------");
x = 4;
z = x++;
System.out.println("next z = " + z);
System.out.println("next x = " + x);
코드를 설명해보겠다.
1. int 타입의 x 에 4를 저장
2. int 타입의 y 에 15를 저장
3. z를 int 타입으로 설정
4. z = ++x 작성 (연산전 x값 증가)
5. z값 출력
6. x값 출력
7. 구분선
8. x값 4로 초기화
9. z= x++ 작성 (연산후 x값 증가)
10. next z값 출력
11. next x값 출력
해당 코드의 값을 예측해본다.
첫번째 z와 x의 값은 ++x로 인해 연산 전 x의 값이 증가해 x의 값이 5가 된 후 z의 값이 5로 저장될 것이다.
바뀌어버린 x의 값 초기화.
두번째 z와 x의 값은 x++로 인해 z에 x의 값 4가 저장이 된 후 x의 값이 증가하여 x의 값이 5로 저장될 것이다.
코드의 결과값을 확인해보자.
우리의 예측은 맞앗다. 다음 아래 예제를 통해 더 성장해보자.
아래 코드를 살펴보자.
int wesley = 1;
int harry = 1;
int result1 = ++wesley + 10;
int result2 = harry++ + 10;
System.out.println("result1 = " + result1);
System.out.println("result2 = " + result2);
우리는 이제 제대로 예측을 해보도록 하자.
result1의 값은 뭐가나올까 ++wesley는 연산 전 값을 증가시킨다 했다.
그렇다면 result1 = 2 + 10 으로 12가 나와야 할 것이다.
result2의 값은 뭐가 나올까 harry++이므로 연산 후 값이 증가해야 할 것이다.
그렇다면 result2 = 1 + 10으로 11이 나와야 할 것이다.
결과값을 한번 보자
우리의 예상은 맞았다.
이것이 표에 나와있던 ++a, a++ 연산 전 후 의 의미를 뜻한다.
항상 우리는 오해를 불러일으키지 않도록 자바의 위에서부터 읽어오는 특성을 잊어선 안된다.
다음 예제를 살펴보면서 자신의 생각과 같은지 확인해보자.
변수는 a, b, c를 사용해보겠다.
int a = 10;
int b = 10;
int c;
System.out.println("-------------------");
a++;
++a;
System.out.println("a = " + a);
System.out.println("-------------------");
b--;
--b;
System.out.println("b = " + b);
System.out.println("-------------------");
c = a++;
System.out.println("c = " + c);
System.out.println("a = " + a);
System.out.println("-------------------");
c = ++a;
System.out.println("c = " + c);
System.out.println("a = " + a);
System.out.println("-------------------");
c = ++a + b++;
System.out.println("c = " + c);
System.out.println("a = " + a);
System.out.println("b = " + b);
우선 결과값을 먼저 보겠다.
색깔별 네모칸 별로 해설을 해보도록 하겠다.
노란네모칸 : a++ 과 ++a를 단일로 사용했기 때문에 10에서 +1+1을 해준다. 결과값은 a = 12가 저장된다.
빨간네모칸 : b-- 와 --a를 단일로 사용했기 때문에 10에서 -1-1을 해준다. 결과값은 b = 8이 저장된다.
초록네모칸 : c = a++이 적혀져있다. c에는 기존 a의 값이 저장 된후, a++은 연산을 한 후 a의 값이 증가한다. 결과값은 a = 13, c = 12가 된다.
파란네모칸 : c = ++a가 적혀있다. ++a는 연산 전 a의 값이 증가한다 고로 a = 14, c = 14 값이 나오게된다.
보라네모칸 : c = ++a + b++이 적혀있다. ++a는 연산 전(+) 값이 먼저 증가하고, b++은 연산 후 값이 증가하게 된다.
c의 값은 15(a)+8(b) = 23이 되고 난 후 b의 값이 +1 되어 a = 15, b = 9, c = 23의 결과값이 나타난다.
이로써 증감연산자의 이해를 마치도록한다. 처음 사용시 너무나도 헷갈리는 내용이기 때문에
잘 이해하고 넘어간다면 수월하게 사용을 할 수 있다.
'IT Program > Java Basic' 카테고리의 다른 글
자바(java) 조건문(if) & if-else & 중첩 if문 & Math.random()함수 (0) | 2022.03.01 |
---|---|
java 논리 부정 연산자(!) & 논리 연산자 종류{AND(&&),OR(|),XOR(^),NOT(!)} & 원하는 문자 한번에 바꾸는 법(Replace/Find) (0) | 2022.03.01 |
자바(java) 연산자 & 연산자 종류 & 단항연산자 & 이항연산자 & 삼항연산자 (2) | 2022.02.28 |
자바(java) 타입 변환 & 자동 타입 변환 & 강제 타입 변환 & 데이터 타입 크기 & 아스키코드표 (2) | 2022.02.27 |
자바(java) 띄어쓰기 하는 법 & 이스케이프 문자(\t, \n, \",\') (4) | 2022.02.27 |