코린이의 소소한 공부노트

조건 연산과 대입 연산 본문

Java

조건 연산과 대입 연산

무지맘 2022. 1. 1. 16:00

조건/대입 연산은 각각 조건/대입 연산자를 이용한 연산을 말한다.

이 글에서는 연산 위주로 설명하고 있으므로, 연산자에 대한 자세한 설명을 원한다면 아래 링크를 참조하면 된다.

2021.12.28 - [Java] - 연산자(operator)의 종류와 우선순위, 결합규칙

 

조건 연산자는 유일한 3항 연산자이다. 조건식 ? 식1 : 식2 순으로 쓰면 된다. 조건식이 참이면 식1의 결과가, 거짓이면 식2의 결과가 나온다.

// x와 y중 더 큰 수를 출력
int x=9, y=5;
System.out.println((x > y) ? x : y); // 9 
// 괄호는 생략 가능하지만
// 가독성을 위해 쓰는 것이 좋다.

위 식은 x, y선언을 빼면 1줄이지만 if문으로 쓰면 몇 줄이 될까?

if (x>y) {
	System.out.println(x);
}
else {
	System.out.println(y);
}
// 차이가 많이 난다.

 

대입 연산자는 오른쪽 피연산자의 결괏값을 왼쪽 피연산자에 저장한 후 그 값을 반환한다. 저장까지는 이해되는데, 반환한다는 게 좀 이상하다는 생각이 들면 "모든 연산자는 연산 결과를 반환한다."는 말을 떠올려보자. 금방 받아들일 수 있다.

int x, y;
System.out.println(x = y = 3); // 3
// 대입 연산자는 오른쪽에서 왼쪽으로 결합
// 변수 y에 3을 저장한다.
// -> y의 값(3)을 불러와서 x에 저장한다.
// -> x의 값(3)을 불러와서 출력한다.

// 제대로 저장되었나 확인해보기
System.out.println(x); // 3
System.out.println(y); // 3

대입 연산자의 왼쪽 피연산자를 lvalue(엘 밸류, left value), 오른쪽 피연산자를 rvalue(알 밸류, right value)로 부르며 구분한다. 구분하는 이유는 rvalue에는 변수, 상수, 리터럴 등이 올 수 있지만, lvalue에는 저장공간(변수, 배열)만 올 수 있기 때문이다.

int i = 2;
0 = i + 1; // 에러. lvaule에는 리터럴 불가
i + 2 = i; // 에러. i+2 -> 2+2 -> 4는 리터럴
i = i + 3; // OK. i에 2+3 = 5가 저장됨
		
final int MAX = 200; // OK. 변수가 final을 만나 상수가 됨
MAX = 300; // 에러. 상수는 한 번 초기화 후 값을 바꿀 수 없음

 

대입 연산자는 다른 연산자를 하나 붙이면 복합 대입 연산자가 된다.

복합 대입 연산자

여기서 우변은 항상 단항일 필요는 없다. 사용 예시를 보자.

int i = 2, j = 3;
System.out.println(i *= 10 + j); // 26
// i = i * (10 + j)

i = 2, j = 3;
System.out.println(i *= (10 + j)); // 26
// 우변에 괄호가 없어도 결과는 같다.

i = 2, j = 3;
System.out.println(i += 10 * j); // 32
// i = i + (10 * j)

i = 2, j = 3;
System.out.println(i += (10 * j)); // 32
// 우변에 괄호가 없어도 결과는 같다.

 

'Java' 카테고리의 다른 글

제어문 (1) 조건문 - if, else if, else  (0) 2022.01.04
제어문과 블록, 특별한 키워드  (0) 2022.01.03
비교 연산과 논리 연산  (0) 2021.12.31
산술 연산자와 산술 변환  (0) 2021.12.31
형변환(type casting)  (0) 2021.12.29