Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 브라우저 렌더링
- 인프콘
- 데이터독립성
- GDSC
- 우선순위상속프로토콜
- 회고
- 우선순위역전
- javascript
- 운영체제
- GDSC_PKNU
- 변수
- 멤버십
- CRDT
- 모던자바스크립트
- 부스트컨퍼런스
- 상태관리
- js
- 부스트캠프7기
- 그룹프로젝트
- OS
- CSSOM
- 확인문제
- 렌더 트리
- 모던 자바스크립트
- 놀러와요_해커톤
- DB #데이터베이스
- 타입
- 부스트캠프웹모바일
- Java
- 부스트캠프
Archives
- Today
- Total
dohun.log
[Java]03.연산자 본문
3. 연산자
3.1 연산자와 연산식
연산(operations): 프로그램에서 데이터를 처리하여 결과를 산출하는 것
연잔자(operator): 연산에 사용되는 표시나 기호
피연산자(operand): 연산되는 데이터
연산식(expressions): 연산자와 피연산자를 이용하여 연산의 과정을 기술한 것
// operand operator operand => 연산식
x + y
연산식은 반드시 하나의 값을 산출한다. 따라서 하나의 값이 올 수 있는 곳이면 어디든지 값 대신 연산식을 사용할 수 있다.
int result = x + y;
3.2 연산의 방향과 우선순위
- 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다.
- 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.
- 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.(→)
- 복잡한 연산식에는 괄호()를 사용해서 우선순위를 정해준다.
3.3 단항 연산자
피연산자가 단 하나뿐인 연산자
3.3.1 부호 연산자
연산식 | 설명 | |
+ | 피연산자 | 피연산자의 부호 유지 |
- | 피연산자 | 피연산자의 부호 변경 |
int x = -100;
int result1 = +x; // -100 부호 유지
int result2 = -x; // 100 부호 변경
⚠️ 부호 연산자의 산출 타입은 int 타입이다.
short x = 100;
short result1 = +100; // 컴파일 에러
int result2 = +100;
3.3.2 증감 연산자
연산자 | 설명 | |
++ | 피연산자 | 다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴 |
-- | 피연산자 | 다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴 |
피연산자 | ++ | 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴 |
피연산자 | -- | 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴 |
int x = 1;
int result1 = ++x; // result1 = 2, x = 2
int result2 = x++; // result2 = 2, x = 2 -> 3
int result3 = --x; // result3 = 2, x = 2
int result4 = x--; // result4 = 2, x = 2 -> 1
❓단항 연산자인 ++i가 이항연산자인 i = i + 1보다 빠를까?
❌++i와 i = i + 1은 컴파일하면 바이트코드가 동일하다.
3.3.3 논리 부정 연산자
연산자 | 설명 | |
! | 피연산자 | 피연산자가 true이면 false 값을 산출 |
피연산자가 false이면 true 값을 산출 |
3.3.4 비트 반전 연산자
연산식 | 설명 | |
~ | 10(00...01010) | -11(11...10101) |
⚠️ 비트 반전 연산자의 산출 타입은 int 타입이다.
byte v = 10;
byte v1 = ~v; // 컴파일 에러
int v2 = ~v;
3.4 이항 연산자
피연산자가 두 개인 연산자
3.4.1 산술 연산자
일반적으로 말하는 사칙연산, 나머지 연산자 → 산술 연산자는 총 5개
연산식 | 설명 | ||
피연산자 | + | 피연산자 | 덧셈 연산 |
피연산자 | - | 피연산자 | 뺄셈 연산 |
피연산자 | * | 피연산자 | 곱셈 연산 |
피연산자 | / | 피연산자 | 좌측 피연산자를 우측 피연산자로 나눗셈 연산 |
피연산자 | % | 피연산자 | 좌측 피연산자를 우측 피연산자로 나눈 나머지를 구하는 연산 |
- 피연산자 모두 정수, int 타입보다 크기가 작은 타입 → 모두 int 타입으로 변환 후 연산 수행 → 연산의 산출 타입은 int 타입이다.
- 피연산자 모두 정수, long 타입 존재 → 모두 long 타입으로 변환 후 연산 수행 → 연산의 산출 타입은 long 타입이다.
- 피연산자 중 실수 타입 존재 → 크기가 큰 실수 타입으로 변환 후 연산 수행 → 연산의 산출 타입은 실수 타입이다.
// 1
byte byte1 = 1;
byte byte2 = 1;
byte byte3 = byte1 + byte2; // 컴파일 에러
int int1 = byte1 + byte2;
// 2
long long1 = 10L;
int int2 = long1 + int1; // 컴파일 에러
long long2 = long1 + int1;
// 3
int int2 = 4;
int int3 = int1 / int2; // 2 / 4 = 0.5 -> 0
double double1 = int1 / int2; // 2 / 4 = 0.5 -> 0 -> 0.0
// 0.5를 얻고 싶으면 다음과 같이 해야 함.
double double2 = (int1 * 1.0) / int2;
double double2 = (double)int1 / int2;
double double2 = int1 / (double)int2;
오버 플로우 탐지
int x = 1000000;
int y = 1000000;
int z = x * y; // 오버플로우 발생
long z = x * y; // 1000000000000
NaN과 Infinity 연산
5 / 0 // ArithmeticException 발생
5 % 0 // ArithmeticException 발생
5 / 0.0 // Infinity
5 % 0.0 // NaN
Double.isInfinite() // Infinity면 true 반환, 아니면 false 반환
Double.isNaN() // NaN이면 true 반환, 아니면 false 반환
3.4.2 문자열 연결 연산자
String str1 = "JDK" + 6.0; // "JDK6.0"
String str2 = "JDK" + 3 + 3.0; // "JDK33.0"
String str3 = 3 + 3.0 + "JDK"; // "33.0JDK"
3.4.3 비교 연산자
구분 | 연산식 | 설명 | ||
동등 비교 |
피연산자1 | == | 피연산자2 | 두 피연산자의 값이 같은지를 검사 |
피연산자1 | != | 피연산자2 | 두 피연산자의 값이 다른지를 검사 | |
크기 비교 |
피연산자1 | > | 피연산자2 | 피연산자1이 큰지를 검사 |
피연산자1 | >= | 피연산자2 | 피연산자1이 크거나 같은지를 검사 | |
피연산자1 | < | 피연산자2 | 피연산자1이 작은지를 검사 | |
피연산자1 | <= | 피연산자2 | 피연산자1이 작거나 같은지를 검사 |
⚠️ String 타입의 문자열을 비교할 때에는 대소 연산자 사용 불가, 동등 비교 연산자 사용할 때는 주의
String str1 = "Java";
String str2 = "Java";
String str3 = new String("Java");
str1 == str2 // true
str1 == str3 // false
문자열 리터럴이 같으면 동일한 String 객체 참조
그러나 str3은 new로 새롭게 생성한 String 객체 번지값을 가지고 있음
따라서 다음과 같이 사용해야 한다.
boolean result1 = str1.equals(str2); // true
boolean result2 = str1.equals(str3); // true
3.4.4 논리 연산자
구분 | 연산자 | 설명 |
AND(논리곱) | && or & | 피연산자 모두가 true일 경우에만 연산 결과는 true |
OR(논리합) | || or | | 피연산자 중 하나만 true이면 연산 결과는 true |
XOR(배타적 논리합) | ^ | 피연산자가 하나는 true이고 다른 하나가 false일 경우에마 연산 결과는 true |
NOT(논리부정) | ! | 피연산자의 논리값을 바꿈 |
3.4.5 비트 연산자
구분 | 연산자 | 설명 |
AND(논리곱) | & | 두 비트 모두 1일 경우에만 연산 결과는1 |
OR(논리합) | | | 두 비트 중 하나만 1이면 연산 결과는 1 |
XOR(배타적 논리합) | ^ | 두 비트 중 하나는 1이고 다른 하나가 0일 경우에마 연산 결과는 1 |
NOT(논리부정) | ! | 보수 |
이동(쉬프트) |
<< | 정수 a의 각 비트를 b만큼 왼쪽으로 이동(빈 자리는 0으로 채워짐) |
>> | 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈 자리는 정수 a의 MSB와 같은 값으로 채워짐) | |
>>> | 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈 자리는 0으로 채워짐) |
3.4.6 대입 연산자
구분 | 연산식 | 설명 |
단순 대입 연산자 | 변수 = 피연산자 | 우측의 피연산자의 값을 변수에 저장 |
복합 대입 연산자 | 변수 연산자= 피연산자 | 우측의 피연산자의 값을 변수의 값과 연산한 후 다시 변수에 저장 |
3.5 삼항 연산자
피연산자가 세 개인 연산자
// 조건식 ? 값 또는 연산식 : 값 또는 연산식
10 > 90 ? "TRUE" : "FALSE"; // "FALSE"
출처: 이것이 자바다 Chater03 연산자
'Study > Java' 카테고리의 다른 글
[Java]05.참조 타입 (2) | 2022.01.18 |
---|---|
[Java]01.자바 시작하기 (1) | 2022.01.11 |
[Java]04.조건문과 반복문 (0) | 2022.01.11 |
[Java]06.클래스-확인문제 (0) | 2021.12.29 |
[Java] 02.변수와 타입 (0) | 2021.12.20 |
Comments