일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Matrix
- 코딩테스트
- bit manipulation
- array
- Data Structure
- 코테
- 파이썬
- string
- Binary Tree
- Class
- Method
- geometry
- simulation
- 자바
- SQL
- Tree
- 구현
- Math
- java
- Counting
- greedy
- hash table
- implement
- dynamic programming
- Number Theory
- database
- sorting
- Binary Search
- Stack
- two pointers
- Today
- Total
코린이의 소소한 공부노트
비교 연산과 논리 연산 본문
비교/논리 연산은 각각 비교/논리 연산자를 이용한 연산을 말한다.
이 글에서는 연산 위주로 설명하고 있으므로, 연산자에 대한 자세한 설명을 원한다면 아래 링크를 참조하면 된다.
2021.12.28 - [Java] - 연산자(operator)의 종류와 우선순위, 결합규칙
비교 연산자는 총 6개이다. 기호가 2개씩 붙어있는 연산자는 순서를 바꾸면 안 된다.
1. 대소 비교 연산자
보통 크기 비교는 숫자만 한다고 생각하지만, char도 정수 리터럴을 사용할 수 있으므로 대소 비교가 가능하다.
System.out.println('A' > 'B'); // false
// 연산 과정
char > char -> int > int -> 65 > 66 -> false
// int보다 작은 타입은 int로 변환된다.
2. 등가 비교 연산자
참조형인 문자열(string)도 등가 비교 연산자나 equals() 메서드를 이용해 등가 비교를 할 수 있다.
// 1) 기본형처럼 선언한 경우
String s1 = "abcde";
String s2 = "abcde";
System.out.println(s1 == s2); // true
System.out.println(s1.equals(s2)); // true
// 2) 객체 생성 키워드를 쓴 경우
String s3 = new String("abcde");
String s4 = new String("abcde");
System.out.println(s3 == s4); // false
System.out.println(s4.equals(s4)); // true
여기서 주의할 점은 객체를 생성해서 등가 비교 연산자를 썼을 때이다. 문자열은 참조형이기 때문에 값("abcde")이 저장된 기억공간의 주소가 변수(s1 ~ s4)에 저장된다. new 키워드를 사용한 s3와 s4의 경우에는 각각 다른 저장공간에 객체가 생성돼서 s3과 s4가 다른 주소에 같은 값을 갖게 된다. 그래서 등가 비교를 쓰면 주소가 다르기 때문에 false가 반환이 되고, equals()를 쓰면 해당 주소의 값을 비교하게 되어 true가 반환되는 것이다. s1와 s2는 2가지 연산 결과가 왜 모두 true인지 확인하고 싶다면 이 글을 따라가면 된다.
논리 연산자는 총 3개가 있다. 우선순위는 NOT이 가장 높고 그다음 AND, OR순이다.
1. || OR연산(또는)
- 피연산자가 모두 false일 때 false를 반환한다.
- 그 외의 경우에는 true를 반환한다.
2. && AND연산(그리고)
- 피연산자가 모두 true일 때 true를 반환한다.
- 그 외의 경우에는 false를 반환한다.
3. ! NOT연산(아니다)
- 피연산자의 반대 값을 반환한다.
boolean b = true;
System.out.println(!!b); // true
// !은 단항 연산자이므로 오른쪽에서 왼쪽으로 계산한다.
// !!b -> !(!b) -> !(!true) -> !false -> true
논리 연산 몇 가지를 예시로 들어보려 한다.
1) x는 두 자리 자연수이다.
- 두 자리 자연수라고 하면 10부터 99까지니까 x는 10보다 크고 100보다 작다.
- '그리고'가 들어가므로 AND연산이다.
-> 수학에서는 10 <= x < 100 이라고 표현하겠지만, 논리 연산자는 이항 연산자이므로
10 <= x && x < 100
// 이렇게 나눠서 표현해야한다.
2) y는 2의 배수 또는 5의 배수이다.
- 배수 표현은 나머지 연산을 이용한다.
- '또는'이라는 말이 들어갔으므로 OR연산이다.
y%2==0 || y%5==0
3) z는 2의 배수 또는 5의 배수인 두 자리 자연수이다.
- 1), 2)번을 합친 것이다.
- 우리의 의도대로 하려면 두 번째 괄호는 꼭 있어야 한다. 첫 번째 괄호는 없어도 된다. 우선순위가 같은 논리 연산자는 앞에서부터(왼쪽에서부터) 계산되기 때문이다.
( 10 <= z && z < 100 ) && ( y%2==0 || y%5==0 )
4) 문자 c는 숫자('0'~'9')이다.
- 유니코드에서 0부터 9까지는 연속적인 수로 되어있기 때문에 1)번을 응용해서 표현할 수 있다.
- '0' 대신 48, '9'대신 57을 써도 된다.
'0' <= c && c <= '9'
5) 문자 c는 알파벳 대문자 또는 소문자이다.
- 알파벳도 대소문자끼리 각각 연속적인 숫자코드로 되어있기 때문에 4)번을 응용해서 쓸 수 있다.
- 괄호는 없어도 무방하다.
('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
6) 문자 c는 알파벳 대문자가 아니다.
- 알파벳 대문자의 반대이므로 ! 연산을 이용하면 된다.
- 괄호가 꼭 필요하다.
!('A' <= c && c <= 'Z')
'Java' 카테고리의 다른 글
제어문과 블록, 특별한 키워드 (0) | 2022.01.03 |
---|---|
조건 연산과 대입 연산 (0) | 2022.01.01 |
산술 연산자와 산술 변환 (0) | 2021.12.31 |
형변환(type casting) (0) | 2021.12.29 |
연산자(operator)의 종류와 우선순위, 결합규칙 (0) | 2021.12.28 |