본문 바로가기
개발자의 공부방/자바 기초

자바 기초] 연산자

by 쌈빡한 쥬니준 2019. 3. 7.

연산자


1. 연산자

  • 연산자란 자료의 가공을 위해 정해진 방식에 따라 계산하고 결과를 얻기 위한 행위를 의미하는 기호들의 총집합이다.
  • 각 연산자들은 연산을 하기 위해 인식하는 자료형들이 정해져 있다.




==========================================자세한 설명===========================================





1) 산술 연산자(Arithmetic Operators)

 

산술 연산을 수행하는 연산자를 말하며, 다른 언어에서 사용되는 사칙 연산자와 기능 및 서식 형태가 큰 차이가 없다. 이러한 산술 연산자는 이항 연산자, 부호 연산자, 증감 연산자 등으로 구별된다.

 

 

이항 연산자(Binary Operators)

연산자

의 미

사용 예

+

덧셈 연산자(Additive operator)

a=b+c;

b와 c를 더한 값을 a에 대입

-

뺄셈 연산자(Subtraction operator)

a=b-c;

b에서 c를 뺀 값을 a에 대입

*

곱셈 연산자(Multiplication operator)

a=b*c;

b와 c를 곱한 값을 a에 대입

/

나눗셈 연산자(Division operator)

a=b/c;

b에서 c를 나눈 값을 a에 대입

%

나머지 연산자(Remainder operator)

a=b%c;

b에서 c를 나눈 나머지 값을 a에 대입

 

부호 연산자(Sign Operators)

연산자

의 미

사용 예

+

양수 연산자(Unary plus operator)

b = +a;

양수임을 의미

-

부호의 반전(Unary minus operator)

b = -a;

  <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o />

 

증감 연산자(Increment/Decrement Operators)

연산자

의 미

사용 예

++

증가 연산자(increment operator)

a++; 또는 ++a;

a=a+1; 과동일

--

감소 연산자(decrement operator)

a--; 또는 --a;

a=a-1; 과동일

 

산술 연산자의 우선순위와 결합성

연산자 우선순위

연산자

결합성

-(단항), ++, --

우에서 좌로

*, /, %

좌에서 우로

+, -

좌에서 우로

=

우에서 좌로

         ※결합성이란 동일한 우선순위를 갖는 연산자들이 어느 방향으로 결합하는가를 결정

 

 

 

 

 

2) 관계 및 논리연산자

 

자바에서는 C/C++언어와는 다르게 모든 비교 및 논리 연산 식에 대한 결과는 참(true)이나 거짓(false)으로 처리한다.

 

 

관계 연산자(Relational operators)

연산자

의 미

사용 예

<

~ 보다 적다.

a < b

a가 b보다 적으면 true, 그렇지 않으면 false

<=

~ 보다 적거나 같다.

a <= b

a가 b보다 적거나 같으면 true, 그렇지 않으면 false

>

~ 보다 크다.

a > b

a가 b보다 크면 true, 그렇지 않으면 false

>=

~ 보다 크거나 같다.

a >= b

a가 b보다 크거나 같으면 true, 그렇지 않으면 false

 

동등 연산자(Equality operators)

연산자

의 미

사용 예

==

~ 와 같다.

a == b

a와 b가 같으면 true, 그렇지 않으면 false

!=

~ 와 같지 않다.

a != b

a와 b가 같지 않으면 true, 그렇지 않으면 false

 

논리 연산자(Conditional Operators)

연산자

의 미

사용 예

&&

AND(논리곱)

a && b

a와 b가 참이면 true, 그렇지 않으면 false

||

OR(논리합)

a || b

a 또는 b가 참이면 true, 그렇지 않으면 false

 

논리 부정 연산자(Logical complement operator)

연산자

의 미

사용 예

!

NOT(논리 부정)

!a

a가 거짓이면 true, 참이면 false

 

instanceof 연산자

객체명 instanceof 클래스명

객체명 instanceof 인터페이스명




3) 비트 단위 연산자(bitwise operators)

 

시스템 프로그램이나 게임 프로그램 등을 개발할 경우에는 각 비트들을 조작해야 하는 경우가 발생할 수 있다. 따라서 java는 각 비트에 접근하기 위해 비트 단위 연산자를 제공하며 비트 단위 연산자는 연산의 대상이 비트(bit)단위로 이루어지므로 먼저 연산 대상을 2진수로 변환하여 연산을 해야 한다.

또한 비트 단위 연산자는 피연산자로 double 또는 float 형을 제외한 산술 형 데이터를 취한다.

 

 

비트 단위 부정 연산자(Unary bitwise complement)

연산자

의 미

사용 예

~

해당 비트를 반전(0→1, 1→0)

b = ~a;

a값을 비트 단위로 반전시켜 b에 대입

 

비트 단위 논리 연산자

연산자

의 미

사용 예

&

비트 단위 AND

c = a & b;

a 와 b를 비트단위 AND 연산 후 c에 대입

|

비트 단위 OR

c = a | b;

a 와 b를 비트단위 OR 연산 후 c에 대입

^

비트 단위 Exclusive OR

c = a ^ b;

a 와 b를 비트단위 XOR 연산 후 c에 대입

■ 비트 단위 논리 연산자의 진리표

a

b

a & b

a | b

a ^ b

0

0

0

0

0

0

1

0

1

1

1

0

0

1

1

1

1

1

1

0

 

비트 단위 이동 연산자

연산자

의 미

사용 예

>>

산술적 우측 Shift 연산자

c = a >> b;

a를 2진수로 변환 후 b 비트만큼 우측으로 이동

(이동으로 생긴 왼쪽 자리는 MSB(부호)로 채움)

<<

산술적 좌측 Shift 연산자

c = a << b;

a를 2진수로 변환 후 b 비트만큼 좌측으로 이동

(이동으로 생긴 우측 자리는 0으로 채움)

>>>

논리적 우측 Shift 연산자

c = a >>> b;

a를 2진수로 변환 후 b 비트만큼 우측으로 이동

(이동으로 생긴 왼쪽 자리는 0으로 채움)

 

 

 

 

 

4) 대입 연산자(assignment operators)

 

대입 연산자 『=』는 그 좌우의 값이 서로 같다(equal)는 수학적인 의미가 아닌, 우측의 값을 좌측에 대입(assign)한다는 의미를 갖고 있다.

 

연산자

의 미

사용 예

=

우변의 값을 좌변에 대입

a=b;

 

+=

좌변과 우변의 값을 더해서 좌변에 대입

a+=b;

a=a+b; 와 동일

-=

좌변에서 우변의 값을 뺀 후 좌변에 대입

a-=b;

a=a-b; 와 동일

*=

좌변과 우변의 값을 곱해서 좌변에 대입

a*=b;

a=a*b; 와 동일

/=

좌변에서 우변의 값을 나눈 후 좌변에 대입

a/=b;

a=a/b; 와 동일

%=

좌변에서 우변의 값을 나눈 나머지를 좌변에 대입

a%=b;

a=a%b; 와 동일

<<=

좌변 값을 우변 수만큼 비트단위로 좌측 이동한 값을 좌변에 대입

a<<=b;

a=a<<b; 와 동일

>>=

좌변 값을 우변 수만큼 비트단위로 우측 이동한 값을 좌변에 대입(빈 공간은 MSB로 채움)

a>>=b;

a=a>>b; 와 동일

>>>=

좌변 값을 우변 수만큼 비트단위로 우측 이동한 값을 좌변에 대입(빈 공간은 0으로 채움)

a>>>=b;

a=a>>>b; 와 동일

&=

좌변과 우변의 값을 비트단위 AND 연산 후에 좌변에 대입

a&=b;

a=a&b; 와 동일

^=

좌변과 우변의 값을 비트단위 배타적 OR 연산 후에 좌변에 대입

a^=b;

a=a^b; 와 동일

|=

좌변과 우변의 값을 비트단위 OR 연산 후에 좌변에 대입

a|=b;

a=a|b; 와 동일

 

 

5) 조건 연산자(Conditional operator)

 

조건 연산자는 삼항 연산자 또는 선택 연산자라 하며, 자바 언어 중 유일하게 피연산자(오퍼랜드)가 3개 필요한 연산자이다.

 

변수 = 조건식 ? 값1 : 값2;

조건식을 판단하여 조건식이 참이면 『값 1』을, 조건식이 거짓이면 『값 2』를 갖는다.

 

■ 사용 예

max = x > y ? x : y;

x 변수의 값이 y 변수의 값보다 크면 x를, 그렇지 않으면 y를 max에 대입한다.

일부 출처 : http://goldenpig.egloos.com/3032166 




원글 출처 : https://jhrun.tistory.com/133






==========================================표로 한눈에보기=======================================




2. 연산자의 정류와 우선순위

종류 

연산자 

우선순위 

최우선 연산자

. , [], ()

단항 연산자 

!, ~, +/-, ++/--, (type) 

산술 연산자 

*, / , %, +, - 

시프트 연산자 

<<, >>, >>> 

관계 연산자 

>, <, >=, <=, ==, != 

비트 연산자 

&, |, ^ 

논리 연산자 

&&, || 

조건(삼항) 연산자 

조건 ? 항1 : 항2 

배정 대입 연산자 

*=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, !=, ^=, = 

후위형 증감 연산자 

++/-- 

10 

순차 연산자 

11 




==========================================코드 테스트===========================================

package com.playground.java;
public class TEST2 {
//10진수를 2진수로 변환하는 메서드.
//아래 Shift 연산자에 이용하는 메서드.
static String toBinaryString (int x) {
String zero = "00000000000000000000000000000000";
String tmp = zero + Integer.toBinaryString(x);
return tmp.substring(tmp.length()-32);
}
public static void main(String[] args) {
//1. 최우선 연산자
//.(perid) 연산자 : 접근연산자
//특정 범위 내에 속해 있는 맴버를 지칭할 때 사용함.
System.out.println("TEST");
//[] 대괄호 연산자
//배열 참조 연산자
//자료형이나 클래스와 함께 사용되어 해당 변수나 객체가 배열로 선언됨을 알리는 역할
String[] arr = {"aa","bb","cc"};
//() 괄호 연산자
//특정 연산자들을 묶어서 먼저 처리할 수 있도록 만들어주는 연산자
int a = 5 * (3+2);
//2. 단항 연산자
// ! 논리부정 연산자
//논리 자료형의 데이터 값을 부정하는 연산자
boolean bool = false;
boolean bool2 = !bool;
System.out.println(bool2);
// ~ 비트 부정 연산자
//비트 값으로 존재하는 모든 자료들에 대해 부정의 값을 취할 수 있는 연산자
//단, boolean, float, double형은 ~ 연산자를 사용할 수 없음.
//byte, short, char, int 형은 '~' 연산 결과 후 int, long 형에만 담을 수 있음.
byte b = 2;
int i = ~b;
System.out.println(i);
//long형은 '~' 연산 후 long형에만 담을 수 있음.
// +/- (양수, 음수 판별) 연산자
//양수, 음수 판별해주는 연산자(+ 생략가능)
int c = -10;
// ++/-- (전위형증감) 연산자
// 1) 특정 변수의 값을 하나 증가시키거나 하나 감소키기는 연산자
int d = 4;
int e = ++a;
// 2) 후위 연산자와 우선순위의 차이가 존재함.
int f = 10;
int g = ++f;
System.out.println("f= "+f);
System.out.println("g= "+g);
// 3.산술연산자
// +, -, *, /, % 연산자
// 1) byte, short, char, int 자료형 사이의 연산에서는 결과가 int임.
// 2) long, float, double 자료형이 연산되면 큰 자료형으로 결과가 결정됨.
// 3) '/' 목, '%' 나머지 값(자바스크립트와는 다름)
short h,j;
h = j = 10; // h=10,j=10 이렇게 생각하면 된다.
short k = (short) (h + j);
System.out.println("k의 값 :"+k);
// 4.시프트 연산자
//대상 변수의 값을 2진 비트로 바꾼 후 특정 비트 수만큼 이동시켜 원하는 부분의 비트 데이터를
//얻어 내는 연산자
// x << n 은 x * 2n 의 결과와 같다.
// x >> n 은 x / 2n 의 결과와 같다.
//쉬프트 연산자가 나눗셈, 곱셈 연산자 보다 연산 속도가 빠르다. 하지만 가독성이 안좋다.
// << (left shift) 연산자
// 1) 대상 변수 값을 2진 비트로 바꾼 후 왼쪽으로 특정 비트 수만큼 이동
// 2) 빈자리는 0 값으로 채움
int dec = 3; // 왼쪽으로 가는 경우는
System.out.printf("%d << %d = %4d \t%s%n", dec, 2, dec >> 2, toBinaryString(dec << 2));
//결과는 6의 2진수가 나온다.
// >> (right Shift) 연산자
// 1) 대상 변수 값을 2진 비트로 바꾼 후 왼쪽으로 특정 비트 수만큼 이동
// 2) 빈자리는 0값으로 채움.
int dec2 = -8; //음수일 경우 0000... 을 1 로 채운다. 양수이면 0 으로!
//정수로 출력 << 정수로 출력 = 정수를 4칸뛰어서 표현 \t는 탭,%s는 스트링으로 출력, %n 은 줄바꿈
System.out.printf("%d >> %d = %4d \t%s%n", dec2, 2, dec2 >> 2, toBinaryString(dec2 >> 2));
//결과는 -32의 2진수가 나온다.
// >>> (unsigned right shift) 연산자
// '>>' 와 기본적으로 같음.
// 그러나 원본 데이터가 음수일 경우에도 빈 비트를 0으로 채움.
int dec3 = -10;
int dec4 = dec3 >>> 2;
System.out.println("dec3 = "+dec3+"\t"+"dec4 = "+dec4);
// 5. 관계 연산자
// <, >, <= >= (비교 관계) 연산자
// ==, != (항등관계) 연산자
int number1 = 10;
int number2 = 20;
boolean comparison = number1 < number2; //변수 number1이 변수 number2 보다 작다.
System.out.println("number1 < number2 :"+comparison);
comparison = number1 != number2; //변수 number1과 변수 number2는 같지 않다.
System.out.println("number1 != number2 :"+comparison);
// 6.논리연산자
// && (AND) || (OR) → 앞의 것만으로도 판단 가능이면 판단함.
// short circuit : && 일 경우 false 출력 ||일 경우 true 출력 고로 실행 속도가 빠르다.
// & | 사용 다 실행 후 결과 출력 실행속도가 느리다.
/* & : A&B 일 때 양쪽 모두를 검사한다
* && : 피연산자 양쪽 모두 true 이어야 true를 결과로 얻는다.
* | : A|B 양쪽 모두를 검사한다.
* || : 피연산자 어느 한쪽만 true이면 true를 결과로 얻는다.
*/
boolean cmp;
boolean cmp2;
if ((cmp=4>3) && (cmp2=5>7)) {
System.out.println("cmp = "+cmp);
System.out.println("cmp2 = "+cmp2);
}
// 이렇게 하면 Error
// 그러나 | 로 고치면 cmp=true, cmp2=false 로 출력
// && 은 양쪽 모두라서 else 가 없으면 아무것도 출력하지 않음.
// 7.삼항연산자
//조건항 ? 피연산자1 (true일때) : 피연산자2 (false일 때)
//조건식의 연산결과가 true 면 결과는 피연산자1이고, 조건식의 연산결과가 false면 결과는 피연산자2
int num1 = 20, num2 = 30, max;
max = num1 > num2 ? ++a : ++num2;
System.out.println("max: "+max);
System.out.println("num1: "+num1);
System.out.println("num2: "+num2);
int b1 = (5>4) ? 50 : 40;
System.out.println("결과는 ? "+b1);
int b2 = 0;
if (5>4) {
b2 = 50;
System.out.println("결과는? "+b1);
}else
b2=40;
System.out.println("결과는? "+b2);
// 8. 배정연산자, 대입연산자
// *=, /=, %=, +=, -=, <<=, >>=, >>>= ^=, &=, !=, =
int c1 = 2;
int res = 3;
int result = c1 & res;
res += c1; System.out.println("res= "+res);
res *= c1; System.out.println("res= "+res);
res -= c1; System.out.println("res= "+res);
res %= c1; System.out.println("res= "+res);
res &= c1; System.out.println("res= "+res);
}
}


댓글0