
이미지 출처: Pexels (Pixabay) · Pexels License
지난 편에서 사용자에게 값을 입력받았습니다. 그런데 값을 받아 놓기만 해서는 아무 일도 일어나지 않습니다. 받은 값으로 계산하고, 비교하고, 판단해야 비로소 프로그램이 됩니다. 그 도구가 오늘의 주제, 연산자입니다.
이름이 낯설 뿐 대부분 초등학교 산수에서 이미 본 기호들입니다. 종류가 많아 보여도 무리 지어 보면 몇 개 안 됩니다.

산술 연산자 — 계산하고, 남기기
우리가 아는 사칙연산에 나머지(%) 하나가 더 있습니다.
System.out.println(7 + 3); // 10
System.out.println(7 - 3); // 4
System.out.println(7 * 3); // 21
System.out.println(7 / 3); // 2 (정수끼리 나누면 몫만 남습니다)
System.out.println(7 % 3); // 1 (나누고 남은 나머지)
쉽게 —
%는 "나누고 남은 것" 입니다. 사탕 7개를 3명이 나누면 한 명당 2개(/)씩 가져가고 1개가 남습니다(%). 남은 그 1개가%의 결과입니다.
이 나머지가 생각보다 쓸모가 많습니다. 실무에서 가장 많이 쓰는 두 가지만 봅니다.
int num = 56789;
System.out.println(num % 2); // 1 → 홀수 (0이면 짝수)
System.out.println(num % 10); // 9 → 오른쪽 끝 한 자리
System.out.println(num % 100); // 89 → 오른쪽 끝 두 자리
짝수·홀수 판별(% 2)과 끝자리 뽑기(% 10, % 100)입니다. 뒤에서 짝수·홀수 판별기를 직접 만들어 봅니다.
대입 연산자 — 넣기, 그리고 줄여 쓰기
=는 "같다"가 아니라 "오른쪽 값을 왼쪽 공간에 넣어라" 는 명령입니다. 그리고 "지금 값에 얼마를 더해서 다시 넣기"는 워낙 자주 쓰여서 줄여 쓰는 형태가 따로 있습니다.
int a = 10;
a += 10; // a = a + 10; 과 같습니다 → 20
a -= 5; // a = a - 5; 과 같습니다 → 15
a *= 3; // a = a * 3; 과 같습니다 → 45
System.out.println(a); // 45
+= -= *= /= %= 를 복합 대입 연산자라고 부릅니다. 뜻은 하나입니다. "계산한 다음 그 자리에 다시 넣어라."
단골 함정 —
=와==는 완전히 다릅니다.=는 넣기(대입),==는 같은지 묻기(비교) 입니다.age = 20은 age에 20을 집어넣는 것이고,age == 20은 age가 20인지 물어보는 것입니다. 비교할 자리에 등호를 하나만 쓰면 값이 바뀌어 버리거나 오류가 납니다.

헷갈릴 때는 소리 내어 읽습니다. =는 "넣어라", ==는 "같은가?"입니다.
비교 연산자 — 결과는 참 또는 거짓
두 값을 견주면 결과는 숫자가 아니라 true(참) / false(거짓) 로 나옵니다.
int a = 10, b = 20;
System.out.println(a > b); // false
System.out.println(a <= b); // true
System.out.println(a != b); // true (다른가?)
| 연산자 | 뜻 |
|---|---|
== | 같다 |
!= | 다르다 |
> < | 크다 / 작다 |
>= <= | 크거나 같다 / 작거나 같다 |
이 참·거짓이 다음 편의 조건문(if)으로 그대로 이어집니다. 비교 연산자는 조건문의 재료라고 보면 됩니다.
논리 연산자 — 조건을 묶기
조건이 하나가 아닐 때 그리고 / 또는으로 엮습니다.
int score = 85;
boolean pass = (score >= 60) && (score <= 100);
System.out.println(pass); // true
&&(그리고) — 양쪽이 모두 참이어야 참입니다.||(또는) — 둘 중 하나만 참이어도 참입니다.!(부정) — 참과 거짓을 뒤집습니다.
쉽게 —
&&는 "지갑도 있고 그리고 시간도 있어야" 나갈 수 있는 것,||는 "카드 또는 현금 중 하나만 있어도" 계산되는 것과 같습니다.
한 가지만 더 알아 둡니다. &&는 왼쪽이 거짓이면 오른쪽은 아예 확인하지 않습니다. 이미 결과가 거짓으로 정해졌기 때문입니다(||는 왼쪽이 참이면 오른쪽을 건너뜁니다). 지금은 "쓸데없는 계산을 건너뛴다" 정도로만 기억해도 충분합니다.
증감 연산자 — 1씩 늘리고 줄이기
++는 1 더하기, --는 1 빼기입니다. 반복문에서 아주 자주 만납니다.
int n = 5;
n++; // n = n + 1; 과 같습니다
System.out.println(n); // 6
n--; // n = n - 1; 과 같습니다
System.out.println(n); // 5
함정 —
n++(후위)와++n(전위)은 한 줄에 혼자 쓰면 결과가 같지만, 다른 계산에 섞여 들어가면 값을 꺼내는 시점이 달라져 결과가 갈립니다.++n은 먼저 1을 더하고 그 값을 쓰고,n++는 지금 값을 먼저 쓰고 나중에 1을 더합니다. 처음에는n++;처럼 한 줄에 하나씩 단순하게 쓰면 헷갈릴 일이 없습니다.
삼항 연산자 — 한 줄로 갈라지기
조건에 따라 둘 중 하나를 고르는 일은 아주 흔합니다. 이것을 한 줄로 쓰는 것이 삼항 연산자입니다.
(조건식) ? 참일 때의 값 : 거짓일 때의 값
int score = 85;
char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C');
System.out.println(score + "점은 " + grade + "등급입니다.");
// 출력: 85점은 B등급입니다.
score가 90보다 크면 'A', 아니면 다시 80보다 큰지 물어 'B', 그것도 아니면 'C'입니다. 물음표는 "~인가?", 콜론은 "아니면" 이라고 읽으면 그대로 문장이 됩니다.
직접 해 보기 — 짝수·홀수 판별기
지난 편의 Scanner와 오늘의 %, 그리고 삼항 연산자를 한꺼번에 씁니다. 복붙해서 바로 돌려 볼 수 있습니다.
import java.util.Scanner;
public class EvenOdd {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("정수 하나: ");
int num = sc.nextInt();
String result = (num % 2 == 0) ? "짝수입니다" : "홀수입니다";
System.out.println(num + "은(는) " + result);
sc.close();
}
}
7을 넣으면 7은(는) 홀수입니다가 나옵니다. 다섯 줄 남짓한 코드지만 입력받고, 계산하고, 판단해서, 출력하는 프로그램의 기본 흐름이 전부 들어 있습니다.
참고 — 비트·시프트 연산자
& | ^ ~(비트)와 << >>(시프트)는 숫자를 0과 1의 비트 단위로 다루는 연산자입니다. 예를 들어 20 << 3은 비트를 왼쪽으로 세 칸 밀어 160이 되고, 20 >> 3은 오른쪽으로 밀어 2가 됩니다.
성능 최적화나 저수준 처리에서 쓰이며, 왕초보 단계에서는 "이런 것도 있구나" 정도로 넘어가도 충분합니다. 필요해지는 순간에 다시 찾아보면 됩니다.
한 장 정리
| 무리 | 연산자 | 결과 |
|---|---|---|
| 산술 | + - * / % | 계산값 |
| 대입 | = += -= *= /= | 왼쪽 공간에 넣기 |
| 비교 | == != > < >= <= | 참 / 거짓 |
| 논리 | && || ! | 참 / 거짓 |
| 증감 | ++ -- | 1 증가 / 감소 |
| 삼항 | (조건) ? A : B | A 또는 B |
이것만 기억하면 됩니다. %는 나머지이고 짝수·홀수 판별에 쓰입니다. 비교와 논리의 결과는 언제나 참 또는 거짓입니다. 그리고 =는 넣기, ==는 비교 — 이 둘만은 절대 헷갈리지 않습니다.
미니 퀴즈
개념을 제대로 잡았는지 직접 풀어 봅니다. 정답은 눌러야 나옵니다.
미니 퀴즈
포켓코딩(JAVA1) 5편 · 예제 출처: 강사 개인 GitHub 저장소. 다음 편: 조건문 — 갈림길 만들기(if · switch).