03-1 / 연산자와 연산식

연산 개념)

c = a + b

연산에 사용되는 표시나 기호를 연산자(operator). ( = , + )

연산자와 함께 연산되는 데이터를 피연산자(operand). ( c, a, b )

연산자와 피연산자를 이용하여 연산과정을 기술한걸 연산식(expression). ( c = a + b)

 

 


연산자의 종류)

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


비트 ~, &, |, ^, <<, >> 단항 / 이항   피연산자를 비트단위 논리 연산한다
<<, >>는 Shift(쉬프트) 연산자라고도 한다.
형변환
(캐스팅)
(type) 단항 다양 가로안에 지정한 타입으로 형변환 한다.

* 03-2에서 좀더 자세하게

 

 


연산의 방향과 우선순위)

1. 단항 >  이항 > 삼항 연산자 순으로 우선순위를 갖는다.

2. 산술 >  비교 > 논리 > 대입 연산자 순으로 우선순위를 갖는다.

3. 우선순위가 같다면 왼쪽에서 오른쪽 방향으로 수행

   단, 단항 연산자(++, --, ~, !), 부호 연산자(+,-), 대입 연산자(=, +=, -=, *=, /=, %=) 는 오른쪽에서 왼쪽 방향으로 수행

4. 복잡한 연산식에는 괄호 ()를 사용해 우선순위를 정해준다.

 

 

 

 


03-2 / 연산자의 종류

연산자는 아래와 같이 구분

구분 종류
산출방법 산술, 부호, 문자열 대입, 증감, 비교
피연산자 수 단항, 이항, 삼항

 

단항 연산자) 

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

양수 및 음수를 표현하는 연산자.  기본타입 중 boolean, char 제외 사용가능

int x = -10;
float y = +3.14f;
double z = -10.543;

int x1 = -x;	// 10
float y1 = -y;	// -3.14f
double z1 = -z;	// 10.543

 

다만, byte타입은 부호 연산자의 결과가  int타입이 되므로 int값에 대입하거나 캐스팅 연산자로 형변환을 시켜야한다.

byte x = -1;
byte byteValue = -x; // 컴파일 에러

int intValue = -x;
byte byteValue = (byte) -x;

 

 

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

변수의 값을 1 증가 (++) 시키거나 1 감소 (-- / 대쉬2번) 시키는 연산자. 기본타입 중 boolean 제외 사용가능

증감 연산자에서 숫자의 위치는 매우 중요하다. 증감 연산자만을 사용한 식이라면 괜찮겠지만 다른 연산자와 함께 사용된다면 숫자의 위치에 따라 연산 수행 순서가 달라지기 때문

위치 설명
++ / -- 피연산자 다른 연산을 수행하기 에 피연산자 값을 변화시킴
피연산자 ++ / -- 다른 연산을 수행한 에 피연산자 값을 변화시킴
int x = 10;
int y = 10;
int z;

z = x++;
System.out.println(z);  // 10 증감되기 전에 대입이 먼저 됬기 때문
System.out.println(x);  // 11 대입 이후 증감 적용

z = ++x;
System.out.println(z);  // 12 대입되기 전에 증감이 먼저 됬기 때문
System.out.println(x);  // 12 이미 증감이 적용됨

z = ++x + y++;
System.out.println(z);  // 23 x는 증감됬고 y는 증감안되서 13 + 10 
System.out.println(x);  // 13
System.out.println(y);  // 11 대입 이후 증감 적용

 

 

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

true를 false로 false를 true로 변경하여 boolean타입에만 사용가능

주로 조건문과 제어문에서 조건식의 값을 부정하여 실행 흐름을 제어할 때 주로 사용하거나 

두가지 상태 (true / false)를 번갈아가며 변경하는 토글(Toggle)기능을 구현할 때 사용

boolean play = true;
System.out.println(play); 	// true
System.out.println(!play); 	// false

play = !play
System.out.println(play) 	// false

 

 

 


이항 연산자)

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

사칙연산자인 덧셈, 뺄셈, 곱셈, 나눗셈과 나머지를 구하는 %까지 총 5개. 기본타입 중 boolean 제외 사용가능

        int x = 10;
        int y = 5;
        int z;

        z = x + y;	// 15 덧셈
        z = x - y;	// 5  뺄셈
        z = x * y;	// 50 곱셈
        z = x / y;	// 2  나누기
        z = x % y;	// 0  나눈 나머지

 

산술 연산자는 타입이 동일하지 않을 경우 다음과 같은 규칙으로 타입을 일치시켜 연산을 수행

피연산자 타입들이 byte, short, char 일 경우 모두 int 타입으로 변환
정수 타입 피연산자들 사이에 long 타입이 포함된 경우 모두 long 타입으로 변환
피연산자들 사이에 실수타입(float, double)이 포함된 경우 모두 허용 범위가 큰 실수 타입으로 변환

 

정수값 간의 산술식에서 실수 값을 얻고 싶다면 피연산자 중 하나를 실수 타입으로 변경하면 된다.

int x = 10;
int y = 6;
int z1;
double z2;

z1 = x / y;		// 1
z2 = x / (double) y;	// 1.6666666666666667

 

char 타입도 정수타입이므로 산출 연산이 가능하지만 산출 결과가 int 값이기 때문에 다시 char 변수에 대입하면 컴파일 에러가 발생. 캐스팅 연산자를 서서 변환하거나 int 변수에 대입해야 한다.

char a = 'A';

//char z1 = a + 1; 	  // 컴파일 에러 
char z1 = (char)(a + 1); // B
int z2 = a + 1; 	 // 66

 

 

2. 문자열 결합 연산자 ( + ) 

문자열을 서로 결합하는 연산자. 피연산자 중 하나가 문자열이면 다른 피연산자들도 문자열로 변환해 서로 결합

연산순서에 따라 결과값이 다를 수 있다.

String a = 3 + 3.0 + "JDK";
System.out.println(a);		// 6.0JDK

String b = "JDK" + 3 + 3.0;
System.out.println(b);		// JDK33.0

 

 

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

피연산자의 대소 또는 동등여부를 비교해서 true / false 값을 산출한다. 기본타입 중 boolean 제외 사용가능

흐름 제어문인 조건문, 반복문에서도 주로 이용된다

int num1 = 10;
int num2 = 14;

System.out.println(num1 > num2);	// false
System.out.println(num1 >= num2);	// false
System.out.println(num1 < num2);	// true
System.out.println(num1 <= num2);	// true
System.out.println(num1 == num2);	// false
System.out.println(num1 != num2);	// true

char a = 'A';
System.out.println(a == 65);		// true / a가 int값으로 변환되어 비교 

double b = 3.0;
System.out.println(b == 3);		// true / 3이 double값으로 변환되어 비교

 

 

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

논리곱, 논리합, 배타적 논리합, 논리 부정 연산을 수행.  boolean 타입만 사용가능

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

 

연산기호가 하나일때와 두개일때 (& vs && , | vs ||) 차이는 연산과정 차이로

연산기호가 두개일때는 앞의 피연산자 결과가 결과판단에 결정적이면 이후 피연산자들은 평가하지 않고 바로 산출 결과를 낸다. 그러나 연산기호가 한개일때는 앞의 피연산자의 결과판단에 상관없이 이후 모든 피연산자들을 평가한다.

따라서 더 효율적인 것은 &&과 ||이다.

 

ex) && 연산에서 맨 앞 피연산자가 false가 나왔다면 이후 피연산자와 관계없이 결과는 false로 결정된다. 따라서 이후 피연산자를 평가하지 않고 false값을 출력 

 

논리 연산은 흐름 제어문인 조건문, 반복문 등에 주로 사용된다.

 

 

 

5. 대입 연산자 ( = , += , -= , *= , /= , %= ) 

오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 저장한다. 

종류에는 단순히 값을 저장만 하는 단순 대입 연산자와 정해진 연산을 수행한 후 결과를 저장하는 복합 대입 연산자가 있다. 

대입 연산자는 모든 연산자들 중 가장 낮은 연산 순위를 가지고 있다. 그리고 연산수행 방향은 오른쪽에서 왼쪽

구분 연산식 설명
단순 대입 연산자 변수 = 피연산자 오른족 피연산자 값을 왼쪽 변수에 저장
복합 대입 연산자 변수 += 피연산자 변수 = 변수 + 피연산자
변수 -= 피연산자 변수 = 변수 - 피연산자
변수 *= 피연산자 변수 = 변수 * 피연산자
변수 /= 피연산자 변수 = 변수 / 피연산자
변수 %= 피연산자 변수 = 변수 % 피연산자
변수 &= 피연산자 변수 = 변수 & 피연산자
변수 |= 피연산자 변수 = 변수 | 피연산자
변수 ^= 피연산자 변수 = 변수 ^ 피연산자

 

 

 

6. 삼항 연산자 ( ?: ) 

3개의 피연산자를 필요로 하는 연산자이다. 구조는 아래와 같다

조건식
(피연산자1)
? 값 또는 연산식
(피연산자2)
: 값 또는 연산식
(피연산자3)

조건식을 연산했을때 true가 나오면 결과는 피연산자2가 산출되고 연산 결과가 false면 피연산자3이 산출된다.

결과값으로 나오는 연산식을 이용해 또 삼항 연산자를 넣는다면 여러 조건에 해당하는 결과값을 도출가능하다.

 

 

 

 

+ Recent posts