본문 바로가기

Java

java - 논리연산자, 그 외 연산자

19.11.21. 논리연산자, 그 외 연산자.

베이직자바

2019-11-22 00:17:40


▶논리 연산자

- &&(AND) : 피연산자 둘 다 true 이면 true를 결과로 얻는다. 
- ||(OR) : 피연산자 중 하나라도 true 이면 true를 결과로 얻는다.
- ! (NOT) : 피연산자가 true 이면 false 를, false 이면 true 를 결과로 얻는다.
- 피연산자로 boolean 만 허용한다.

 

*&&가 ||보다 우선순위가 높다!

 

* 논리연산자는 효율적인 계산을 함. 왼쪽에서 결과가 정해지면 오른쪽은 수행하지 않음.

    int d = 10;
    b = d < 10 && 0 < d++; 

    System.out.println(d);

     => 왼쪽에서 이미 false 가 되었기에 오른쪽의 d++은 실행되지 않아 d의 값이 변하지 않는다.

 

*연산의 우선순위

산술 연산 > 비교 연산 > 논리 연산

 

▶비트 연산자

 비트 : '1바이트가 8개의 비트이다.' 할 때 비트. 0 혹은 1을 표현할 수 있다.
 비트연산자 : 0 혹은 1로 연산을 한다.

  - | (OR)         : 피연산자 중 한쪽이라도 값이 1이면, 1을 . 그 외에는 0을 결과로 얻는다.
  - & (AND)     : 피연산자 양 쪽이 모두 1이어야만 1을, 그 외는 0을 결과로 얻는다.
  - ^ (XOR)      : 피연산자의 값이 서로 다를 때만 1을, 같을 때에는 0을 결과로 얻는다.
  - ~ (비트전환) : 피연산자를 0은 1로, 1은 0으로 바꾼다.
  - << (쉬프트)  : 피연산자의 각 자리를 왼쪽으로 이동시킨다. 빈칸은 0으로 채운다.
  - >> (쉬프트)  : 피연산자의 각 자리를 오른쪽으로 이동시킨다.

                        빈칸은 앞자리와 동일한 값으로 채운다.

 

1바이트는 8비트로 이루어져있고, 1비트는 0 또는 1을 표현할 수 있다.

즉, 1 바이트는 8개의 0또는 1을 표현할 수 있다. (8자리)

 

* 10진수를 2진수로 바꾸는 방법 : 10진수 값을 1이 될 때까지 2로 나눈다.

Q : 10을 2진수로 바꿔보자.

5...0

2...1

1...0

 답 : 1010. ㄴ 의 좌우대칭 순서로 읽어온다. 1바이트로 표현하면 00001010

 

* 2진수를 10진수로 바꾸는 방법 : 1의 자리부터 각 자리에 1,2,4,8,16,32...를 곱한 값을 더한다.

Q :  1010을 10진수로 바꿔보자.

    1     0     1     0

 8     4      2     1

=  +  0  +  +  0 

답 : 10. 마지막 줄을 모두 더한다.

 

▶기타 연산자

  - .(참조연산자)  : 특정 범위 내에 속해 있는 멤버를 지칭할 때 사용한다.

                         클래스 내의 메서드를 부를 때 사용. 
  - (type)            : 형 변환(casting)
  - ?: (삼항 연산자) : 조건식? 조건식이 참일 경우 수행할 문장 : 조건식이 거짓일 경우 수행할 문장.

  - instanceof       : 참조형 타입 확인

 

 

 

예시)

00001010 : 10
00001111 : 15
위 두 숫자의 |(OR) 연산의 결과 : 00001111 = 15네
System.out.println(10 | 15);       //15

 & (AND) 연산의 결과 : 00001010 = 10
System.out.println(10 & 15);      //10

 ^(XOR) 연산의 결과 : 00000101 : 
System.out.println(10 ^ 15);        //5

 ~(비트 전환) 연산의 결과(10을 가지고 해 보자) : 11110101 
System.out.println(~10);            //-11
//2진수의 맨 왼쪽 자리가 1이면 음수, 0이면 양수다. 그런데 음수면 읽는 방식이 좀 달라짐.

<< (시프트) 연산(10으로 해보자) : 00010100
System.out.println(10 << 1);      //20
10 을 시프트 연산하는데, 왼쪽으로 1 칸 이동하라는 뜻. 

>> (시프트) 연산(10으로 해보자) : 00000101
System.out.println(10 >> 1);      //5

 

?: (삼항 연산자) 연산의 결과 : 
int x = 10;
int y = 20;
int result = x < y ? x : y;
//true : int result = x
//false : int result = y
System.out.println(result);        //10 true 기때문.

 

Q : 변수에 저장된 주민등록번호 뒷자리의 첫 번째 숫자가 1이나 3이면 '남자'를,
2 나 4면 '여자'를 출력해주세요. 그 외의 숫자는 '확인불가'를 출력해 주세요.
int n = 2;
String r = n == 1 || n == 3 ? "남자" : (n == 2 || n == 4 ?  "여자" : "확인 불가");
System.out.println("당신의 성별은 '" + r + "'입니다.");