연산자와 피연산자
- 연산자: 연산을 수해하는 기호 +, -, *, /
- 피연산자: 연산자의 연산 수행 대상
"모든 연산자는 연산결과를 반환한다."
연산자의 종류
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % << >> | 사칙 연산과 나머지 연산(%) |
비교 연산자 | > < >= <= == != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && || ! & | ^ ~ | '그리고(AND)'와 '또는(OR)'으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ?: instanceof | 형변환 연산자, 삼항 연산자, instanceof 연산자 |
연산자의 우선순위와 결합규칙
→ 외울 필요는 없다. 상식적으로 생각하면 이미 다 알고 있는 것!
"우선순위가 같은 연산자가 있을 때 어떤 것을 먼저?"
~> 대입과 단항 연산자를 제외하면, 모두 왼쪽 -> 오른쪽
종류 | 결합규칙 | 연산자 | 우선순위 |
단항 연산자 | ← | ++ -- + - ~ ! (type) | 높음 낮음 |
산술 연산자 | → | * / % | |
→ | + - | ||
→ | << >> | ||
비교 연산자 | → | < > <= >= instanceof | |
→ | == != | ||
논리 연산자 | → | & | |
→ | ^ | ||
→ | | | ||
→ | && | ||
→ | || | ||
삼항 연산자 | → | ?: | |
대입 연산자 | ← | == += -= *= /= %= <<= >>= &= ^= != |
<연산자의 우선순위와 결합법칙>
✨이 세 가지만 기억하자!
1) 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
2) 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
3) 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
증감 연산자, 부호 연산자
- 증감 연산자
✨"증감 연산자가 독립적으로 사용된 경우, 전위형과 후위형의 차이가 없다."
타입 | 설명 | 사용 예 |
전위형 | 값이 참조되기 전에 증가시킨다. | j = ++i; |
후위형 | 값이 참조된 후에 증가시킨다. | j = i++; |
- 부호 연산자
'-'는 피연산자의 부호를 반대로 변경
'+'는 아무런 일도 하지 않는다.(실제 사용 X)
형변환 연산자
- 형변환이란?
: 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
(타입) 피연산자
double d=85.4;
int score=(int)d;
int score=(int)85.4;
int score=85;
//변수 d의 값은 변하지 X, 읽어온 값인 85.4를 형변환 한 것.
- 자동 형변환
: 원래 대입 연산자의 양쪽 타입이 맞아야 한다!
-> 컴파일러가 자동으로 형변환을 해줌
float f=1234; //형변환 생략->컴파일러가 아래처럼 자동으로 형변환(=자동 형변환)
float f=(float)1234;
int i=3.14f; //에러 (값 손실 발생)
int i=(int)3.14f; //OK. (수동형변환=직접형변환)
"기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다."

🎈 short와 char은 형변환 X (short는 부호있는 정수=> ±3만, char는 부호없는 정수=>0~6만)
🎈 단순히 byte로만 따지면 long이 크지만, 표현할 수 있는 값의 범위는 실수형이 크기 때문에
long에 비해 float의 크기가 더 크다!
byte b=100; //OK.(예외적) byte타입의 범위(-128~127)의 값의 대입
byte b=(byte)100; //OK. byte타입으로 형변환하여 대입
🎈 이 예시처럼 100의 경우 int이지만, byte타입 범위 내에 속하므로 예외적으로 자동 형변환이 이루어짐.
int i=100;
byte b=i; //에러. int타입을 byte의 타입에 대입
byte b=(byte)i; //OK. byte타입으로 형변환하여 대입
🎈 위의 예는 100이 '상수(리터럴)'이었기에 컴파일러가 그 값을 명확히 알 수 있었지만,
여기서는 i가 '변수'이기 때문에 이 안에 어떤 값이 들어있는지 컴파일러가 확신할 수 었음.-> Error!
byte b=1000; //에러. byte타입의 범위(-128~127)를 벗어난 값의 대입
byte b=(byte)1000; //OK. 그러나 값 손실이 발생해서 변수 b에는 -24가 저장됨.
🎈 상수일지라도 값 손실이 발생하는 경우에는, 컴파일러가 자동으로 형변환 X
사칙 연산자 (+ - * /)
- 나눗셈(/)에서...
어느 한 쪽만 바꾸어도 형변환 이루어진다! (예. int->float)
ㄴ자동 형변환에 의해
산술 변환
: 연산 전에 피연산자의 타입을 일치시키는 것
<📌2가지 규칙>
1) 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
2) 피연산자의 타입이 int보다 작은 타입(byte, char, short)이면 int로 변환된다.
반올림 ㅡ Math.round()
: 실수를 소수점 첫째자리에서 반올림한 정수를 반환
long result = Math.round(4.52); // result에 5가 저장된다.
class Ex3_11 {
public static void main(String args[]){
double pi = 3.141592; // 3.141을 얻으려면?
System.out.println(pi*1000); // 3141.592
System.out.println((int)(pi*1000)); // 3141
System.out.println((int)(pi*1000)/1000); // 3
System.out.println((int)(pi*1000)/1000.0); // 3.141
}
}
나머지 연산자 %
: 오른쪽 피연산자로 나누고 남은 나머지를 반환
나누는 피연산자는 0이 아닌 정수만 허용 (부호는 무시됨)
System.out.println(10%8); // 10을 8로 나눈 나머지 2가 출력된다.
System.out.println(10%-8); // 위와 같은 결과를 얻는다.
비교 연산자 > < >= <= == !=
: 두 피연산자를 비교해서 true(참) 또는 false(거짓)을 반환
🎈 ==랑 = 헷갈리지 말 것, !=를 =!로 잘못 쓰지 말 것
🚨 주의
'A' > 'B' => 산술변환 규칙에 의해 char이 int 타입으로 바뀌므로 65 > 66이 되어 false의 결과가 나옴.
문자열의 비교
: 문자열의 비교에는 == 대신 equals()를 사용해야 한다.
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); // true
System.out.println(str1.equals(str2)); // true
논리 연산자 && (AND), ||(OR)
: 조건식을 연결할 때 사용하는 연산자
'0'<=ch && ch<='9'
🎀 문자 ch는 숫자('0'~'9')이다.
논리 부정 연산자 ! (단항연산자)
: true를 false로, false는 true로 바꾼다.
boolean b = true;
ㄴ !!b → !!true → !false → true
조건 연산자 ? :
: 조건식의 결과에 따라 연산 결과를 달리한다.
조건식 ? 식1(true): 식2(false)
result = (x>y)? x: y; // 괄호 생략 가능
대입 연산자
'Language > JAVA' 카테고리의 다른 글
[자바의 정석] Chapter 5. 배열 (1) | 2023.05.10 |
---|---|
[자바의 정석] Chapter4. 조건문과 반복문 (0) | 2023.05.05 |
[자바의 정석] Chapter2. 단축키/변수/상수/리터럴/문자열/기본형과 참조형/printf (0) | 2023.04.06 |
자바의 정석 Chapter1 (0) | 2023.02.24 |
자바의 정석 Ch1 (0) | 2022.07.17 |