본문 바로가기

language/java

7-2. [java] i++, ++i 의 차이, 논리 연산자(논리 게이트)

728x90
반응형

저번시간에 간단하게 java의 연산자들에 대해 알아보았다.

 

그중 증감연산자 i++와 ++i의 차이와 논리 연산자들에 대해서 자세히 설명하지 않아서 이번시간에는 

이것들에 대해 자세히 알아보도록 하겠다.

 

우선 증감연산자 i++ 와 ++i의 차이점이다.

간단하게 얘기하면 i++는 먼저 i의 값을 1 올려주고 그다음에 다른 연산을 수행하겠다는 얘기이다.

반면에 ++i 같은 경우는 다른 연산을 먼저 수행하고, 그 연산이 다끝나면 i의 값을 1 올려주겠다는 얘기이다.

간단한 예시를 들어보겠다.

int x1 = 1;
int x2 = 1;

int R1 = ++x1 + 10;
int R2 = x2++ + 10;

위와 같이 연산한다면 결과는 어떻게 될까??

우선 x1과 x2의 값은 둘다 모두 2로 변해있을 것이다.

R1의 값은 12가 나오고 R2의 값은 11이 나올것이다. 

그 이유는 R1의 경우는 ++x1이 2로 계산되고 +10을 하였기 때문이고,

R2의 경우에는 x2++이 1로 계산되고 + 10을 먼저 계산하여 R2의 값을 준 이후에 x2의 값이 1 상승한 것이다.

실전에서는 두개를 비교하면서 잘 사용하지 않지만, 이러한 차이점이 있다는 것을 기억해두면 좋다.

 

이번에는 논리 연산자에 대해 알아보겠다.

 

우선 & 이것은 and 연산자라 하고

| 이것은 or 연산자라 한다.

우선 디지털 논리에 대해 알고 있으면 좋은데, 컴퓨터에서는 0과 1만 존재하는 이진법을 바탕으로 돌아간다.

위의 그림처럼 디지털은 0과 1로만 이루어져 있다. 위쪽을 향할때는 1 아래쪽을 향할때는 0값을 가지게 되는것이다.

그리고 자바 논리에서는 1값은 true 0값은 false라 여긴다.

 

우선 and 연산 부터 보겠다. and의 경우에는 0과 1의 곱셈이라 생각하면 편하다. 하나라도 0(false) 값을 가진다면

0을 출력할거고, 반드시 둘다 1(true) 일 경우에만 1을 출력할 것이다.

A B 결과
1(TRUE) 1(TRUE) 1(TRUE)
1(TRUE) 0(FALSE) 0(FALSE)
0(FALSE) 1(TRUE) 0(FALSE)
0(FALSE) 0(FALSE) 0(FALSE)

 

이번엔 or 연산을 보겠다. or은 피연산자 중에 단 하나라도 1이 있을경우에는 1을 출력해주고 그렇지 않다면 0을 출력해준다.

A B 결과
1(TRUE) 1(TRUE) 1(TRUE)
1(TRUE) 0(FALSE) 1(TRUE)
0(FALSE) 1(TRUE) 1(TRUE)
0(FALSE) 0(FALSE) 0(FALSE)

 

이번엔 xor 연산을 보겠다. xor은 exclusive OR으로 배타적 논리합이라 한다.

xor은 피연산자들의 값이 같다면 0을 출력해주고 같다면 1을 출력해준다.

A B 결과
1(TRUE) 1(TRUE) 0(FALSE)
1(TRUE) 0(FALSE) 1(TRUE)
0(FALSE) 1(TRUE) 1(TRUE)
0(FALSE) 0(FALSE) 0(FALSE)

 

그러면 and와 or 그리고 xor 까지 알아보았다.

이것들이 자바에선 어떻게 사용되는지 알아보자.

우선 and는 &&와 & 두가지가 있고,

or도 마찬가지로 ||와 | 두가지가 있다.

그렇다면 하나만 있는것과 2개의 차이점에 대해 알아보자.

사실 두개의 결과값은 동일하게 나온다. 하지만 컴퓨터가 코드를 동작할때만 약간의 차이점이 존재하는데

&&,|| 같은 경우에는 앞의 피연산자를 확인하고 그 결과값에 따라 뒤의 피연산자를 확인한다.

예시로는 FALSE && TRUE 의 연산이 있다면 앞의 FALSE만 보더라도 뒤에 어떤것이 오든 이미 결과값은 FALSE가 된다.

이럴경우 뒤의 피연산자를 아예 확인하지 않고 결과값을 출력해준다는 것이다. 

따라서 코드 진행 속도상으론 &&과 ||가 조금더 효율적이긴 하다.

그러면 &와 |가 필요없는거 아닌가? 싶을 수 있지만 이 2가지는 논리연산자가 아닌 비트 연산자로 사용할 때 사용된다.

이 비트 연산자의 경우는 임베디드 시스템, 디지털 회로쪽으로 가게된다면 유용하게 쓰이겠지만,

웹 개발의 경우에는 거의 사용되지 않을 것이다. 기회가 되면 한번 다뤄보겠다.

반응형