본문 바로가기

Programming/JAVA

자바의 연산

1. 연산자(Operator)와 피연산자(Operand)

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

이 연산자와 피연산자를 이용하여 연산의 과정을 기술한 것을 연산식이라고 한다. 

 

우선순위 연산자 설명 연산 방향
1 [] 첨자 연산자 —————>
  . 멤버 연산자 —————>
2 ++, -- 후위 증감 연산자 <—————
3 ! 논리 NOT 연산자 <—————
  ~ 비트 NOT 연산자 <—————
  +, -  양/음의 부호(단항 연산자) —————>
  ++, -- 전위 증감 연산자 <—————
4 *, /, % 곱셈, 나눗셈, 나머지 연산자(이항 연산자) —————>
5 +, - 덧셈, 뺄셈 연산자(이항 연산자) —————>
6 <<, >>, >>> 비트 시프트 연산자 —————>
7 <, <=, <, >=, instanceof 관계(비교) 연산자 —————>
8 ==, != 관계 연산자 —————>
9 & 비트 AND 연산자 —————>
10 ^ 비트 XOR 연산자 —————>
11 | 비트 OR 연산자 —————>
12 && 논리 AND 연산자 —————>
13 || 논리 OR 연산자 —————>
14 ? : 삼항 조건 연산자 —————>
15 =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |= 대입 연산자 및 복합 대입 연산자 <—————

-> 여러가지 연산자들이 섞여 있으면 괄호 ()를 사용해 먼저 처리해야할 연산식을 묶어서 처리한다.

 

 

-단항 연산자

: 피연산자가 단 하나뿐인 연산자

 

 

1. 부호 연산자 (+, -)

: 양수 및 음수를 표시하는 +, - 는 산술 연산자이기도 하고 부호 연산자이기도 하다. 

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

-> + 연산자는 변수 값의 부호를 유지하고 - 연산자는 변수 값의 부호를 양수는 음수로, 음수는 양수로 바꾼다.

 

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


/* 부호 연산자의 산출 타입은 int 타입이다*/

short s = 100;
short result = -s;		// 컴파일 에러

int result3 = -s;		// 컴파일 성공

 

2. 증감 연산자 (++, --)

: 변수의 값을 1 증가(++) 시키거나 1 감소 (--)시키는 연산자이다.

연산식 설명
++ 피연산자 다른 연산 수행 전에 피연산자의 값을 1 증가
-- 피연산자 다른 연산 수행 전에 피연산자의 값을 1 감소
피연산자 ++ 다른 연산을 수행 후 피연산자의 값을 1 증가
피연산자 -- 다른 연산을 수행 후 피연산자의 값을 1 감소

 

int x = 1;
int y = 1;
int result1 = ++x + 10;		// result1에는 12가 저장
int result2 = y++ + 10;		// result2에는 11이 저장

int a = 7;
int b;

b = ++a;		// b = 8, a = 8
b = a++;		// b = 8, a = 9

 

3. 논리 부정 연산자 (!) 

: true를 false로, false를 true로 변경해주는 연산자로 boolean 타입에만 사용할 수 있다.

연산식 설명
! 피연산자

피연산자가 true이면 false 값을 산출

피연산자가 false이면 true값을 산출

-> 조건문과 제어문에서 사용되어 조건식의 값을 부정하도록 실행흐름을 제어할 때 주로 사용된다.

토글(toggle)기능을 구현할 때도 주로 사용한다.

 

boolean play = true;	// play == true
play = !play;			// play == false

 

 

4. 비트 반전 연산자 (~)

: 정수 타입의 피연산자에만 사용되며, 피연산자를 2진수로 표현했을 때 비트값인 0을 1로, 1은 0으로 반전한다. 

연산식 설명
~ 10 (0 0 0 0 1 0 1 0) - 11 (1 1 1 1 0 1 0 1)

-> 비트 반전 연산자 산출 타입은 int 타입이 된다.

 

 

-이항 연산자

: 피연산자가 두 개인 연산자

 

1. 산술 연산자(+, -, *, /, %)

: 사칙연산을 다루는 연산자로, boolean타입을 제외한 모든 기본 타입에 사용할 수 있다.

연산식 설명
피연산자 + 피연산자 덧셈 연산 (문자열 연결 연산자에도 사용된다)
피연산자 - 피연산자 뺄셈 연산
피연산자 * 피연산자 곱셈 연산
피연산자 / 피연산자 좌측 피연산자를 우측 피연산자로 나눗셈 연산
피연산자 % 피연산자 좌측 피연산자를 우측 피연산자로 나눈 나머지를 구하는 연산

-> 피연산자들의 타입이 동일하지 않을 경우 피연산자들의 타입을 일치시킨 후 연산을 수행해야한다.

long을 제외한 정수 타입 연산은 int 타입으로 산출되고, 피연산자 중 하나라도 실수 타입이면 실수 타입으로 산출된다.

 

byte btyeValue1 = 1;
byte byteValue2 = 3;

byte result = byteValue1 + byteValue2;		// 컴파일 에러
int result = byteValue1 + byteValue2;		// 2가 저장

-> 산출 타입이 int이기 때문에 int 타입 변수에 산출값을 대입해야 한다.

 

 

int int1 = 10;
int int1 = 4;
int result2 = int1 / int2;		// 2가 저장
double result3 = int1 / int2;	// 2를 실수화해서 2.0이 저장


/* 실수로 산출 결과를 얻는 방법 */

double result3 = int(1*1.0) / int2;
double result3 = (double) int1 / int2;
double result3 = int1 / (double) int2;		// 모두 2.5가 저장된다

 

 

※ 오버플로우(Overflow)

: 데이터 타입에 저장될 수 있는 값의 범위를 초과하게 되는 경우 발생한다. 

 

int x = 1000000;
int y = 1000000;
int z = x * y;
long r = (long) x * y;

System.out.println(z);		// -727379968(쓰레기 값)이 저장된다.
System.out.println(r);		// 1000000000000이 저장된다.

 

 

2. 비교 연산자(<, <=, >, >=, ==, !=)

: 대소, 또는 동등을 비교해서 boolean 타입인 true/false를 산출한다. 대소 연산자는 boolean 타입을 제외한 기본 타입에 사용 가능하고, 동등 연산자는 모든 타입에 사용 가능하다.

 

구분 연산식 설명
동등 비교 피연산자1 == 피연산자2 두 피연산자의 값이 같은지를 검사
피연산자1 != 피연산자2 두 피연산자의 값이 다른지를 검사
크기 비교 피연산자1 > 피연산자2 피연산자1이 큰지를 검사
피연산자1 >= 피연산자2 피연산자1이 크거나 같은지를 검사
피연산자1 < 피연산자2 피연산자1이 작은지를 검사
피연산자1 <= 피연산자2 피연산자1이 작거나 같은지를 검사

-> 비교 연산자는 연산을 수행하기 전에 타입 변환을 통해 피연산자의 타입을 일치시킨다. 피연산자가 int와 double일 경우 보다 큰 타입인 double 타입으로 변환 후 비교한다.

char 타입끼리의 비교에서는 유니코드의 값으로 비교 연산을 수행한다. 

 

 

※String 타입의 문자열 비교

: String 타입의 문자열을 비교할 때에는 대소 연산자를 사용할 수 없고, 동등 비교 연산자는 사용할 수 있으나

문자열이 같은지, 다른지를 비교하는 용도로는 사용되지 않는다.

 

String str1 = "뽀삐";
String str2 = "뽀삐";
String str3 = new String("뽀삐");

str1 == str2;		// true
str2 == str3;		// false

 str1과 str2는 동일한 객체의 번지값을 가지고 있지만 str3는 객체 생성 연산자인 new로 생성한 새로운 String 객체의 번지값을 가지고 있기 때문에 위와 같은 결과가 출력된다.

 

따라서 객체와 별개로 String 객체의 문자열만을 비교하고 싶으면 == 이 아닌 equls() 메소드를 사용해야 한다.

 

boolean result1 =  str1.eqlus(str2);	// result1에는 true값 저장
boolean result2 = str2.equls(str3)	// result2에는 true값 저장

 

 

3. 논리 연산자(&&, ||, &, |, ^, !)

: 주어진 논리식을 판단하여 boolean 타입인 true/false를 산출한다.

구분 연산식 결과 설명

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,

다른 하나가 false일 경우 연산결과 true

true false true
false true true
false false false

NOT

(논리부정)

  ! true false 피연산자의 논리값을 바꿈
false true

-> &&와 &, ||와 |는 같은 산출 결과를 내지만 연산 과정이 다르다. &&와 ||는 앞의 피연산자를 보고 바로 판단 후 결과를 내지만 &와 |는 뒤의 피연산자까지 판단 후 결과를 낸다.

 

int charCode = 'A';	

if (charCode>=65 && charCode <= 90) {
	System.out.println("대문자");	
}

 

 

4. 비트 연산자(&, |, ^, ~, <<, >>, >>>)

: 데이터를 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자이다. 

 

-비트 논리 연산자(&, |, ^)

: 피연산자가 boolean 타입일 경우에는 일반 논리 연산자이고, 정수 타입일 경우에는 비트 논리 연산자로 사용

 

구분 연산식 결과 설명

AND

(논리곱)

1 & 1 1 두 비트 모두 1일 경우에만 연산 결과 1
1 0 0
0 1 0
0 0 0

OR

(논리합)

1 | 1 1 두 비트 중 하나만 1이면 연산 결과 1
1 0 1
0 1 1
0 0 0

XOR

(배타적논리합)

1 ^ 1 0

두 비트 중 하나는 1이고

다른 하나가 0일 경우 연산 결과 1

1 0 1
0 1 1
0 0 0

NOT

(논리부정)

  ~ 1 0 보수
  0 1

 

-비트 이동 연산자(<<, >>, >>>)

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

구분 연산식 설명
이동 a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동 (빈자리는 0)
a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동 (빈자리는 a의 최상위 부호) 
a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동 (빈자리는 0)

 

5. 대입 연산자(=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=)

: 오른쪽  피연산자의 값을 좌측 피연산자인 변수에 저장하는 연산자이다.

 

구분 연산식 설명
단순 대입 연산자 변수 = 피연산자 우측의 피연산자의 값을 변수에 저장
복합 대입 연산자 변수 += 피연산자 변수 = 변수 + 피연산자와 동일
변수 -= 피연산자 변수 = 변수 - 피연산자와 동일
변수 *= 피연산자 변수 = 변수 * 피연산자와 동일
변수 /= 피연산자 변수 = 변수 / 피연산자와 동일
변수 %= 피연산자 변수 = 변수 % 피연산자와 동일
변수 &= 피연산자 변수 = 변수 & 피연산자와 동일
변수 |= 피연산자 변수 = 변수 | 피연산자와 동일
변수 ^= 피연산자 변수 = 변수 ^ 피연산자와 동일
변수 <<= 피연산자 변수 = 변수 << 피연산자와 동일
변수 >>= 피연산자 변수 = 변수 >> 피연산자와 동일
변수 >>>= 피연산자 변수 = 변수 >>>= 피연산자와 동일

 

 

-삼항 연산자(?:)

: 세 개의 피연산자가 필요로 하는 연산자

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

       (피연산자1)                             (피연산자2)                                 (피연산자3)            

 

-> 조건식을 연산한 값이 true이면 삼항 연산자의 결과는 피연산자2가 되고,

조건식을 연산한 값이 false이면 삼항 연산자의 결과는 피연산자3이 된다.

'Programming > JAVA' 카테고리의 다른 글

BufferedReader, BufferedWriter를 이용한 빠른 입출력  (0) 2019.12.20
자바의 제어문 (조건문과 반복문)  (0) 2019.12.19
자바의 변수와 타입  (0) 2019.12.13
자바 개요  (0) 2019.12.12
Eclipse 다운로드 및 설치  (0) 2019.12.12