언어/JAVA

연산자

빨대도둑 2022. 11. 14. 18:10

프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산이라고 한다. 연산에 사용되는 표시나 기호를 연산자라고 하며, 연산되는 데이터는 피연산자라고 한다. 

 

- 연산자들은 피연산자를 연산해서 값을 산출하는데, 산출되는 값의 타입은 연산자별로 다르다. 산술 연산자의 경우는 숫자타입으로 결과가 나오고, 비교 연산자와 논리 연산자는 논리 타입으로 나온다. 

연산자종류 연산자 피연산자수 산출값 기능
산술 + - * / % 이항 숫자 사칙연산, 나머지 계산
부호 + - 단항 숫자 음수와 양수의 부호
문자열 + 이항 문자열 두 문자열을 연결
대입 (==)과 같은 유형 이항 다양 우변을 좌변에 대입
증감 ++ -- 단항 숫자 1만큼 증가/감소
비교 == >= <= !=  이항 boolean 값의 비교
논리 ! & | && || 단항
이항
boolean 논리 연산
조건 ? A : B 삼항 다양 조건식에 따른 선택
비트 ~ & | ^ 단항
이항
숫자
boolean
비트 연산
쉬프트 >> << >>> 이항 숫자 비트를 좌/우로 이동

 

<연산자 우선 처리>

연산자 연산방향 우선순위
증감, 부호, 비트, 논리 -> 높음
산술 * / % ->  
산술 + - ->
쉬프트 ->
비교 <= >= != ->
비교 == != ->
논리 ->
조건 ->
대입 <- 낮음

 

우선순위

  1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다
  2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다
  3. 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다
  4. 복잡한 연산식에는 (괄호)를 사용해서 우선순위를 정한다

 


단항 연산자

단항 연산자는 피연산자가 하나뿐인 연산자를 말하며 여기에는 부호, 증감, 논리, 비트 연산자가 있다. 

 

<단항 연산자>

연산식 연산식 설명
+ 피연산자 피연산자의 부호 유지
- 피연산자 피연산자의 부호 변경

+,- 는 산술연산자이자 부호 연산자이다. 부호 연산자로 쓰일 때는 하나의 피연산자만 필요하다.

int i=+100;
int j=-100;
double d1=+3.14;
double d2=-3.14;

int x=100;
int result1=+x;
int result2=-x;

 

<증감 연산자>

연산식 연산식 설명
++ 피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1증가시킴
- - 피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1감소시킴
피연산자 ++ 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴
피연산자 - - 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴
++i;
i++;

--i;
i--;

int x=1;
int y=1;
int result1=++1;
int reuslt2=1--;

 

<논리부정>

논리 부정 연산자는 true를 false로, false를 true로 변경하기 때문에 boolean 타입에서만 사용할 수 있다.

!(피연산자)

- 논리 부정 연산자는 조건문과 제어문에서 사용되어 조건식의 값을 부정하도록 해서 실행 흐름을 제어할 때 사용한다.

연산식 연산식 설명
! 피연산자 피연산자가 true이면 false값을 출력
! 피연산자 피연산자가 false이면 true값을 출력

 

<비트 반전 연산자(~) >

비트 반전 연산자는 정수타입의 피연산자에만 사용되며, 피연산자를 2진수로 표현했을 때 비트값을 0을 1로, 1을 0으로 반전한다. 연한 후 부호 비트의 최상위 비트를 포함해서 모든 비트가 반전이 되기 때문에 부호가 반대인 새로운 값이 산출된다.

 


<산술 연산자>

+ - * / % 더하기 빼기 곱하기 나누기 나머지 연산자를 포함해서 총 5가지이다. 

  • 피연산자들이 모두 정수타입이고 int타입보다 크기가 작은 타입일 경우 모두 int타입으로 변환 후 연산을 실행한다. 따라서 연산의 산출 타입은 int이다
  • 피연산자들이 모두 정수타입이고 long 타입이 있을 경우 모두 long 타입으로 변환 후 연산을 실행한다. 따라서 연산의 산출타입은 long이다
  • 피연산자 중 실수 타입이 있을 경우 크기가 큰 실수 타입으로 변환 후 연산을 수행한다. 따라서 연산의 산출 타입은 실수 타입이다. 
연산식 연산식 연산식 설명
피연산자 + 피연산자 덧셈 연산
피연산자 - 피연산자 뺄셈 연산
피연산자 * 피연산자 곱셈 연산
피연산자 / 피연산자 나눗셈 연산(나머지 X)
피연산자 % 피연산자 나눗셈 연산(나머지 O)
int v1=5;
int v2=6;

int r1=v1+v2;
int r1=v1-v2;
int r1=v1*v2;
int r1=v1/v2;
int r1=v1%v2;

 

오버플로우

산술연산을 할 때 주의할 점이다. 연산 후의 산출값이 산출 타입이로 충분히 표현 가능한지 살펴야 한다. 산출 타입으로 표현할 수 없는 값이 산출되었을 경우 오버플로우가 발생하고 쓰레기 값을 얻을 수 있다.

int x=100000000;
int y=100000000;
int z=x*y;

->
long x=100000000;
long y=100000000;
long z=x*y;

 

NaN, Infinity

좌측 피연산자가 정수 타입인 경우 나누는 수인 우측 피연산자는 0을 사용할 수 없다.

실행시키면 컴파일은 정상적이지만 ArithmeticException(예외)가 발생한다.

5/0.0=>infinity
5%0.0=>Nan

infinity+5=>infinity
NaN+5=>NaN

infinity 또는 NaN값이 나오면 다음 연산을 수행하면 안된다. 왜냐하면 infinity와 NaN가 산출되어 데이터가 엉망이 될 수 있기 때문이다.

따라서 검사하는 코드를 실행시켜야 한다.

if(Double.isInfinite(z)||Double.isNaN(z)){
	System.out.println("값 산출 불가");
	}else{
		System.out.println(z+5);
}
if(Double.isNaN(val)){
	System.out.println("NaN이 입력되어 처리 불가");
	val=0.0;
}

 


<문자열 연결 연산자(+)>

+는 문자열을 서로 결합하는 연산자이다. 피연산자 중 한쪽이 문자열이면 +연산자는 문자열 연결 연산자로 사용하여 다른 피연산자를 문자열로 변환하고 서로 결합 한다.

"N"+7+3.0
//N73.0

10.0+5+"M"
//15.0M

 

<비교연산자>

구분 연산식 설명
동등비교 피연산자 == 피연산자 피연산자 값이 같은지 검사
피연산자 != 피연산자 피연산자 값이 다른지 검사
크기비교 피연산자 > < 피연산자 어떤 피연산자가 큰지 검사
피연산자 >=, <== 피연산자 피연산자가 크거나 같은지 검사
int num1=10;
int num2=15;

boolean result1=(num1==num2);
boolean result2=(num1!=num2);
boolean result3=(num1<=num2);
boolean result4=(num1<num2);

 

문자열 비교

String Avante="Hyundai";
String Santafe="Hyundai";
String Grandgur=new String("Hyundai")

Avante==Santafe //true
Santafe==Grandgur //false

문자열 리터럴이 동일하다면 동일한 String 객체를 참조하도록 되어있다. 따라서 Avante와 Santafe는 동일한 String 객체의 번지값을 가지고 있다. 하지만 Grandgur은 객체 생성 연산자인 new로 생성한 새로운 String 객체의 번지값을 가지고 있다.

String 객체의 문자열만 비교하고 싶다면 ==대신에. equals() 메서드를 사용해야 한다.

boolean result=Santafe.equals(Grandgur); //true

 

<논리 연산자>

논리곱(&&) 논리합(||) 배타적 논리합(^) 논리부정(!)을 연산한다

구분 연산식 결과 설명
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인 경우에만 true
true false true
false true true
false false false
NOT(부정합)   ! true false 피연산자의 논리값을 바꿈
false true

 

<비트 연산자>

비트 연산자는 데이터를 비트 단위로 연산한다. 즉 0,1이 피연산자가 된다. 그렇기 때문에 0과 1로 표현이 가능한 정수 타입만 비트 연산을 할 수 있다. 실수 타입인 flaot와 double은 불가능하다

구분 연산식 결과 설명
AND(논리곱) 1 & 1 1 비트모두가
1인 경우에만 1
1 0 0
0 1 0
0 0 0
구분 연산식 결과 설명
OR(논리합) 1 | 1 1 비트 중 1개라도
1이면 1
1 0 0
0 1 0
0 0 0
구분 연산식 결과 설명
XOR
(배타적 논리곱)
1 &, && 1 1 비트 중에서 하나는 1이고 다른 하나가 0이면 1
1 0 0
0 1 0
0 0 0
NOT(부정합)   ~ 1 0 보수
0 1

 

<비트 이동 연산자>

정수 데이터의 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행한다.

구분 연산식 설명
이동(쉬프트) a << b a의 비트를 b만큼 왼쪽으로 이동
a >> b a의 비트를 b만큼 오른쪽으로 이동
a <<< b a의 비트를 b만큼 오른쪽으로 이동

 

<대입 연산자>

대입 연산자는 오른쪽 피연산자의 값을 좌측 피연산자인 변수에 저장한다.

오른쪽 피연산자: 리터럴, 변수, 그리고 다른 연산식이 올 수 있다.

단순 대입 연산자: 단순히 오른쪽 피연산자의 값을 변수에 저장하는 것

복합 대입 대입 연산자: 정해진 연산을 수행 후 결과를 변수에 저장하는 것

연산식 설명
변수 += 피연산자 피연산자 값을 변수의 값과 더한수 다시 변수에 저장
변수 -= 피연산자 피연산자 값을 변수의 값과 뺀후 다시 변수에 저장
변수 *= 피연산자 피연산자 값을 변수의 값과 곱한 후 다시 변수에 저장
변수 /= 피연산자 피연산자 값을 변수의 값과 나눈 후 다시 변수에 저장
변수 %= 피연산자 피연산자 값을 변수의 값과 나눈후 나머지를 변수에 저장
변수 &= 피연산자 피연산자 값을 변수의 값과 &연산후 다시 변수에 저장
변수 |= 피연산자 피연산자 값을 변수의 값과 !연산후 다시 변수에 저장
변수 ^= 피연산자 피연산자 값을 변수의 값과 ^연산후 다시 변수에 저장
변수 <<= 피연산자 피연산자 값과 변수의 값을 <<연산후 결과를 변수에 저장
변수 >>= 피연산자 피연산자 값과 변수의 값을 >>=연산후 결과를 변수에 저장
변수 >>>= 피연산자 피연산자 값과 변수의 값을 >>>=연산후 결과를 변수에 저장

 

 


<삼항연산자>

삼항 연산자는? 앞의 조건식에 다라 :(콜론) 앞뒤의 피연산자가 선택된다고 해서 조건 연산식이라고도 부른다.

조건식? 값 또는 연산식 : 값 또는 연산식

조건식 ? 값또는 연산식 : 값 또는 연산식

int score=92;
char grade=(score>90)?'A':((score>80)?'B':'C');

 

'언어 > JAVA' 카테고리의 다른 글

상속  (0) 2022.11.15
클래스  (0) 2022.11.15
참조 타입  (0) 2022.11.14
제어문  (0) 2022.11.14
변수, 타입  (0) 2022.11.14