'비트 및 논리 연산자'에 해당되는 글 1건

  1. 2007.07.18 연산자의 우선 순위 (3)

5. 관계 연산자
관계 연산자는 <, >, >=, <=, ==, != 같은 것들이다. 역시 몇가지는 수학공식에서 숱하게 보는 것이니 설명은 생략. 다만, 이 관계 연산자를 통해 갖게 되는 값은 항상 true 나 false 같은, 논리 값들이며, 이러한 값들이 변수에 저장이 된다.
1//    class Exam05_06 {
2//        public static void main(String[] args) {
3//           boolean a = 5 < 3;
4//           boolean b = 10 == 10;
5//
6//           System.out.println("A = " + a);
7//           System.out.println("B = " + b);
8//
9//           boolean c = a!=b;
10//           boolean d = a=!b;
11/
12//           System.out.println("C = " + c);
13//           System.out.println("D = " + d);
14//        }
15//    }
여기서는 몇가지 관계 연산자를 사용하였다.

4번째 라인
: == 이것은, 우리가 흔히 수학에서 사용하는 공식 = 와 같은 개념이다. 하지만, 자바에서의 = 는 수학공식에서의 = 와는 약간은 다른 개념이다. 자바에서의 = 는 대입 연산자로 대입의 의미가 강하며, == 는 관계 연산자로, 두 식이 같다를 의미하고 있다.

9번째 라인 ~ 13번째 라인
: 9번째 라인에서는 a!=b , 10번째 라인에서는 a=!b 가 사용되었는데, 이 둘은 다른 의미를 가지고 있다. 9번째 라인에서 a 라는 변수와 b 라는 변수가 다르다는 것을 나타내 주고 있다. 10번째 라인에서는 b 를 논리 부정 연산자인 ! 를 사용하여 먼저 변수b 를 부정한다음, 이를 a 에 대입하고, 최후로, 변수 d 에 대입하라는 이야기이다.

논리 부정 연산자가 대입 연산자보다 우선순위가 먼저이기 때문에 논리 부정 연산자가 먼저 실행이 되는 것이다. a의 값은 false 가, b의 값은 true 가, c의 값은 true가, d의 값은 false 가 저장, 출력된다.


6. 비트, 논리 연산자
비트 연산자는 비트로 변환시켜 연산하는 연산자로, &, |, ^ 등이 있고, 논리 연산자는 참, 거짓이라는 논리 값으로 연산하는 연산자로, &&, || 등이 있다..
1//    class Exam05_07 {
2//        public static boolean aaa() {               
3//           System.out.println("AAA");
4//           return false;
5//        }
6//  
7//        public static boolean bbb() {
8//           System.out.println("BBB");
8//           return true;
10//        }
11//
12//        public static void main(String[] args) {
13//           int a = 4;
14//           int b = 7;
15//
16//           System.out.println("& = " + (a & b));
17//           System.out.println("| = " + (a | b));
18//           System.out.println("^ = " + (a ^ b));
19//
20//           boolean c = 8 < 5 && 15 > 8;
21//           boolean d = 10 != 28 || 7 <= 5;
22//
23//           System.out.println("C = " + c);
24//           System.out.println("D = " + d);
25//
26//           boolean e = aaa() & bbb();    // 비트 연산자가 논리 연산자처럼 사용
27//           System.out.println("E = " + e);
28//        }
29//    }
위의 소스 코드는, 비트 연산자와 논리 연산자를 함께 설명하고 있다.


13번째 라인 ~ 18번째 라인
: & 연산은 두개의 값을 비트로 변환 시켜서, 비트끼리의 연산을 실행한다. 그래서 만약 두 비트가 모두 참이면 참을 출력한다. 비트안에서의 참은 1이고, 거짓은 0이다.
| 연산은 두개의 값이 모두 거짓이면, 거짓을 출력한다.
^ 연산은, 두 비트가 다르면, 참을 출력하고, 같으면 거짓을 출력한다.

13번째 라인과 14번째 라인에서 사용된 변수를 놓고 보자면, 다음과 같다.
0100          // 4
0111          // 7

& 연산         ☞        0100          // 둘다 참이면 참, 그외는 거짓
| 연산         ☞        0111         // 둘다 거짓이면 거짓, 그외는 참
^ 연산         ☞        0011         // 두 비트가 틀리면 참, 그외는 거짓
출력되는 값은 차례로, 4, 7, 3 이다.

20번째 라인 ~ 24번째 라인
: && 연산은 두개의 식을 비교해서, 두 식이 모두 참이면, 참을 출력한다. 반대로 || 는 두개의 식을 비교해서 두 식이 모두 거짓이면 거짓을 출력한다.

이  둘은 논리 연산자로서, 논리 단위인 true 나 false 값으로 연산한다. 이 연산자에게는 한 가지 특징이 있다. 만약 && 연산을 취한다면, 두개의 식을 비교하고, 첫 식이 거짓이라고 판단되면, 다음 식을 판단 하나, 안하나, 전체의 값은 거짓으로 결과가 나온다. || 연산 역시, 앞의 식이 참이라면, 다음 식을 검사 하나, 안하나, 전체의 식은 참이라는 결과가 나온다. 이러한 특성은, 불필요한 계산을 무시, 프로그램의 속도를 좀더 원활히 해주는 장점이 있다. 하지만 다음과 같은 단점이 생긴다.


2번째 라인 ~ 10번째 라인, 26번째 라인 ~ 27번째 라인
: 만약 26번째 라인에서 & 연산 대신, && 연산을 시켜버리면 어떻게 될까? 2번째 라인 ~ 5번째 라인의 aaa() 라는 메소드의 실행이 먼저 되고, 이 값이 false 를 반환하면서, 26번째 라인은 bbb() 라는 메소드를 무시하고, 바로 false 라는 값이 변수 e에게 저장이 된다.

이런 경우, 가끔가다, 두개의 메소드를 모두 실행시켜주는 경우가 발생한다. 하지만, && 연산이나, || 연산은, 앞의 식만을 판별해서, 뒤의 식을 무시하게 될수도 있다. 이러한 현상을 보완하고자, 앞에서 설명한 비트 연산자가, 논리 연산자처럼 사용되는 경우가 있다.

이렇게 비트 연산자가 논리 연산자처럼 사용되는 경우에는, 두개의 식을, 무조건, 모두 실행 시키고, 값을 출력해 주게 된다. 즉, 위의 경우에서는, aaa() 라는 메소드를 실행 시키고, false 를 반환받고, false 라는 값을 반환 받았음에도 불구하고, 뒤에 bbb() 라는 메소드를 실행시킨 후 true 라는 값을 반환받는다. false 와 true 를 & 으로 연산해서, false 라는 값이 변수 e에 저장이 되고, 27번째 라인에서 출력이 되게 된다.


p.s 위의 글들은, 김승현 강사님열혈강의 Java Programming 의 Round 5-4, 동영상 강좌에 기초한 내용입니다.
:

BLOG main image
아무거나 공부하자!!! by Young79

공지사항

카테고리

분류 전체보기 (79)
Programing (29)
English (31)
Graphic (4)
Saying on T"We"tter (15)

최근에 올라온 글

최근에 달린 댓글

글 보관함

달력

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total :
Today : Yesterday :