03-1 / 연산자와 연산식
연산 개념)
c = a + b |
연산에 사용되는 표시나 기호를 연산자(operator). ( = , + )
연산자와 함께 연산되는 데이터를 피연산자(operand). ( c, a, b )
연산자와 피연산자를 이용하여 연산과정을 기술한걸 연산식(expression). ( c = a + b)
연산자의 종류)
종류 | 연산자 | 피연산자 수 | 산출값 | 기능 |
산술 | +, -, * , / , % | 이항 | 숫자 | 사칙연산 및 나머지 계산 |
부호 | + , - | 단항 | 숫자 | 음수와 양수의 부호 |
문자열 | + | 이항 | 문자열 | 두 문자열을 연결 |
대입 | =, +=, -=, *=, /=, %= | 이항 | 다양 | 우변의 값을 좌변의 변수에 대입 |
증감 | ++, -- | 단항 | 숫자 | 1만큼 증가/감소 |
비교 | ==, !=, <, >, <=, >=, instanceof | 이항 | boolean | 값의 비교 |
논리 | !, &&, || | 단항 / 이항 | boolean | 논리 부정, 논리곱, 논리합 |
조건 | (조건식) ? A : B | 삼항 | 다양 | 조건식에 따라 A 또는 B 중 하나 선택 삼항연산자라고도 함0. |
비트 | ~, &, |, ^, <<, >> | 단항 / 이항 | 피연산자를 비트단위 논리 연산한다 <<, >>는 Shift(쉬프트) 연산자라고도 한다. |
|
형변환 (캐스팅) |
(type) | 단항 | 다양 | 가로안에 지정한 타입으로 형변환 한다. |
* 03-2에서 좀더 자세하게
연산의 방향과 우선순위)
1. 단항 > 이항 > 삼항 연산자 순으로 우선순위를 갖는다.
2. 산술 > 비교 > 논리 > 대입 연산자 순으로 우선순위를 갖는다.
3. 우선순위가 같다면 왼쪽에서 오른쪽 방향으로 수행
단, 단항 연산자(++, --, ~, !), 부호 연산자(+,-), 대입 연산자(=, +=, -=, *=, /=, %=) 는 오른쪽에서 왼쪽 방향으로 수행
4. 복잡한 연산식에는 괄호 ()를 사용해 우선순위를 정해준다.
03-2 / 연산자의 종류
연산자는 아래와 같이 구분
구분 | 종류 |
산출방법 | 산술, 부호, 문자열 대입, 증감, 비교 |
피연산자 수 | 단항, 이항, 삼항 |
단항 연산자)
1. 부호 연산자 ( + , - )
양수 및 음수를 표현하는 연산자. 기본타입 중 boolean, char 제외 사용가능
int x = -10;
float y = +3.14f;
double z = -10.543;
int x1 = -x; // 10
float y1 = -y; // -3.14f
double z1 = -z; // 10.543
다만, byte타입은 부호 연산자의 결과가 int타입이 되므로 int값에 대입하거나 캐스팅 연산자로 형변환을 시켜야한다.
byte x = -1;
byte byteValue = -x; // 컴파일 에러
int intValue = -x;
byte byteValue = (byte) -x;
2. 증감 연산자 ( ++ , -- )
변수의 값을 1 증가 (++) 시키거나 1 감소 (-- / 대쉬2번) 시키는 연산자. 기본타입 중 boolean 제외 사용가능
증감 연산자에서 숫자의 위치는 매우 중요하다. 증감 연산자만을 사용한 식이라면 괜찮겠지만 다른 연산자와 함께 사용된다면 숫자의 위치에 따라 연산 수행 순서가 달라지기 때문
위치 | 설명 | |
++ / -- | 피연산자 | 다른 연산을 수행하기 전에 피연산자 값을 변화시킴 |
피연산자 | ++ / -- | 다른 연산을 수행한 후에 피연산자 값을 변화시킴 |
int x = 10;
int y = 10;
int z;
z = x++;
System.out.println(z); // 10 증감되기 전에 대입이 먼저 됬기 때문
System.out.println(x); // 11 대입 이후 증감 적용
z = ++x;
System.out.println(z); // 12 대입되기 전에 증감이 먼저 됬기 때문
System.out.println(x); // 12 이미 증감이 적용됨
z = ++x + y++;
System.out.println(z); // 23 x는 증감됬고 y는 증감안되서 13 + 10
System.out.println(x); // 13
System.out.println(y); // 11 대입 이후 증감 적용
3. 논리 부정 연산자 ( ! )
true를 false로 false를 true로 변경하여 boolean타입에만 사용가능
주로 조건문과 제어문에서 조건식의 값을 부정하여 실행 흐름을 제어할 때 주로 사용하거나
두가지 상태 (true / false)를 번갈아가며 변경하는 토글(Toggle)기능을 구현할 때 사용
boolean play = true;
System.out.println(play); // true
System.out.println(!play); // false
play = !play
System.out.println(play) // false
이항 연산자)
1. 산술 연산자 ( + , - , * , / , % )
사칙연산자인 덧셈, 뺄셈, 곱셈, 나눗셈과 나머지를 구하는 %까지 총 5개. 기본타입 중 boolean 제외 사용가능
int x = 10;
int y = 5;
int z;
z = x + y; // 15 덧셈
z = x - y; // 5 뺄셈
z = x * y; // 50 곱셈
z = x / y; // 2 나누기
z = x % y; // 0 나눈 나머지
산술 연산자는 타입이 동일하지 않을 경우 다음과 같은 규칙으로 타입을 일치시켜 연산을 수행
피연산자 타입들이 byte, short, char 일 경우 | 모두 int 타입으로 변환 |
정수 타입 피연산자들 사이에 long 타입이 포함된 경우 | 모두 long 타입으로 변환 |
피연산자들 사이에 실수타입(float, double)이 포함된 경우 | 모두 허용 범위가 큰 실수 타입으로 변환 |
정수값 간의 산술식에서 실수 값을 얻고 싶다면 피연산자 중 하나를 실수 타입으로 변경하면 된다.
int x = 10;
int y = 6;
int z1;
double z2;
z1 = x / y; // 1
z2 = x / (double) y; // 1.6666666666666667
char 타입도 정수타입이므로 산출 연산이 가능하지만 산출 결과가 int 값이기 때문에 다시 char 변수에 대입하면 컴파일 에러가 발생. 캐스팅 연산자를 서서 변환하거나 int 변수에 대입해야 한다.
char a = 'A';
//char z1 = a + 1; // 컴파일 에러
char z1 = (char)(a + 1); // B
int z2 = a + 1; // 66
2. 문자열 결합 연산자 ( + )
문자열을 서로 결합하는 연산자. 피연산자 중 하나가 문자열이면 다른 피연산자들도 문자열로 변환해 서로 결합
연산순서에 따라 결과값이 다를 수 있다.
String a = 3 + 3.0 + "JDK";
System.out.println(a); // 6.0JDK
String b = "JDK" + 3 + 3.0;
System.out.println(b); // JDK33.0
3. 비교 연산자( < , <= , > , >= , == , != )
피연산자의 대소 또는 동등여부를 비교해서 true / false 값을 산출한다. 기본타입 중 boolean 제외 사용가능
흐름 제어문인 조건문, 반복문에서도 주로 이용된다
int num1 = 10;
int num2 = 14;
System.out.println(num1 > num2); // false
System.out.println(num1 >= num2); // false
System.out.println(num1 < num2); // true
System.out.println(num1 <= num2); // true
System.out.println(num1 == num2); // false
System.out.println(num1 != num2); // true
char a = 'A';
System.out.println(a == 65); // true / a가 int값으로 변환되어 비교
double b = 3.0;
System.out.println(b == 3); // true / 3이 double값으로 변환되어 비교
4. 논리 연산자 ( && , || , & , | , ^ , ! )
논리곱, 논리합, 배타적 논리합, 논리 부정 연산을 수행. boolean 타입만 사용가능
구분 | 연산식 | 결과 | 설명 | ||
AND (논리곱) |
true | && 또는 & |
true | true | 피연산자 모두가 true일 경우에만 연산 결과가 true |
true | false | false | |||
false | true | false | |||
false | false | false | |||
OR (논리합) |
true | || 또는 | |
true | true | 피연산자 중 하나만 true여도 연산 결과는 true |
true | false | true | |||
false | true | true | |||
false | false | false | |||
XOR (배타적 논리합) |
true | ^ | true | false | 피연산자끼리 서로 다를 경우에만 연산 결과가 true |
true | false | true | |||
false | true | true | |||
false | false | false | |||
NOT (논리 부정) |
! | true | false | 피연산자의 논리값을 바꿈 | |
false | true |
연산기호가 하나일때와 두개일때 (& vs && , | vs ||) 차이는 연산과정 차이로
연산기호가 두개일때는 앞의 피연산자 결과가 결과판단에 결정적이면 이후 피연산자들은 평가하지 않고 바로 산출 결과를 낸다. 그러나 연산기호가 한개일때는 앞의 피연산자의 결과판단에 상관없이 이후 모든 피연산자들을 평가한다.
따라서 더 효율적인 것은 &&과 ||이다.
ex) && 연산에서 맨 앞 피연산자가 false가 나왔다면 이후 피연산자와 관계없이 결과는 false로 결정된다. 따라서 이후 피연산자를 평가하지 않고 false값을 출력
논리 연산은 흐름 제어문인 조건문, 반복문 등에 주로 사용된다.
5. 대입 연산자 ( = , += , -= , *= , /= , %= )
오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 저장한다.
종류에는 단순히 값을 저장만 하는 단순 대입 연산자와 정해진 연산을 수행한 후 결과를 저장하는 복합 대입 연산자가 있다.
대입 연산자는 모든 연산자들 중 가장 낮은 연산 순위를 가지고 있다. 그리고 연산수행 방향은 오른쪽에서 왼쪽
구분 | 연산식 | 설명 | ||
단순 대입 연산자 | 변수 | = | 피연산자 | 오른족 피연산자 값을 왼쪽 변수에 저장 |
복합 대입 연산자 | 변수 | += | 피연산자 | 변수 = 변수 + 피연산자 |
변수 | -= | 피연산자 | 변수 = 변수 - 피연산자 | |
변수 | *= | 피연산자 | 변수 = 변수 * 피연산자 | |
변수 | /= | 피연산자 | 변수 = 변수 / 피연산자 | |
변수 | %= | 피연산자 | 변수 = 변수 % 피연산자 | |
변수 | &= | 피연산자 | 변수 = 변수 & 피연산자 | |
변수 | |= | 피연산자 | 변수 = 변수 | 피연산자 | |
변수 | ^= | 피연산자 | 변수 = 변수 ^ 피연산자 |
6. 삼항 연산자 ( ?: )
3개의 피연산자를 필요로 하는 연산자이다. 구조는 아래와 같다
조건식 (피연산자1) |
? | 값 또는 연산식 (피연산자2) |
: | 값 또는 연산식 (피연산자3) |
조건식을 연산했을때 true가 나오면 결과는 피연산자2가 산출되고 연산 결과가 false면 피연산자3이 산출된다.
결과값으로 나오는 연산식을 이용해 또 삼항 연산자를 넣는다면 여러 조건에 해당하는 결과값을 도출가능하다.
'Programming > Java' 카테고리의 다른 글
혼공자바] 05-1~2 참조 타입과 참조 변수 (1) (0) | 2022.11.11 |
---|---|
혼공자바] 04-1 조건문과 반복문 (0) | 2022.11.10 |
혼공자바] 01~02 자바 시작 및 변수와 타입 (2) | 2022.11.07 |
intelliJ] error: unmappable character for encoding MS949 (0) | 2022.10.19 |
IDE] java IDE 종류 2 : intelliJ IDEA 설치 (0) | 2022.10.10 |