CH 3) 연산자(operator)와 피연산자(operand)

sim·2023년 2월 23일

자바의 정석

목록 보기
7/20

➰ 연산자

  • 연산자(operator) : 연산을 수행하는 기호
  • 피연산자(operand) : 연산자가 연산을 수행하는 대상
  • 모든 연산자는 연산결과를 반환한다. ()는 연산자 아님.
  • 식 (expression) : 연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것

연산자의 종류

1) 산술 연산자 : + - * / %
2) 비교 연산자 : > < >= <= == !=
3) 논리 연산자 : && || !
4) 대입 연산자 : =
5) 기타 : (type)- 형변환 ?:- 3항연산자 instanceof

연산자의 결합 규칙

1) 산술>비교>논리>대입 (대입이 제일 마지막)
2) 단항(1) > 이항(2) > 삼항(3)
3) 대입, 단항연산자만 오른쪽에서 왼쪽으로(ex. x=y=3)/ 나머지는 왼쪽에서 오른쪽으로

➰ 산술 연산자

1. 증감연산자

증가연산자 (++)
감소연산자 (--)

  • 전위형(prefix): 값이 참조되기 전에 증가 (ex. ++i;)
  • 후위형(postfix): 값이 참조된 후에 증가 (ex. i++;)
  • 증감연산자가 독립적으로 사용된 경우 전위형/후위형의 차이가 없다.
int i=5, j=0;
j = i++; //i=6, j=5

int i=5, j=0;
j = ++i; //i=6, j=6

2. 부호연산자

(-) : 피연산자의 부호를 반대로 변경

  • boolean, char을 제외한 기본형에만 사용 가능.

3. 사칙 연산자

+, -, *, /, %(나머지)

  • 0으로 나눌 수 없음.
  • 주의할 점은 나누기 연산자의 두 피연산자가 모두 int타입인 경우 -> 결과도 int타입. > int는 소수점을 저장하지 못하므로 소수점 이하가 버려짐. 반올림 발생x
int a =10;
int b = 4;
System.out.printf("%d / %d = %d%n", a, b, a/b);  // 10/4 = 2

// 올바른 연산결과를 위해서는 어느 한 쪽을 실수형으로 형변환하기
System.out.printf("%d / %f = %f%n", a, (float)b, a/(float)b); // 10/4.000000 = 2.500000

4. 산술 변환

연산 전에 피연산자의 타입을 일치시키는 것 (이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능~)

1) 두 피연산자의 타입을 일치시킨다. 보다 큰 타입으로 일치 (값손실 최소화)
ex. long + int -> long
float + int -> float
double + float -> double

2) 피연산자의 타입이 int보다 작은 타입(byte, short, char)이면 int로 변환.
ex. byte + short -> int
char + short -> int

byte a = 10;
byte b = 20;
byte c = a+b; //컴파일 에러가 발생함. 명시적 형변환 필요
// a+b는 int형으로 변환한 다음 연산을 수행하기 때문
byte c = (byte)(a+b);

5. 반올림하기

Math.round() 활용

double pi = 3.141592;
double shortPi = Math.round(pi*1000)  / 1000.0; // 소수점 넷째자리에서 반올림하기

Math.round(pi*1000)/1000.0
> Math.round(3.141592*1000)/1000.0
> Math.round(3141.592)/1000.0
>3142/1000.0
>3.142

System.out.println(shortPi);
--> 3.142
만약 3.141을 도출하고 싶다면?
double pi = 3.141592;
System.out.println((int)(pi*1000)/1000.0);
--> 3.141

6. 나머지 연산자 %

  • 오른쪽 피연산자로 나누고 남은 나머지를 반환.
    나누는 피연산자는 0이 아닌 정수만 허용 (부호는 무시됨)
int x = 10;
int y = 8;

System.out.printf("%d을 %d로 나누면, %n", x, y);
System.out.printf("몫은 %d이고, 나머지는 %d입니다.%n", x/y, x%y);
// 출력 10을 8로 나누면, 
// 몫은 1이고, 나머지는 2입니다.

➰ 비교 연산자

7. 비교 연산자

종류 : >, <, >=, <=, ==, !=
두 연산자를 비교하는 데 사용되는 연산자
참이면 true, 거짓이면 false

cf) 문자열의 비교

문자열 비교에는 ==대신 equals()를 사용해야 함.
대소문자 구분X : equalsIgnoreCase()

➰ 논리 연산자

8. 논리 연산자

&& (AND결합) 양쪽 모두 true여야 true
|| (OR결합) 어느 한 쪽이 true면 true (만약 앞의 조건이 true면 뒤의 조건을 굳이 연산하지 않음.)

  • &&가 ||보다 우선순위가 높음.
int a = 5;
int b = 3;
		
boolean c = a>b;
boolean d = a==b;
c = (a>b)||(--a>b); // 앞에 것이 true이기 때문에 뒤의 것이 연산되지 않은 채로 출력됨.
System.out.println(a+":" +b); // 출력 5:3

c = (a<b)||(--a>b); 
System.out.println(a+":"+b); // 출력 4:3

int a = 5;
int b = 3;
d = (a>b) && (a>(++b));
System.out.println(a+":"+b); // 출력 5:4
// i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
( i%2==0 || i%3==0 ) && (i%6!=0)
// 문자 ch는 숫자('0'~'9')이다.
'0'<=ch && ch<='9'
// 문자 ch는 대문자 또는 소문자이다.
('a'<=ch && ch<='z') || ('A'<=ch && ch<='Z')

9. 논리 부정 연산자

! : true를 false로, false는 true로 바꾼다.

boolean b = true;
!!b -> !!true -> !false -> true
//문자 ch가 소문자가 아니다.
!('a'<=ch && ch<='z')

➰ 대입 연산자

10. 대입 연산자

오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반환

  • lvalue (왼쪽 피연산자) : 저장공간. 변수, 배열
    (반드시 값을 변경할 수 있는 것이어야 함!!! >> 상수, 리터럴X)
  • rvalue (오른쪽 피연산자) : 변수, 식, 상수 모두 가능
int i = 0; 
3 = i+3; //에러. lvalue가 값을 저장할 수 있는 공간이 아님.
i+3 = i; //에러. lvalue의 연산결과가 리터럴

final int MAX = 3; 
MAX = 10; //에러. 상수에 새로운 값 저장불가.

11. 복합 대입 연산자

대입 연산자와 다른 연산자를 하나로 축약

i +=3; //i=i+3;
i -=3; //i=i-3;
i *=3; //i=i*3;
i /=3; //i=i/3;
i %=3; //i=i%3;
i <<=3; //i = i<<3;
i >>=3; //i = i>>3;
i &=3; // i = i&3;
i ^=3; // i = i^3;
i |=3; // i = i|3;
i *= 10+j; //i= i*(10+j);

➰ 기타

12. 형변환연산자

형변환(casting) : 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
방법 : (타입)피연산자

  • 피연산자인 변수의 값은 형변환 후에도 아무런 변화가 없음.
double d = 85.4;
int score = (int)d;
int score = (int)85.4;
int score = 85;
System.out.println(score); // 85
System.out.println(d);    // 85.4

13. 자동 형변환

기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다.
byte > short/char > int > long > float > double
반대 방향으로의 변환은 반드시 형변환 연산자 사용!

float f = 1234; //(1234는 int, float타입의 변수는 1234를 저장하는데 아무런 문제가 없으므로 편의상 생략 가능)
int i = 3.14f; //(에러 incompatible types: possible lossy conversion from float to int) 값 손실 발생
byte b = 100; //(OK. byte타입의 범위 -128~127 안에 있기 때문에)

14. 조건 연산자 (삼항 연산자)

(조건식) ? 참일 때 : 거짓일 때
조건식의 결과에 따라 연산결과를 달리한다.

result = (x>y) ? x : y ;
// (x>y)가 true면 x가 result, false면 y가 result

//-> if문으로 바꾸면
if(x>y)
	result = x;
else
	result = y;

// 3항연산자를 여러번 쓸 수 있기도 함.
result = (score>90) ? "A" : (score>80) 
					? "B" : (score>70)
                    ? "C" : (score>60)
                    ? "D" : "F";
profile
sim

0개의 댓글