자바의정석3(연산자)
01. 연산자 & 피연산자
- 연산자 : 연산을 수행하는 기호(+, -, *, /, %)
- 피연산자 : 연산자의 연산 수행 대상 (x + 3 = x, 3이 피 연산자)
- 모든 연산자는 연산결과를 반환한다
int x = 5, y;
y = 4 * x + 3;
= 4 * 5 + 3
= 20 + 3
= 23
Sytem.out.println(y); // 23
Sytem.out.println(4 * x + 3); // 23
1. 연산자의 종류
종류 연산자 설명
산술연산자 +, -, *, / , %, <<, >> 사칙 연산과 나머지 연산(%)
비교연산자 <, >, >=, <=, ==, != 크고 작음과 같고 다름을 비교
논리연산자 &&, ||, !, &, |, ^, ~ '그리고(and)'와 '또는(or)'으로 조건을 연결
대입연산자 = 우변의 값을 좌변에 저장
기타 (type), ?:, instanceof 형변환 연산자, 삼항 연산자, instanceof연산자
2. 연산자의 우선순위
- 하나의 식(expression)에 연산자가 둘 이상 있을때, 어떤 연산을 먼저 수행할지를 자동 결정(() 괄호로 묶어서 수동으로 정해줄 수 도 있다)
3. 연산자의 결합 규칙
- 우선순위가 같은 연산자가 있을 때 어떤 것을 먼저?
- 대입과 단항 연산자를 제외하면, 모두 왼쪽 -> 오른쪽
4. 연산자의 우선순위와 결합 법칙은 "세가지만 기억하자"
- 산술 > 비교> 논리 > 대입, 대입은 제일 마지막에 수행
- 단항(1) > 이항(2) > 삼항(3), 단항은 연산자의 우선순위가 이항 연산자보다 높다
- 단항 연산자와 대입 연산자를 제외한 모든 연산자의 진행 방향은 왼쪽에서 오른쪽이다.
5. 증감 연산자
- 증가 연산자(++) : 피연산자의 값을 1증가시킨다
- 감소 연산자(--) : 피연산자의 값을 1감소시킨다
- "증감 연산자가 독립적으로 사용된 경우, 전휘형과 후위형의 차이가 없다"
타입 설명 사용예
전위형 값이 참조되기 전에 증가시킨다 j = ++1;
후위형 값이 참조된 후에 증가시킨다 j = i++;
j = ++i; // 전위형, 식을 풀 때 위로
++i;
j = i;
j = i++; // 후위형, 식을 풀 때 아래로
j = i;
i++;
6. 부호 연산자
- '-'는 피연산자의 부호를 반대로 변경
- '+'는 아무런 일도 하지 않는다(실제 사용X)
7. 형변환
- 변수 또는 상수의 타입을 다른 타입으로 변환하는 것(피연산자에게는 영향 없음)
- 형변환을 하는 이유는 주로 서로 다른 두 타입을 일치시키기 위해서
- 형변환을 생략하면 컴파일러가 알아서 자동저긍로 형변환을 한다
- "기존의 값을 최대한 보존할 수 있는 타입으로 자동 형 변환된다"
- 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환 된다
명시적 형변환
- 상위 타입에서 하위의 타입으로 형 변환 할 때(data 손실이 일어날수 있음)
- (타입)피연산자
- double d = 85.4;
- int score = (int)d; //85
변환 수식 결과
int -> char (char)65 'A'(유니코드)
char -> int (int)'A' 65
float -> int (int)1.6f 1
int -> float (float)10 10.0f
암묵적(자동) 형변환
- 하위 타입에서 상위 타입으로 형 변환 할 때
- float f= 1234;
- float f = (float)1234;
- int i = 3.14f; // ERROR, float은 int보다 범위가 넓기에 자동 형 변환이 안된다
- int i = (int)3.14f;
8. 사칙 연산자(+, -, *, /, %)
- 연산은 값은 타입끼리 연산이 된다
- (int) / (int) -> (int) // 소수점 이하는 버려진다
- 10 / 4 -> 2 // 소수점 이하는 버려진다
- (int) / (float) -> (float) / (float) -> (float) // 상위 타입으로 자동 형변환
- 10 / 4.0f -> 10.0f / 4.0f -> 2.5f // 상위 타입으로 자동 형변환
9. 산술 변환
- 연산 전에 피연자의 타입을 일치시키는 것
- 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치)
- long + int -> long + long -> long
- float + int -> float + float -> float
- double + float -> double + double -> double
- 피연산자의 타입이 int보다 작은 타입이면 int로 변환 된다
- byte + short -> int + int -> int
- char + short -> int + int -> int
- 유니코드 변환
- '2' - '0' -> 2 // 문자형 숫자를 정수형 숫자로 바꿀 때는 문자형 '0'으로 빼주어야 한다
- '2'는 유니코드 상 50이며 '0'은 유니코드 상 48이기 때문이다
10. 반올림(Math.round())
- 실수를 소수점 첫 째자리에서 반올림한 정수를 반환
- long result = Math.round(4.52); // 5
- 원하는 위치에 반올림을 하고 싶은 경우 자릿수의 10의 제곱을 곱해주고 그 만큼 나눠준다
- 3.141592 -> 3.142
- Math.round(3.141592 * 1000) / 1000.0;
- double pi = 3.141592;
- double shortPi = Math.round(pi * 1000) / 1000.0
- Math.round(3.141592 * 1000) / 1000.0
- Math.round(3.141.592) / 1000.0
- 3142 / 1000.0
- 3.142
11. 나머지 연산자(%)
- 오른쪽 피연산자로 나누고 남은 나머지를 반환
- 나누는 피연산자는 0이 아닌 정수만 허용(부호는 무시됨)
- int x = 10, y = 8;
- x / y -> 1 // 몫
- x % y -> 2 // 나머지
12. 비교 연산자(>, <, >=, <=, ==, !=)
- 두 연산자를 비교해서 true(참) 또는 false(거짓)을 반환
비교연산자 연산결과
> 좌변 값이 크면, true 아니면 false
< 좌변 값이 작으면, true 아니면 false
>= 좌변 값이 크거나 같으면, true 아니면 false
<= 좌변 값이 작거나 같으면, true 아니면 false
== 두 값이 같으면, true 아니면 false
!= 두 값이 다르면, true, 아니면 false
13. 문자열의 비교
- 문자열 비교에는 ==대신 equals()를 사용해야 한다
- String str1 = "abc";
- String str2 = "abc";
- str1 == str2 // true
- str1.equals(str2) // true
- String str1 = new String("abc");
- String str2 = new String("abc");
- str1 == str2 // false
- str1.equals(str2) // true
14. 논리 연산자(&&, ||)
- 조건식을 연결 할 때 사용하는 연산자
- ||(OR결합) : 피연산자 중 어느 한쪽이 true이면 true를 결과로 얻는다
- &&(AND결합) : 피연산자 양쪽 모두 true이면 true를 결과로 얻는다
x y x||y x&&y
true true true true
true false true false
false true true false
false false false false
- 유니코드 논리 연산
- 문자 ch는 숫자('0' ~ '9')이다
- '0' <= ch && ch <= '9'
- 문자 ch는 대문자 또는 소문자이다
- ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')
15. 논리 부정 연산자(!)
- true를 false로, false를 true로 변환
x !x
true false
false true
- boolean b = true;
- !!b -> !!true -> !false -> true
- 문자 ch가 소문자가 아니다
- ch < 'a' || ch > 'z'
- !('0' <= ch && ch <= '9')
16. 조건 연산자(?:, Ternary operator)
- 조건식의 결과에 따라 연산결과를 달리한다
- result = (x>y) ? x : y; // 괄호 생략 가능
- ()안의 조건이 참이면 x
- ()안의 조건이 거짓이면 y
- result = (5 > 3) ? 5 : 3;
-> (true)
-> 5
17. 대입 연산자
- 오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반환
- int x = 3; // x에 3이 저장된다
- x = y = 3; // y에 3이 대입되고 x에 y가 대입 된다
- lvalue : 대입 연산자의 왼쪽 피연산자(저장공간, 변수, 배열, 상수 ...)
- rvaluue : 대입 연산자의 오른쪽 피연산자
18. 복합 대입 연산자
- 대입 연산자와 다른 연산자를 하나로 축약
op= =
i += 3; i = i + 3;
i -= 3; i = i - 3;
i *= 3; i = i * 3;
i /= 3; i = i / 3;
i %= 3; i = i % 3;
i <<= 3; i = i << 3;
i >>= 3; i = i >> 3;
i &= 3; i = i & 3;
i ^= 3; i = i ^ 3;
i |= 3; i = i | 3;
i *= (10 + j); i = i * (10 + j);
Author And Source
이 문제에 관하여(자바의정석3(연산자)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@ansalstmd/자바의정석기초3
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
int x = 5, y;
y = 4 * x + 3;
= 4 * 5 + 3
= 20 + 3
= 23
Sytem.out.println(y); // 23
Sytem.out.println(4 * x + 3); // 23
종류 연산자 설명
산술연산자 +, -, *, / , %, <<, >> 사칙 연산과 나머지 연산(%)
비교연산자 <, >, >=, <=, ==, != 크고 작음과 같고 다름을 비교
논리연산자 &&, ||, !, &, |, ^, ~ '그리고(and)'와 '또는(or)'으로 조건을 연결
대입연산자 = 우변의 값을 좌변에 저장
기타 (type), ?:, instanceof 형변환 연산자, 삼항 연산자, instanceof연산자
- 대입과 단항 연산자를 제외하면, 모두 왼쪽 -> 오른쪽
타입 설명 사용예
전위형 값이 참조되기 전에 증가시킨다 j = ++1;
후위형 값이 참조된 후에 증가시킨다 j = i++;
j = ++i; // 전위형, 식을 풀 때 위로
++i;
j = i;
j = i++; // 후위형, 식을 풀 때 아래로
j = i;
i++;
- (타입)피연산자
- double d = 85.4;
- int score = (int)d; //85
변환 수식 결과
int -> char (char)65 'A'(유니코드)
char -> int (int)'A' 65
float -> int (int)1.6f 1
int -> float (float)10 10.0f
- float f = (float)1234;
- int i = (int)3.14f;
- (int) / (int) -> (int) // 소수점 이하는 버려진다
- 10 / 4 -> 2 // 소수점 이하는 버려진다
- (int) / (float) -> (float) / (float) -> (float) // 상위 타입으로 자동 형변환
- 10 / 4.0f -> 10.0f / 4.0f -> 2.5f // 상위 타입으로 자동 형변환
- long + int -> long + long -> long
- float + int -> float + float -> float
- double + float -> double + double -> double
- byte + short -> int + int -> int
- char + short -> int + int -> int
- '2' - '0' -> 2 // 문자형 숫자를 정수형 숫자로 바꿀 때는 문자형 '0'으로 빼주어야 한다
- '2'는 유니코드 상 50이며 '0'은 유니코드 상 48이기 때문이다
- 원하는 위치에 반올림을 하고 싶은 경우 자릿수의 10의 제곱을 곱해주고 그 만큼 나눠준다
- 3.141592 -> 3.142
- Math.round(3.141592 * 1000) / 1000.0;
- double pi = 3.141592;
- double shortPi = Math.round(pi * 1000) / 1000.0
- Math.round(3.141592 * 1000) / 1000.0
- Math.round(3.141.592) / 1000.0
- 3142 / 1000.0
- 3.142
비교연산자 연산결과
> 좌변 값이 크면, true 아니면 false
< 좌변 값이 작으면, true 아니면 false
>= 좌변 값이 크거나 같으면, true 아니면 false
<= 좌변 값이 작거나 같으면, true 아니면 false
== 두 값이 같으면, true 아니면 false
!= 두 값이 다르면, true, 아니면 false
- str1 == str2 // true
- str1.equals(str2) // true
- str1 == str2 // false
- str1.equals(str2) // true
x y x||y x&&y
true true true true
true false true false
false true true false
false false false false
- 문자 ch는 숫자('0' ~ '9')이다
- '0' <= ch && ch <= '9'
- 문자 ch는 대문자 또는 소문자이다
- ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')
x !x
true false
false true
- !!b -> !!true -> !false -> true
- ch < 'a' || ch > 'z'
- !('0' <= ch && ch <= '9')
- ()안의 조건이 참이면 x
- ()안의 조건이 거짓이면 y
-> (true)
-> 5
op= =
i += 3; i = i + 3;
i -= 3; i = i - 3;
i *= 3; i = i * 3;
i /= 3; i = i / 3;
i %= 3; i = i % 3;
i <<= 3; i = i << 3;
i >>= 3; i = i >> 3;
i &= 3; i = i & 3;
i ^= 3; i = i ^ 3;
i |= 3; i = i | 3;
i *= (10 + j); i = i * (10 + j);
Author And Source
이 문제에 관하여(자바의정석3(연산자)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ansalstmd/자바의정석기초3저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)