2023. 1. 1. 21:34ㆍjava일지
2022/12/31
- 학습내용
1. 기본 연산자
연산에 사용하는 기호 +,- 등을 연산자(operator)라고 한다.
연산에 사용하는 값을 항(operand)이라고 한다.
ex) 3+4 에서 3,4 는 항이고 +가 연산자다.
연산자는 항의 개수에 따라 단항 연산자, 이항 연산자, 삼항 연산자로 나눌 수 있다.
사칙 연산을 할 때 순서가 있는 것처럼 연산자도 우선순위가 있다.
1) 대입 연산자(assignment operator)
대입 연산자는 말 그대로 변수에 값을 대입하는 연산자다.
대입 연산자는 이항 연산자 중 우선순위가 가장 낮은 연산자다.
int age = 24; //나이를 의미하는 age 변수에 값 24를 대입
totalScore = mathScore + engScore; //1. mathScore값과 engScore값을 더하여
//2. 총점을 의미하는 totalScore 변수에 대입
대부분의 연산을 수행하고 나면 결과 값이 만들어지는데, 그 결과 값을 변수에 대입하는 것도 대입 연산자다.
따라서 프로그램에서 대입 연산자를 가장 많이 사용한다.
2) 부호 연산자 ( +, - )
부호 연산자는 더하기, 빼기 연산에 쓰는 이항 연산자이면서 부호를 나타내는 단항 연산자로도 사용한다.
3) 산술 연산자
사칙 연산에서 사용하는 연산자가 산술 연산자다.
4) 증가·감소 연산자
증가·감소 연산자는 단항 연산자다.
연산자 앞이나 뒤에 사용하며 값을 1만큼 늘리거나 1만큼 줄인다.
5) 관계 연산자(비교 연산자)
항이 두 개인 이항 연산자다.
두 개의 항 중 어느 것이 더 큰지, 작은지, 같은지 등의 여부를 검사한다.
관계 연산자의 결과 값은 참(true) or 거짓(false)으로 반환된다.
int myAge = 27;
boolean value = (myAge > 25);
System.out.println(value); //true
관계 연산자는 이렇게 두 값을 비교하여 결과 값을 반환하므로 비교 연산자라고도 부른다.
※읽기 좋은 프로그램
관계 연산자는 대입 연산자보다 연산자 우선순위가 높으므로 다음처럼 괄호를 사용하지 않아도 결과 값이 나옵니다.
boolean value = myAge > 25;
boolean value = (myAge > 25);
이렇게 괄호를 사용한 이유는 읽기 좋은 프로그램, 즉 가독성이 좋은 프로그램을 만들기 위해서다.
괄호를 사용하면 관계 연산의 결과 값이 value에 대입되는 것을 좀 더 명확히 알 수 있다.
6) 논리 연산자
논리 연산자는 주로 관계 연산자와 함께 사용한다.
관계 연산자의 우선순위가 논리 연산자보다 높으므로, 관계 연산자의 결과 값을 기반으로 논리 연산자의 결과 값을 계산한다.
int num1 = 10;
int num2 = 20;
boolean flag = (num1 > 0) && (num2 > 0);
System.out.println(flag); //flag는 참
flag = (num1 < 0) && (num2 > 0);
System.out.println(flag); //flag는 거짓
flag = (num1 < 0) || (num2 > 0);
System.out.println(flag); //flag는 참
논리 곱(&&) 연산에서 두 항의 결과 값아 모두 참인 경우만 참이고 그렇지 않으면 거짓이 된다.
논리 합(||)연산은 두 항 중 하나의 항만 참인 경우에도 결과 값은 참이 된다.
※단락 회로 평가(SCE)
단락회로 평가는 논리 연산자를 사용할 때 고려해야 할 사항으로 두항 중 앞의 항에서 결과값이 정해지는 경우 뒤의 값이 참인지 거짓인지 평가하지 않는 것을 단락회로평가라고 합니다.
public class OperatorEx3 {
public static void main(String[] args) {
int num1 = 10;
int i = 2;
boolean value1 = ((num1 = num1 +10)<10) && ((i = i+2)<10);
//여기서는 num1은20이 됬고 i는 4가됬을거라고 생각 할 수 있음
System.out.println(num1); //20
System.out.println(i); //2 앞에만 봐도 평가가 뒤기때문에 평가를 하지 않아서 값은 2그대로이다..
System.out.println(value1); //false
int num2 = 10;
int i2 = 2;
boolean value2 = ((num2 = num2 +10)<10) || ((i2 = i+2)<10);
System.out.println(num2); //20
System.out.println(i2); //4 // 이번엔 앞에가 false여도 뒤에까지 체크해야되기 때문에 4가됨
//만약 앞에가 true였다면 이번에도 계산안됨
System.out.println(value2); //true
// 이걸 단락회로평가라고 한다// 코딩할 때 주의할 것!
value1을 논리곱을 이용하여 연산하는 과정에서 num1 항의 평가를 마치고 false라고 판단하면 뒤에 i항은 평가하지 않았기 때문에 num1은 평가가 반영된 20이지만 i는 평가가 반영되지 않은 i로 남아 있음을 확인할 수 있다.
value2를 논리합을 이용하여 연산하는 과정에서 num2가 false로 나왔지만 i항까지 평가해야 되기 때문에 두 변수 모두 평가가 평가가 되어 n2=20; i =4;라는 값이 나왔다.
만약 value2에서 i항이 먼저나와 ture가 나왔다면 앞의 value의 경우처럼 뒤에 num2항을 평가 하지 않았을 것이다.
실제프로그램에서 단락회로평가에 의해서 뒤의 항이 평가되지 않아 예상치 못한 결과 발생할 수 있으니 주의해야 한다.
7) 복합 대입 연산자
복합 대입 연산자는 대입 연산자와 다른 연산자를 조합해 하나의 연산자처럼 사용하는 연산자다.
산술 연산자, 비트 연산자와 함께 사용하여 코드를 간결하게 표현할 수 있다.
대입 연산자는 우선순위가 가장 낮다.
연산이 모두 끝난 후 마지막으로 결과 값을 변수에 대입한다.
복합 대입 연산자도 마찬가지다.
복합 대입 연산자를 사용하면 변수를 반복적으로 사용하지 않아도 되는 장점이 있다.
num1 = num1 + 5; -> num1 += 5
num1 =num1 * num2; -> num1*= num2
8) 조건 연산자(삼항 연산자)
조건 연산자는 연산에 필요한 항의 개수가 세 개다.
조건 연산은 주어진 조건식이 참인 경우와 거짓인 경우에 다른 결과 값이 나온다.
'조건식? 결과1: 결과2;'
조건식이 참이면 결과1, 조건식이 거짓이면 결과2가 선택된다.
ex) int num = (5>3)? 10:20;
5가 3보다 크므로 조건식이 참이다. 따라서 num 값은 10이 된다.
2. 비트 연산자
비트 연산자는 비트 단위로 연산이 이루어지는 연산자다.
비트 단위의 연산을 하는 경우는 '암호화; 작업처럼 임의의 숫자를 만들거나, 어떤 변수의 특정 비트를 꺼내보는(마스킹) 경우에 사용한다.
자바에서는 프로그램에서 특정 값을 만들거나 연산할 때 사용한다.
비트 논리 연산자
비트 단위로 &, |, ^, ~ 연산이 이루어진다.
1) &(AND)연산자
&(AND)연산자는 두 개의 비트 값이 모두 1인 경우에만 연산의 결과 값이 1이 된다.
2) |(OR)연산자
|(OR) 연산자는 비트 값이 하나라도 1이면 연산 결과 값이 1이 된다.
3)^(XOR)연산자
^(XOR)연산자는 같은 값으면 0, 다른 값이면 1의 결과 값을 갖는다.
4) ~(반전)연산자
~(반전)연산자는 비트 값을 0은 1로 , 1은 0으로 바꾸는 연산자다.
비트 이동 연산자(Shift 연산자)
1) <<연산자
<<연산자는 왼쪽으로 비트를 이동시키는 연산자다.
2) >>연산자
>>연산자는 오른쪽으로 비트를 이동시키는 연산자다.
3) >>> 연산자
>>> 연산자는 >>연산자와 동일하게 비트를 오른쪽으로 이동시킨다.
차이가 있다면 >>> 연산자는는 왼쪽에 채워지는 비트 값이 부호 비트와 상관없이 0이 된다.
3. 연산자 우선순위
'java일지' 카테고리의 다른 글
자바 리마인드#5 클래스와 객체1 (0) | 2023.01.06 |
---|---|
자바 리마인드#4 제어 흐름 이해하기 (0) | 2023.01.02 |
자바 리마인드#2 변수와 자료형#2 (0) | 2022.12.30 |
자바 리마인드#1 변수와 자료형1 (0) | 2022.12.29 |
프로그래밍 기초탄탄#9 스레드 (0) | 2022.11.01 |