목차
- 산술 연산자
- 복합 대입 연산자
- 증감 연산자
- 비교 연산자
- 논리 연산자
- 삼항 연산자
1. 산술 연산자
- 사칙연산(+, -, *, /)에 나머지 연산자(%)까지 포함한 것을 일컫는다.
- 연산 실행을 위해 두 개의 값 또는 변수를 필요로 하는 이항연산자이다.
- 연산 방향은 보통 왼쪽에서 오른쪽으로 진행하지만, 연산자간 우선순위가 있어 이를 따른다.
int num1 = 10;
int num2 = 20;
System.out.println("num1 + num2 = " + (num1 + num2));
int intDiv = num1 / num2;
System.out.println("num1 / num2 = " + intDiv);
double doubleDiv = (double)num1 / num2;
System.out.println("num1 / num2 = " + doubleDiv);
num1 + num2 = 30
num1 / num2 = 0
num1 / num2 = 0.5
정수형 int형을 선택한 intDiv 변수와 실수형 double형으로 표현된 doubleDiv 변수의 반환 값이 각각 0과 0.5로 다름을 알 수 있다. 자료형에 따라 표현하는 값의 범위가 다르므로 이 경우에는 나누기 연산이 일어나기 전에 double형으로 바꿔야 한다. 여기서 만약 식을 (double)(num1 / num2)처럼 기술했다면, 괄호 안에서 int형끼리 계산이 일어나므로 0이라는 값에 머물게 됨을 주의하자.
✅ 산술 연산자간 우선순위를 이해하고 있다.
✅ 산술 연산자를 이용하여 데이터 연산을 수행할 수 있다.
2. 복합 대입 연산자
- 하단의 예시는 num3이라는 변수에 12라는 값을 대입시킨 대입 연산자이다.
int num3 = 12;
System.out.println("num3 = " + num3);
num3 = 12
- 복합 대입 연산자는 +=, -=, *=, /=처럼 작성한다.
- num3 /=4는 곧 num3 = (num3 / 4)로 풀어쓸 수가 있다.
- 아래는 -5가 대입이 된 예이다. 산술 복합 대입 연산자 순서에 주의하여야 한다.
num3 /= 4;
System.out.println("num3 = " + num3);
num3 =- 5;
System.out.println("num3 = " + num3);
num3 = 3
num3 = -5
✅ 복합 대입 연산자 작성 순서를 이해하고 있다.
✅ 복합 대입 연산자를 이용하여 데이터 연산을 수행할 수 있다.
3. 증감 연산자
- ++은 1 증가, --는 1 감소의 의미를 갖는다.
- 피연산자의 앞 또는 뒤에 붙여 사용하는데 이를 두고 전위연산 ++num;과 후위연산 num++;이라고 한다.
int a = 10;
int b = ++a;
a = 10
b = 11
- 1 먼저 증가(++) 시킨 후 → 그 값을 b에 대입했으므로 위 예시의 a와 b를 출력하거든 a = 10, b = 11이라는 값을 반환한다.
- 반면 아래 예시에서는 d = a 대입 먼저 진행된 후 → a에 1 증가(++) 시켜 c = 11, d = 10이 나온다.
int c = 10;
int d = c++;
c = 11
d = 10
이처럼 다른 연산자와 함께 쓰일 때는 전위연산, 후위연산을 구분하여 사용하여야 한다.
❗ 후위연산의 경우 다른 연산자 우선 처리하고 → 후위연산이 진행됨에 주의하자. 대입연산자가 있으면 대입연산자 먼저, 출력문이 있다면 출력문이 먼저 출력된다.
✅ 전위연산, 후위연산의 차이를 이해하고 있다.
✅ 전위연산, 후위연산를 구분하여 사용할 수 있다.
4. 비교 연산자
- 데이터가 같은지(==), 다른지(!=), 크고 작은지(>, <, >=, <=) 비교할 때 쓰인다. 즉, 피연산자의 상대적인 크기를 판단하는 데에 사용되는 연산자이다.
- 따라서 결과는 true 또는 false라는 논리값으로 나온다.
A. 정수값, 실수값, 문자값 비교
- 정수형, 실수형 외 문자형까지 모든 비교 연산자 사용이 가능하다. 특히 문자형은 컴퓨터가 숫자로 인식하고 있기에 크고 작은 크기 비교까지 가능한 셈이다.
char ch = 'a';
int inum = 97;
double dnum = 98.0;
System.out.println("ch가 inum과 같은지 = " + (ch == inum));
System.out.println("ch가 inum과 다른지 = " + (ch != inum));
System.out.println("inum이 dnum보다 크거나 같은지 = " + (inum >= dnum));
System.out.println("inum이 dnum보다 작거나 같은지 = " + (inum <= dnum));
ch가 inum과 같은지 = true
ch가 inum과 다른지 = false
inum이 dnum보다 크거나 같은지 = false
inum이 dnum보다 작거나 같은지 = true
B. 논리값 비교
- 논리형 boolean형은 같다(==) 혹은 같지 않다(!=)는 비교 연산만 가능하다. true와 false 중 어느 것이 큰지 알 수 없듯 그밖에 크고 작은 크기 비교는 논리형이 가질 수 있는 값의 특성상 불가한 것이다.
boolean usb = true;
boolean hdmi = false;
System.out.println("usb와 hdmi 상태가 같은지 = " + (usb == hdmi));
System.out.println("usb와 hdmi 상태가 다른지 = " + (usb != hdmi));
usb와 hdmi 상태가 같은지 = false
usb와 hdmi 상태가 다른지 = true
C. 문자열값 비교
- 참조형 String 역시 마찬가지다. 문자열이 갖게 되는 값과 그 특성상 같다(==) 혹은 같지 않다(!=)는 비교만 할 수 있다. "Hello"와 "Hi" 중 어느 것이 더 적은 값인지 논할 수가 없기 때문이다.
String greeting1 = "Hello";
String greeting2 = "Hi";
System.out.println("greeting1과 greeting2가 같은지 = " + (greeting1 == greeting2));
System.out.println("greeting1과 greeting2가 다른지 = " + (greeting1 != greeting2));
greeting1과 greeting2가 같은지 = false
greeting1과 greeting2가 다른지 = true
✅ 데이터마다 적용 가능한 비교 연산자 종류를 이해하고 있다.
✅ 문자형으로 값의 상대적 크기 비교가 가능한 이유를 설명할 수 있다.
✅ 논리형 boolean과 참조형 문자열 String의 경우 왜 같다, 같지 않다는 비교만 가능한지 설명할 수 있다.
5. 논리 연산자
- 논리값 true, false를 취급하는 연산자이다. 한 가지 조건뿐 아니라 여러 가지 조건을 고려했을 때 사용한다.
- AND 연산자 &&는 두 연산자가 모두 true일 때 true 반환한다.
- OR 연산자 ||는 두 피연산자 중 하나만 true여도 true 반환한다.
❗ 논리 연산자 우선순위에 주의하자. && 연산자가 || 연산자보다 우선순위가 높다! 필요 시 최우선 연산자인 괄호()를 사용하여 원하는 값을 유도할 수 있다.
❗ Dead code : AND 연산자와 OR 연산자 특성상 첫 번째 조건만으로 이미 true 또는 false 값이라는 근거가 얻어졌기에 굳이 다른 항을 살피지 않게 된다.
System.out.println("true-true간 OR 연산 = " + (true || true)); System.out.println("true-false간 OR 연산 = " + (true || false)); System.out.println("false-true간 AND 연산 = " + (false && true)); System.out.println("false-false간 AND 연산 = " + (false && false));
A. 값이 1~100 사이 숫자인지
int inum = 108;
System.out.println("값이 1~100 사이 숫자인지 = " + (1 <= inum && inum <= 100));
값이 1~100 사이 숫자인지 = false
B. 영문자인지
/* 2-1. 소문자 또는 대문자 */
char ch1 = 'R';
System.out.println("값이 영문자인지 = " + (('a' <= ch1 && ch1 <= 'z') || ('A' <= ch1 && ch1 <= 'Z')));
/* 2-2. 소문자 */
System.out.println("값이 소문자인지 = " + ('a' <= ch1 && ch1 <= 'z'));
/* 2-3. 대문자 */
System.out.println("값이 대문자인지 = " + ('A' <= ch1 && ch1 <= 'Z'));
값이 영문자인지 = true
값이 소문자인지 = false
값이 대문자인지 = true
✅ 논리 연산 중 dead code 경고가 뜨는 이유에 대해 설명할 수 있다.
✅ 논리 연산자 우선순위를 이해하고 있다.
✅ 논리 연산자를 사용하여 데이터 연산을 수행할 수 있다.
6. 삼항 연산자
- 앞서 배운 단항 a++, --b 또는 a + b 같은 이항 연산자에서 더 나아가 피연산자 항목이 3개인 연산자를 삼항 연산자라 한다.
- 아래 형태로 사용되며 식1 자리는 true일 때 반환할 값, 식2는 false일 때 실행할 값을 넣는다.
❗ (조건식) ? 식1 : 식2;
- 입력된 문자를 토대로 yes or no를 구분하고자 하는 예시를 아래와 같이 작성해봤다. Y/y일 경우 YES, N/n일 경우 NO를 반환할 텐데 데이터가 대문자인지 소문자인지 알 수 없으므로 논리 연산자 OR ||를 활용한 예이다.
char ch2 = 'y';
String result = ('y' == ch2 || ch2 == 'Y') ? "YES" : "NO";
System.out.println("YES OR NO = " + result);
YES OR NO = YES
- 삼항연산자 안에 삼항연산자 중첩 사용도 가능하다. 문법적으로 얼마든지 중첩 가능하나, 간략하게 표기해도 괜찮을 때만 사용하는 것이 좋다. 그밖에 조금 더 복잡한 상황에는 연산자 중첩 대신 조건문을 사용한다.
- 80점 이상은 "합격입니다."를 출력하고, 그 미만의 점수에는 "불합격입니다." 그리고 1~100 사이 점수가 아닌 숫자 0을 입력한 경우 안내 메시지가 뜨도록 만든 예시이다.
int score1 = 98;
String pass1 = (score1 >= 80) ? "합격입니다." : ((1 <= score1 && score1 < 80) ? "불합격입니다." : "잘못 입력하셨습니다. 점수를 입력해 주세요.");
System.out.println("합격 여부 = " + pass1);
int score2 = 34;
String pass2 = (score2 >= 80) ? "합격입니다." : ((1 <= score2 && score2 < 80) ? "불합격입니다." : "잘못 입력하셨습니다. 점수를 입력해 주세요.");
System.out.println("합격 여부 = " + pass2);
int score3 = 0;
String pass3 = (score3 >= 80) ? "합격입니다." : ((1 <= score3 && score3 < 80) ? "불합격입니다." : "잘못 입력하셨습니다. 점수를 입력해 주세요.");
System.out.println("합격 여부 = " + pass3);
합격 여부 = 합격입니다.
합격 여부 = 불합격입니다.
합격 여부 = 잘못 입력하셨습니다. 점수를 입력해 주세요.
✅ 삼항 연산자 작성법을 이해하고 있다.
✅ 삼항 연산자를 사용한 논리식에서 필요한 연산자를 활용할 수 있다.
'Java' 카테고리의 다른 글
변수 수업 practice (0) | 2021.12.23 |
---|---|
[JAVA] 3-1. 메소드, 패키지, 임포트 (0) | 2021.12.22 |
[JAVA] 1-2. 변수 명명 규칙, 상수, 오버플로우, 형변환 (0) | 2021.12.20 |
[자바의 정석] Ch 2. 변수 예제 응용 학습 (0) | 2021.12.19 |
[자바의 정석] Ch 2. 변수 연습문제 풀이 (0) | 2021.12.18 |