연산자란 산술 대입·복합 증감 비교 논리 삼항 문자열 연결 우선순위 📝 문제풀이
◀ 이전 📋 목차 CH 06 ▶
CHAPTER 05 · 입문

연산자 — 값을 계산하고 판단하는 기호

변수에 담은 값으로 계산하고, 비교하고, 판단하려면 연산자가 필요해요. 이번 장은 자바에서 쓰는 연산자들을 종류별로, 하나씩 짚어봅니다. 특히 헷갈리기 쉬운 정수 나눗셈·증감·문자열 연결은 코드로 정확히 확인해요.

🎯 이 장을 끝내면
📖
연산자란
연산자(Operator)가 뭔가요?
먼저 한 문장으로 잡고 시작해요.

연산자는 값을 계산·비교·판단하기 위해 쓰는 "기호"예요. 우리가 수학에서 쓰는 +, - 같은 기호가 프로그래밍에도 그대로 있고, 여기에 비교(>, ==)판단(&&, ||)을 위한 기호가 더해져요.

🧩 용어 두 개만 — 연산자 & 피연산자 연산자(operator) — 무엇을 할지 정하는 기호. 예: +, >
피연산자(operand) — 연산에 참여하는 . 예: 3 + 5에서 35 3 + 5는 "피연산자 3과 5를, 연산자 +로 더한다"는 뜻이에요. 지금은 "기호로 값을 다룬다"는 큰 그림만 챙기면 충분합니다.
산술 대입 증감 비교 논리 삼항 문자열 연결 우선순위
🧭
이번 장의 읽는 법. 연산자는 종류는 많아도 패턴이 있어요. 각 절의 코드 예제와 결과값만 눈으로 따라가면 자연스럽게 익혀집니다. 헷갈리는 /, %, ++는 특히 천천히요.
산술 연산자
더하고 빼고 곱하고 나누기
가장 기본. 그런데 자바의 나눗셈에는 함정이 하나 있어요.

산술 연산자는 수학 계산을 하는 기호예요. 자바에는 다섯 가지가 있어요: +(덧셈), -(뺄셈), *(곱셈), /(나눗셈), 그리고 조금 낯선 %(나머지)예요.

int a = 7;
int b = 2;

System.out.println(a + b); // 9
System.out.println(a - b); // 5
System.out.println(a * b); // 14
System.out.println(a / b); // 3   ← 주의! 3.5가 아님
System.out.println(a % b); // 1   ← 7을 2로 나눈 "나머지"
⚠️ 가장 중요한 함정 — 정수끼리 나누면 소수점이 버려져요 정수(int) 7을 정수 2로 나누면 결과는 3.5가 아니라 3이에요. 자바에서 정수 ÷ 정수 = 정수이기 때문에, 소수점 아래는 그냥 버려집니다(반올림 아님, 버림).
그리고 %(나머지)는 "나누고 남은 것"이에요. 7 % 2는 7을 2로 나누면 3이 나오고 1이 남으니까 1이에요. 💡 소수 결과가 필요하면 한쪽을 실수로 만드세요. 7 / 23, 하지만 7.0 / 23.5 예요.
System.out.println(7 / 2);    // 3    (정수 나눗셈 → 몫만)
System.out.println(7 % 2);    // 1    (나머지)
System.out.println(7.0 / 2);  // 3.5  (한쪽이 실수면 실수 결과)
System.out.println(10 % 3);   // 1    (10 = 3*3 + 1)
System.out.println(10 % 5);   // 0    (딱 나누어떨어지면 0)
💡
% 는 실전에서 정말 많이 써요. "짝수/홀수 판별"(n % 2 == 0이면 짝수), "3의 배수인가"(n % 3 == 0) 같은 판단에 단골로 등장합니다.
📥
대입 · 복합 대입
값을 넣고, 계산하며 넣기
=는 "같다"가 아니라 "넣어라"예요.

=는 수학의 "같다"가 아니라 "오른쪽 값을 왼쪽 변수에 넣어라(대입)"는 뜻이에요. "같다"를 비교할 때는 뒤에서 배울 ==를 써요. 헷갈리기 쉬우니 지금 확실히 구분해두세요.

int x = 10;   // x에 10을 넣어라
x = x + 3;    // x에 (기존 x + 3), 즉 13을 다시 넣어라 → x는 13

x = x + 3처럼 "자기 자신에 계산해서 다시 넣는" 패턴이 자주 나와요. 이걸 짧게 쓰라고 만든 게 복합 대입 연산자예요.

복합 대입같은 뜻(풀어쓰면)예시 (x가 10일 때)
x += 3x = x + 3x → 13
x -= 3x = x - 3x → 7
x *= 3x = x * 3x → 30
x /= 3x = x / 3x → 3 (정수 나눗셈!)
x %= 3x = x % 3x → 1
int score = 100;
score += 20;  // score = score + 20 → 120
score -= 50;  // score = score - 50 → 70
score *= 2;   // score = score * 2  → 140
System.out.println(score); // 140
🔎
기능은 완전히 같아요. x += 3x = x + 3은 결과가 똑같아요. 복합 대입은 그저 더 짧고 읽기 좋게 쓰는 방법일 뿐이에요.
🔢
증감 연산자
1씩 늘리기 · 줄이기 — 전위 vs 후위
이번 장에서 가장 헷갈리는 부분. 코드로 정확히 잡아요.

값을 정확히 1만큼 늘리거나 줄일 때 쓰는 게 증감 연산자예요. ++는 1 증가, --는 1 감소. 반복문에서 카운터를 셀 때 정말 자주 나와요.

int n = 5;
n++;   // n = n + 1 과 같음 → n은 6
n--;   // n = n - 1 과 같음 → n은 5

여기까지는 쉬워요. 진짜 핵심은 연산자를 변수 앞에 붙이느냐(전위), 뒤에 붙이느냐(후위)에 따라 "값을 언제 꺼내 쓰는지"가 달라진다는 점이에요.

⬅️
전위 ++a
먼저 1 증가시킨 뒤,
그 값을 사용
vs
➡️
후위 a++
지금 값을 먼저 사용한 뒤,
그다음 1 증가
🎯 핵심 예제 — 다른 변수에 대입할 때 차이가 드러나요 후위 a++ — "쓰고 나서 증가". 그래서 대입 시점엔 옛날 값이 넘어가요.
전위 ++a — "증가하고 나서 씀". 그래서 대입 시점엔 증가한 값이 넘어가요. 아래 두 코드를 나란히 비교하면 확실해요. 시작값은 둘 다 a = 5예요.
// ── 후위(a++) ──
int a = 5;
int b = a++;   // ① b에 지금 값 5를 먼저 넣고  ② 그 뒤 a를 6으로 증가
System.out.println(b); // 5   (b는 옛날 값)
System.out.println(a); // 6   (a는 증가됨)

// ── 전위(++a) ──
int a2 = 5;
int b2 = ++a2; // ① a2를 먼저 6으로 증가  ② 그 6을 b2에 넣음
System.out.println(b2); // 6   (b2는 증가된 값)
System.out.println(a2); // 6
📌
한 줄 정리. int b = a++; 이면 b는 5, a는 6. 후위는 "값을 먼저 쓰고 나중에 증가"라서, 넘어가는 값은 증가 전 값이에요. 이게 헷갈리면 "a++는 a를 쓴 다음 a를 늘린다"고 소리 내어 읽어보세요.
🤔 번외 — 그냥 a++; 한 줄만 쓰면 전위·후위 차이가 있나요?
없어요. a++; 또는 ++a;처럼 결과값을 아무 데도 안 쓰고 그냥 한 줄로만 쓰면, 둘 다 결과는 똑같이 "a가 1 증가"예요. 차이가 드러나는 순간 전위·후위 차이는 그 값을 어딘가에 대입하거나 다른 식에 섞어 쓸 때만 나타나요. 예: int b = a++;, arr[i++], System.out.println(a++) 처럼요. 그래서 초보 때는 한 줄에 하나씩, 명확하게 쓰는 습관이 실수를 줄여줘요.
⚖️
비교 연산자
크다·작다·같다를 따지기
결과는 항상 true 아니면 false예요.

두 값을 비교해서 참(true)인지 거짓(false)인지를 판단하는 게 비교 연산자예요. 결과 타입은 항상 boolean이고, 다음 장에서 배울 조건문(if)의 재료가 됩니다.

🔤
boolean(불리언) — 참(true)과 거짓(false), 딱 두 값만 가질 수 있는 자료형이에요. 비교 연산의 결과가 바로 이 boolean이고, 다음 장 조건문(if)이 "참이냐 거짓이냐"를 판단할 때 쓰는 재료가 돼요.
연산자예 (a=5, b=3)결과
==같다a == bfalse
!=다르다a != btrue
>크다a > btrue
<작다a < bfalse
>=크거나 같다a >= 5true
<=작거나 같다a <= 3false
int a = 5, b = 3;
boolean r1 = (a == b); // false
boolean r2 = (a != b); // true
boolean r3 = (a >= 5); // true
System.out.println(r3); // true
⚠️
=== 를 절대 헷갈리지 마세요. =는 "넣어라(대입)", ==는 "같니?(비교)"예요. if (a == 5)로 써야 할 곳에 if (a = 5)로 쓰면 의미가 완전히 달라져요.
🔎 살짝만 — ==는 기본형에서는 "값 비교" int, double 같은 기본형(primitive)에서는 ==값이 같은지를 그대로 비교해요. 우리가 지금 다루는 숫자 비교는 전부 여기에 해당해서 헷갈릴 게 없어요.
🔤
기본형(primitive type) — int·double·char·boolean처럼 값 자체를 그대로 담는 가장 기초적인 자료형이에요. 이와 달리 문자열(String)이나 객체는 "값이 들어 있는 곳을 가리키는" 방식이라 == 비교가 미묘하게 달라져요(뒤 챕터에서 배워요).
다만 문자열이나 객체==로 비교하면 "값"이 아니라 "같은 것인지"를 따지는 미묘한 차이가 있어요. 이건 객체·문자열 챕터에서 따로 자세히 배우니 지금은 "숫자 비교엔 == OK" 정도만 챙기면 돼요.
🔗
논리 연산자
여러 조건을 엮기 — 그리고·또는·아니다
boolean끼리 묶어 더 복잡한 판단을 만들어요.

"나이가 20 이상 이고 회원인가?", "주말 이거나 공휴일인가?"처럼 여러 조건을 엮을 때 논리 연산자를 써요. 세 가지가 있어요.

연산자이름참이 되는 때
&&AND (그리고)둘 다 참이어야 참양쪽 모두 true
||OR (또는)하나라도 참이면 참한쪽이라도 true
!NOT (아니다)참·거짓을 뒤집음원래가 false일 때
int age = 25;
boolean member = true;

boolean canBuy = (age >= 20) && member; // 20 이상 "그리고" 회원 → true
boolean isRest = (age < 8)  || (age >= 65); // 8 미만 "또는" 65 이상 → false
boolean notMember = !member;               // true를 뒤집음 → false

System.out.println(canBuy);    // true
System.out.println(isRest);    // false
System.out.println(notMember); // false
⚡ 단축 평가(short-circuit) — 뒤를 안 볼 수도 있어요 자바는 논리식을 왼쪽부터 읽는데, 결과가 이미 정해지면 오른쪽은 아예 계산하지 않아요. 이걸 단축 평가라고 해요.
&& (그리고) — 앞이 false면, 뒤가 뭐든 전체가 false로 확정. → 뒤를 평가 안 함.
|| (또는) — 앞이 true면, 뒤가 뭐든 전체가 true로 확정. → 뒤를 평가 안 함. 💡 이건 단순히 빠른 것뿐 아니라 안전장치로도 써요. 예: (x != 0) && (10 / x > 1) — 앞에서 x가 0이면 뒤의 나눗셈을 아예 안 하니 오류를 피할 수 있어요.
// 단축 평가 확인 — 뒤쪽 메서드는 호출조차 안 됨
boolean r1 = false && check(); // 앞이 false → check() 실행 안 됨 → r1 = false
boolean r2 = true  || check(); // 앞이 true  → check() 실행 안 됨 → r2 = true
🔤
메서드(method) —check()처럼 어떤 일을 하는 코드 묶음에 이름을 붙여 둔 것이에요. 이름() 형태로 불러서 실행하죠. 단축 평가로 뒤쪽이 계산되지 않으면, 그 자리의 메서드는 아예 호출조차 되지 않아요. 메서드를 직접 만드는 법은 뒤 챕터에서 자세히 배워요.
💡
외우는 법. &&는 "앞이 false면 포기", ||는 "앞이 true면 만족". 앞쪽만으로 답이 나오면 뒤는 쳐다도 안 봐요.
삼항 연산자
한 줄짜리 if — 조건 ? 참 : 거짓
간단한 "이거냐 저거냐"를 아주 짧게 표현해요.

삼항 연산자는 조건에 따라 두 값 중 하나를 고르는 연산자예요. 피연산자가 세 개라서 "삼항"이에요. 형태는 이렇습니다.

조건 ? 참일_때_값 : 거짓일_때_값

조건이 true? 뒤의 값을, false: 뒤의 값을 골라줘요. 두 값 중 큰 값을 고르는 고전 예제를 볼게요.

int a = 7, b = 3;
int max = (a > b) ? a : b; // a가 b보다 크면 a, 아니면 b
System.out.println(max);   // 7

int score = 55;
String result = (score >= 60) ? "합격" : "불합격";
System.out.println(result); // 불합격
🔁 if문과 나란히 보기 — 같은 일을 짧게 아래 두 코드는 완전히 같은 동작이에요. 간단한 분기는 삼항으로 한 줄이 깔끔하죠. 삼항 int max = (a > b) ? a : b; ≡ if문 if (a > b) max = a; else max = b;
🧭
언제 쓰나. "짧고 단순한 둘 중 택일"에 좋아요. 조건이 복잡하거나 분기 안에서 여러 줄을 실행해야 하면, 다음 장에서 배우는 if문이 더 읽기 좋습니다.
🧵
문자열 연결 +
+는 더하기도, 이어붙이기도 해요
문자열이 끼면 +의 의미가 바뀝니다. 순서가 중요해요.

자바에서 +두 가지 일을 해요. 양쪽이 숫자면 "더하기", 한쪽이라도 문자열(String)이면 "이어붙이기(연결)"예요. 이때 숫자는 자동으로 글자로 바뀌어 뒤에 붙어요.

System.out.println("나이: " + 20);   // 나이: 20   (문자열 + 숫자 → 이어붙임)
System.out.println("점수 " + 90 + "점"); // 점수 90점
System.out.println(3 + 5);           // 8          (숫자 + 숫자 → 더하기)
⚠️ 진짜 함정 — +는 "왼쪽부터 차례로" 계산해요 +가 여러 개면 왼쪽에서 오른쪽으로 순서대로 계산돼요. 그래서 문자열이 어디서부터 끼는지에 따라 결과가 완전히 달라져요.

"" + 1 + 2 → 처음부터 문자열이라, "" + 1 = "1", 다시 "1" + 2 = "12" (이어붙임)
1 + 2 + "" → 앞은 숫자끼리라 1 + 2 = 3, 그다음 3 + "" = "3" (그제서야 문자열화) 💡 같은 1, 2인데 결과가 "12" vs "3"! 왼쪽부터 차례로 본다는 규칙을 기억하세요.
System.out.println("" + 1 + 2);   // "12"   문자열부터 시작 → 계속 이어붙임
System.out.println(1 + 2 + "");    // "3"    숫자 먼저 더하고 → 문자열화
System.out.println(1 + 2 + "합");   // "3합"   1+2=3 먼저, 그 뒤 "합" 이어붙임
System.out.println("합" + 1 + 2);   // "합12"  "합"+1="합1", +2="합12"
⚠️
순서를 강제하고 싶으면 괄호를 쓰세요. "합" + (1 + 2)라고 괄호로 묶으면 1 + 2를 먼저 계산해서 "합3"이 돼요. 의도를 분명히 하려면 괄호가 안전합니다.
🏅
연산자 우선순위
누가 먼저 계산될까
수학처럼 "곱셈·나눗셈이 덧셈보다 먼저"예요. 다 외울 필요는 없어요.

한 식에 연산자가 여러 개면 정해진 순서대로 계산돼요. 큰 그림만 잡으면 됩니다: 단항(!, ++) → 산술(* /+ -) → 비교 → 논리 → 삼항 → 대입 순이에요.

🔤
용어 — 단항 · 이항 · 삼항 연산에 참여하는 피연산자 개수로 붙인 이름이에요. 단항은 피연산자가 하나(!a, a++), 이항은 둘(a + b), 삼항은 셋(a ? b : c)이에요. 앞서 배운 삼항 연산자가 "삼항"인 이유가 바로 이거예요.
순위연산자분류
높음 ⬆️! ++ --단항
* / %곱셈·나눗셈·나머지
+ -덧셈·뺄셈
> < >= <=비교(대소)
== !=비교(같다/다르다)
&&논리 AND
||논리 OR
? :삼항
낮음 ⬇️= += -=대입
int r = 2 + 3 * 4;   // 곱셈 먼저 → 2 + 12 → 14
int r2 = (2 + 3) * 4; // 괄호 먼저 → 5 * 4 → 20
boolean b = 5 > 3 && 2 < 1; // 비교 먼저(5>3=true, 2<1=false) → true && false → false
💡
가장 실용적인 조언. 우선순위를 다 외우려 하지 말고, 헷갈리면 그냥 괄호 ( )를 쓰세요. 계산 순서를 명확히 해주고, 코드를 읽는 사람에게도 친절해요.
🧮 번외 — 비트 연산자(& | ^ ~ << >>), 지금은 살짝만
숫자를 2진수 비트 단위로 다루는 연산자도 있어요. 입문 단계에서 자주 쓰진 않지만 이름만 알아두면 좋아요.
연산자이름하는 일(대략)
&비트 AND둘 다 1인 비트만 1
|비트 OR하나라도 1이면 1
^비트 XOR서로 다르면 1
~비트 NOT0↔1 뒤집기
<<왼쪽 시프트비트를 왼쪽으로 밀기(×2 효과)
>>오른쪽 시프트비트를 오른쪽으로 밀기(÷2 효과)
논리 &&(단축 평가함)와 비트 &(단축 평가 안 함)는 기호도 동작도 다르니 헷갈리지 마세요. 비트 연산은 성능 최적화·플래그 처리 등 특수한 상황에서 등장하며, 별도 챕터에서 깊이 다룹니다.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 네 가지 유형(객관식 · O/X · 빈칸 · 코드결과)을 섞어 두었어요. 편하게 눌러보세요.
CH 06 🔀 조건문(if · else · switch) — 프로그램이 상황에 따라 다르게 행동하게 만들기