Menu

자바 연산자: 산술, 비교, 논리, 대입

자바 연산자의 작동 방식 - 산술, 비교, 논리, 대입, 증감, 삼항 연산자 - 그리고 정수 나눗셈, 우선순위, 초보자가 흔히 빠지는 함정까지 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

연산자가 하는 일

연산자는 값을 결합해 새로운 값을 계산하는 기호입니다. 이미 +로 더하고 >로 비교하는 식으로 자연스럽게 사용하고 있을 것입니다. 자바는 이들을 몇 가지 부류로 묶습니다. 산술, 비교, 논리, 대입, 그리고 증감과 삼항 연산자 같은 몇 가지 특수한 것들입니다.

대부분의 연산자는 두 값(기호 앞에 하나, 뒤에 하나)을 받아 결과를 만들어 냅니다. 핵심은 그 결과가 어떤 타입인지, 그리고 어떤 순서로 적용되는지를 아는 것입니다. 바로 여기서 초보자가 걸려 넘어집니다.

산술 연산자

다섯 개의 산술 연산자는 숫자를 다룹니다. +, -, *, /, %(나머지)입니다.

% 연산자는 나눗셈 후의 나머지입니다. 17 % 52인데, 5가 17에 세 번 들어가고 2가 남기 때문입니다. 나누어떨어지는지 확인할 때 쓰는 일상적인 도구이며, n % 2 == 0은 "n이 짝수인가?"를 확인하는 표준 방법입니다.

또한 +는 두 가지 역할을 한다는 점에 유의하세요. 숫자에서는 더하지만, 어느 한쪽에 String이 있으면 텍스트를 이어 붙입니다.

첫 번째 줄은 왼쪽에서 오른쪽으로 읽힙니다. "Total: " + 3은 이미 문자열이므로 4가 텍스트로 덧붙여집니다. 계산을 먼저 하고 싶다면 그 계산을 괄호로 감싸세요.

정수 나눗셈의 함정

이것은 가장 흔한 단 하나의 놀라움입니다. / 피연산자가 모두 정수일 때, 자바는 정수 나눗셈을 수행하고 소수 부분을 버립니다. 반올림하지 않고 0 방향으로 잘라냅니다.

소수 결과를 얻으려면 적어도 하나의 피연산자를 double로 만드세요. .0을 붙여 쓰거나, 한쪽을 (double)로 캐스팅하면 됩니다. (double)(5 / 2)도움이 되지 않습니다. 정수 나눗셈 5 / 2가 캐스팅 전에 이미 일어났기 때문입니다. 결과가 아니라 피연산자를 캐스팅해야 합니다.

비교 연산자

비교 연산자는 예/아니오 질문을 던지고 boolean을 반환합니다. 여섯 개가 있습니다. ==, !=, <, >, <=, >=입니다.

=(대입 - "이 값을 여기에 넣어라")와 ==(비교 - "이들이 같은가?")의 차이에 주의하세요. 이 둘을 혼동하는 것은 전형적인 버그입니다.

중요한 주의 사항이 있습니다. ==는 객체의 참조를 비교하지 내용을 비교하지 않습니다. 문자열에는 .equals()를 사용하세요.

intboolean 같은 기본형에는 ==를 사용하고, String 같은 객체의 내용을 비교할 때는 항상 .equals()를 사용하세요.

논리 연산자

논리 연산자는 불리언 값을 결합합니다. &&(그리고), ||(또는), !(부정)입니다. "충분히 나이가 많고 그리고 표를 가지고 있다" 같은 조건을 이렇게 표현합니다.

&&||단축 평가를 합니다. 자바는 답이 확실해지는 즉시 평가를 멈춥니다. &&에서는 왼쪽이 false이면 오른쪽은 결코 검사되지 않고, ||에서는 왼쪽이 true이면 오른쪽이 건너뛰어집니다. 이것은 단순한 최적화가 아니라 안전을 위해 기댈 수 있는 성질입니다.

if (text != null && text.length() > 0) { ... }

textnull이면 왼쪽이 false가 되어 text.length()는 결코 호출되지 않으므로 NullPointerException피할 수 있습니다. 순서를 뒤집으면 프로그램이 멈출 것입니다.

대입과 증감

=는 대입하지만, 자바에는 연산과 대입을 결합한 복합 대입도 있습니다. +=, -=, *=, /=, %=입니다. 그리고 ++ / --는 1을 더하거나 뺍니다.

++에는 두 가지 형태가 있습니다. 후위(count++)는 이전 값을 반환한 다음 증가시키고, 전위(++count)는 먼저 증가시킨 다음 새 값을 반환합니다. 이 차이는 결과를 같은 식 안에서 사용할 때만 의미가 있습니다.

++가 단독으로 한 줄에 있을 때는 후위와 전위가 차이가 없습니다. 그러니 더 명확하게 읽히는 쪽을 선택하고, 증감을 더 큰 식 안에 욱여넣지 마세요.

삼항 연산자

삼항 연산자 condition ? a : b는 값을 만들어 내는 간결한 if/else입니다. 조건이 true이면 a로, 그렇지 않으면 b로 평가됩니다.

짧은 둘 중 하나의 대입에서 빛을 발합니다. 삼항 연산자 안에 삼항 연산자를 중첩하려는 유혹은 참으세요. 금세 읽기 어려워지며, 평범한 if/else가 더 명확합니다.

우선순위와 괄호

연산자는 수학과 매우 비슷하게 정해진 순서로 적용됩니다. *, /, %+-보다 더 강하게 묶이고, 이들은 비교 연산자보다 더 강하게, 비교 연산자는 &&보다 더 강하게, 마지막으로 ||가 옵니다.

전체 표를 외울 필요는 없습니다. 식이 여러 부류를 섞거나 순서를 따지기 위해 잠시 멈춰야 할 때는 괄호를 넣으세요. 비용이 들지 않으면서도 다음에 읽는 사람에게 의도를 분명하게 드러냅니다.

다음: 타입 캐스팅

여기서 본 함정들 중 몇 가지 - 정수 나눗셈, intdouble을 섞는 것 - 은 결국 타입의 문제로 귀결됩니다. 숫자 타입 사이를 의도적으로 변환하는 것을 캐스팅이라고 하며, 그것이 다음 페이지의 주제입니다.

자주 묻는 질문

자바에서 % 연산자는 무엇을 하나요?

%는 나머지(모듈로) 연산자로, 정수 나눗셈 후에 남는 값을 돌려줍니다. 7 % 31이고, 10 % 20입니다. 나누어떨어지는지 확인하는 표준적인 방법이며(n % 2 == 0n이 짝수임을 의미합니다), 값을 특정 범위 안으로 감싸 넣을 때도 사용합니다.

자바에서 5 / 2가 2.5가 아니라 2를 주는 이유는 무엇인가요?

두 피연산자가 모두 정수일 때 /는 정수 나눗셈을 수행하고 소수 부분을 버립니다. 그래서 5 / 22.5가 아니라 2입니다. 2.5를 얻으려면 적어도 하나의 피연산자가 double이어야 합니다. 5.0 / 2, 5 / 2.0처럼 쓰거나 (double) 5 / 2처럼 한쪽을 캐스팅하세요.

자바에서 ==와 equals()의 차이는 무엇인가요?

==는 기본형을 값으로 비교하지만, 객체(String 포함)의 경우에는 참조를 비교합니다. 즉 메모리상에서 같은 객체인지를 봅니다. 객체의 내용을 비교하려면 .equals()를 사용하세요. 두 문자열을 ==로 비교하면 텍스트가 같아도 false를 반환할 수 있으므로, 문자열에는 항상 "a".equals(b)를 사용하세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기