본문으로 바로가기

[Java] 연산자, 연산자의 종류

category Java 2022. 1. 23. 21:31

연산

  • 프로그램에서 데이터를 처리하여 결과를 산출하는 것

 

연산자

  • 연산에 사용되는 표시나 기호
  • 산술,증감,비교,논리,대입 등이 있다.
연산자 종류 연산자 피연산자 수 산출값 기능
산술 +, -, *, /, % 이항 숫자 사칙연산 및 나머지 계산
부호 +, - 단항 숫자 음수와 양수의 보호
문자열 + 이항 문자열 두 문자열을 연결
대입 =, +=, -=, *=, /=, %= 이항 다양 우변의 값을 좌변의 변수에 대입
비교 ==, !=, >, <, >=, <=, instanceof 이항 boolean 값의 비교
논리 !, &, :, &&, :: 단항
이항
boolean 논리 부정, 논리곱, 논리합
증강 ++, -- 단항 숫자 1만큼 증,감
조건 (조건식) ? A : B 삼항 다양 조건식에 따라 A 또는 B중 선택

*피연산자 수 : 이항(두개)/ 단항(한개)

*산출값은 연산의 결과 : 비교랑 논리 연산자를 이용해 연산식을 만들면 결과는 boolean이 나온다 

 

피연산자

  • 연산자와 함께 연산되는 데이터 (값)
  • 예를들어, 연산식 3 + x 에서 3과 변수 x가 피연산자이다.

연산식

  • 연산자와 피연산자를 사용하여 연산 과정을 기술한 것
  • 연산식은 반드시 하나의 값 산출
  •  하나의 값이 오는 모든 자리에 연산식 사용 가능
  • 대표적으로 변수에 연산식의 값을 저장  ex) int result = x + y  ( x + y의 결과를 좌측 변수에 저장)
  • 다른 연산식의 피연산자 위치에 연산식 대입 가능  / boolean result = (x + 5) < 5; (비교연산자 '<' 피연산자 위치에 연산식이 사용 됨)

복합적으로 구성된 연산식의 연산

  • 우선순위에 따라 수행 :

단항 -> 이항 -> 삼항

산술 -> 비교 -> 논리 -> 대입

x > 0 && y < 0
//&&:논리연산자 >,<:비교연산자
//1 번째 수행 > 2번째 수행 < 3번째 수행 &&
  • 우선순위 같은 연산자는 왼쪽에서 오른쪽 방향으로 수행
100 * 2 / 3 % 5
  • 증감(++,--) 대입(=, +=, -=) 연산자는 우측에서 좌측으로 수행한다

 

  • 괄호는 가장 우선순위가 높으므로, 먼저 연산하고 싶은 곳에 괄호를 잘 활용하면 연산자의 우선순위를 굳이 외울 필요x

연산자의 종류

  • 피연산자 수에 따라 단항, 이항, 삼항 연산자로 구분
  • 단항 연산자: 부호, 증감 연산자  ( ++x;    //피연산자의 수가 1개)
  • 이항 연산자: 산술, 비교, 논리 연산자  ( x + y;    //피연산자의 수가 2개)
  • 삼항 연산자: 조건 연산자   ( sum > 90)  ?  "A"  :  "B";  //피연산자의 수가 3개)

단항연산자

  • 부호 연산자 (+,-)

- boolean 타입과 char 타입을 제외한 기본 타입에 사용 (byte,short,int,long,float,double 타입의 변수가 피연산자로 옴)

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

 

- 정수 및 실수 타입 변수 앞에 붙는 경우

int x = -100;
int result1 = +x; // 부호를 그대로 유지해서 result1에 저장해라
int result2 = -;  // 부호를 바꿔서 result2에 저장해라

- 부호 연산자가 붙은 변수값에는 부호 바뀜

 

- 부호 연산의 결과는 int로 저장됨

- int 이하 정수의 부호 연산은 무조건 int로 연산해야 함. int로 하지 않을 시 컴파일 에러 발생

byte b = 100;
byte result = -b;  //컴파일 에러 발생
int result = -b;  //(o)

 

  • 증감 연산자(++1씩 증가/--1씩 감소)
    • boolean 타입 외 모든 기본 타입 피연산자에 사용 가능
  num++;
  num--;
  ++num;
  --num;
연산식 (위치) 설명
++ 피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴
-- 피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴
피연산자 ++ 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴
피연산자 -- 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴

 

  • 변수의 앞 뒤 어디에든 올 수 있음
++i; , i++;  //모두 i=i+1;로 동일
--i;  ,  i--;  //모두 i=i-1;로 동일
  • 다른 연산자와 함께 사용될 경우 증감 연산자의 위치에 따라 결과 달라질 수 있음
int x = 1;
int y = 1;
int result1 = ++x + 10; // 식에서 피 연산자 앞에 있을땐 먼저 증감 연산 부터 수행
int result2 = y++ + 10; // 식에서 피 연산자 뒤에 있을땐 먼저 전체 연산식 부터 수행 한뒤 증감연산 수행

 

  • 논리 부정 연산자 (!)
    • true를 false로, false를 true로 변경
    • 토글(toggle) 기능(true를 false로, false를 true로 변경하는 기능)이나 조건문과 제어문에서 실행 흐름을 제어
    • boolean 타입에만 사용할 수 있음
연산식 설명
! 피연산자 피연산자가 true이면 false값 산출
피연산자가 false이면 true값 산출

 

 

이항연산자

단항 연산자는 피연산자가 1개라면 이항 연산자는 피연산자가 2개인 연산자를 뜻함

  • 산술 연산자
    • - +, -, *, /, %
연산식 설명
피연산자  + 피연산자 덧셈 연산
피연산자  - 피연산자 뺄셈 연산
피연산자  * 피연산자 곱셈 연산
피연산자  / 피연산자 왼쪽 피 연산자를 오른쪽 피 연산자에 나눗셈 연산
피연산자  % 피연산자 왼쪽 피 연산자를 오른쪽 피 연산자에 나눈 나머지를 구하는 연산

 

package sec02.exam04;

public class ArithmeticOperatorExample {

	public static void main(String[] args) {
		int v1 = 5;
		int v2 = 2;
		
		int result1 = v1 + v2;
		System.out.println("result1=" + result1);
		
		int result2 = v1 - v2;
		System.out.println("result2=" + result2);
		
		int result3 = v1 * v2;
		System.out.println("result3=" + result3);
		
		int result4 = v1 / v2;
		System.out.println("result4=" + result4);
		
		int result5 = v1 % v2;
		System.out.println("result5=" + result5);
		
		double result6 = 	(double) v1 / v2;
		System.out.println("result6=" + result6);

	}

}

 

더보기

결과 값

  • 피연산자 타입이 동일하지 않을 경우 아래 규칙에 따라 일치시켜 연산 수행

      - 피연산자가 byte, short, char 타입일 경우(int이하 정수 타입일 경우)에 모두 int 타입으로 변환

      - 피연산자 모두 정수 타입이고 long 타입 포함될 경우 모두 long 타입으로 변환

      - 피연산자 중 실수 타입이 있을 경우 허용 범위 큰 실수 타입으로 변환 

   

  • char타입의 산술 연산

         - 리터럴 ('A')와 플러스 연산을 하는 경우와 변수(c2)와 플러스 연산을 하는 경우 비교

더보기

c1과 같이 리터럴에 직접 연산을 하게 될 시 A의 값 65와 +1을 인식하여 66으로 컴파일이 된다.

하지만 c3와 같이 변수를 이용해 산술 연산을 하게 되면 변수를 사용하는 과정에 int타입으로 변환이 되기 때문에 컴파일 에러가 발생한다.

 

char타입보다 int타입의 허용범위가 더 크기 때문에 위와 같이 int타입으로 저장해주어야 한다.

(My Magazine 블로그 참고)

 

  • 문자열 결합 연산자 (+)
    • + 연산자의 피연산자 중 한 쪽이 문자열인 경우 
String str1 = "JDK" + 6.0;    // 6.0 -> 문자열로 전환
String str2 = str1 + " 특징";  // str2에 "JDK6.0 특징"이란 값이 저장됨
"JDK" + 3 + 3.0;  // 첫번째가 문자열일 경우 나머지가 숫자라 하더라도 문자열의 결합이 일어남  "JDK33.0" 산출
3 + 3.0 + "JDK";  // 문자열이 뒤에 있으면 숫자를 문자열로 취급x "6.0JDK" 산출

 

  • 비교 연산자
    • 피연산자의 대소 비교하여 true/false 산출 : 조건문이나 반복문에서 실행 흐름 제어
    • 값이 같은지 다른지를 비교하고 boolean값을 산출
    • 동등 비교 연산자는 모든 타입에서 사용 가능
    • 크기 비교 연산자는 boolean 외 모든 기본 타입에서 사용 가능 (boolean에만 못씀)
구분 연산식 설명
동등비교 피연산자1 == 피연산자2 두 피연산자의 값이 같은지를 검사
피연산자1 != 피연산자2 두 피연산자의 값이 다른지를 검사
크기
비교
피연산자1 > 피연산자2 피연산자1이 큰지를 검사
피연산자1 >= 피연산자2 피연산자1이 크거나 같은지를 검사
피연산자1 < 피연산자2 피연산자1이 작은지를 검사
피연산자1 <= 피연산자2 피연산자1이 작거나 같은지를 검사

- char 형식에도 대소 비교 가능

-int로 선언한 1과 double로 선언한 1.0은 연산과정에서 int형이 double로 변환되기 때문에 같다고 출력

-double로 선언한 0.1과 float로 선언한 0.1은 false가 나온다.

-실수타입을 저장할 때 부동 수소점 방식을 사용하여 정확하게 0.1을 저장할 수 없기 때문

-float형식으로 통일하여 선언해주어 비교해주거나 (double타입으로 통일하면x)

-정수 형변환 후 비교

 

    • 논리 연산자(&&, ||, &, |, ^, !)
      • boolean 타입만 사용 가능
      • 논리곱,논리합,논리부정을 수행하고 boolean 값을 산출
      • 논리곱은 연산식이 true , true 일경우에만 결과가 true가 된다 (즉,false가 하나만 있어도 flase)
      • 논리합은 연산식이 flase , flase일 경우에만 결과가 flase가 된다 (즉 ,true가 하나만 있어도 true)
구분 연산식 결과 설명
AND
(논리곱)
ture &&

또는

&

ture ture 피연산자가 모두 ture 일 경우에만 연산 결과가 true
ture flase flase
flase ture flase
flase flase flase
OR
(논리합)
ture ||

또는

|
ture ture 피연산자 중 하나만 true이면 연산 결과는 true
ture flase ture
flase ture ture
flase flase flase
XOR
(배타적 논리합)
ture ^ ture flase 피연산자가 하나는 true 이고 다른하나가 false일 경우에만 연산 결과가 true
ture flase ture
flase ture ture
flase flase flase
NOT
(논리부정)
  ! ture flase 피연산자의 논리값을 바꿈
flase ture

 

package sec02.exam09;

public class LogicalOperatorExample {

	public static void main(String[] args) {
		int charCode = 'A';
		
		if( (charCode>=65) & (charCode<=90) ) {       //&가 1개일 때는 앞의 값이 false여도 뒤에 값을 확인해봄
			System.out.println("대문자 이군요");
		}
		
		if( (charCode>97) && (charCode<=122) ) {      //&가 2개일 때는 앞의 값이 false이면 뒤에 값을 확인하지 않음(더 빠르게 결과값 산출)
			System.out.println("대문자 이군요");
		}
		
		if( !(charCode<48) && !(charCode>57) ) {      //두 항이 모두 false이지만 !연산자로 인해 true값 출력 !(not이 붙으면 true->false로 false는 true로 바뀜)
			System.out.println("0~9 숫자 이군요");
		}
		
		int value = 6;
		
		if( (value%2==0) | (value%3==3) ) {
			System.out.println("2 또는 3의배수 이군요");   //|가 1개일 때에는 앞의 값이 true여도 뒤에 값을 확인해봄
		}
		
		if( (value%2==0) | (value%3==3) ) {              //|가 2개일 때에는 앞에 값이 true면 뒤에 값을 확인하지 않음
			System.out.println("2 또는 3의배수 이군요");  
		}
		
	}

}
  • 특별한 경우가 아니면 &&와 || 로 사용하는 것이 더 효율적

 

  • 대입 연산자
    • 오른쪽의 값을 왼쪽에 대입하거나 연산후 대입
    • 단순 대입 연산자와 복합 대입연산자가 있음
구분 연산식 설명
단순 대입 연산자 변수 = 피연산자 오른쪽 피연산자의 값을 왼쪽 변수에 저장
복합 대입 연산자 변수 += 피연산자 변수 = 변수+피연산자와 동일
변수 -= 피연산자 변수 = 변수-피연산자와 동일
변수 *= 피연산자 변수 = 변수*피연산자와 동일
변수 /= 피연산자 변수 = 변수/피연산자와 동일
변수 %= 피연산자 변수 = 변수%피연산자와 동일
변수 &= 피연산자 변수 = 변수&피연산자와 동일
변수 |= 피연산자 변수 = 변수|피연산자와 동일
변수 ^= 피연산자 변수 = 변수^피연산자와 동일

 

 

삼항 연산자

  • (조건식) ? A : B를 말하며 조건이 true 이면 A를 산출하고, false이면 B를 산출
  • 3개의 피연산자를 필요로 하는 연산자
  • ? 앞의 조건식에 따라 콜론 앞뒤의 피연산자 선택
  • 조건식이 true면 앞의 값을, false면 뒤에 값을 결과 값으로 선택함

삼항 연산자가 2차례 사용된 식이다. 우선 score의 값을 비교해 A인지를 판단 후 후자의 조건으로 분기되어 한차례 더 삼항 연산자를 사용되었다.

 


코딩 공부하는 블로그
블로그 이미지 서하현 님의 블로그
VISITOR 오늘 / 전체