안녕하세요!

FE 개발자 유진주입니다.

Language/JAVA

[자바의 정석] Chapter3 연산자(Operation)

ypearl 2023. 5. 4. 11:49

연산자와 피연산자

- 연산자: 연산을 수해하는 기호 +, -, *, /

- 피연산자: 연산자의 연산 수행 대상

"모든 연산자는 연산결과를 반환한다."

 

연산자의 종류

종류 연산자 설명
산술 연산자 + - * / % << >> 사칙 연산과 나머지 연산(%)
비교 연산자 >  <  >=  <=  ==  != 크고 작음과 같고 다름을 비교
논리 연산자 &&  ||  !  &  |  ^  ~ '그리고(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; // 괄호 생략 가능

 

대입 연산자