변수에 담은 값으로 계산하고, 비교하고, 판단하려면 연산자가 필요해요. 이번 장은 자바에서 쓰는 연산자들을 종류별로, 하나씩 짚어봅니다. 특히 헷갈리기 쉬운 정수 나눗셈·증감·문자열 연결은 코드로 정확히 확인해요.
+ - * / %)를 쓸 수 있고, 정수 나눗셈의 함정을 피할 수 있어요.= += -= *= /= %=)의 편리함을 알아요.++a)와 후위(a++) 증감의 차이를 코드로 설명할 수 있어요.+의 계산 순서를 알아요.연산자는 값을 계산·비교·판단하기 위해 쓰는 "기호"예요. 우리가 수학에서 쓰는 +, - 같은 기호가 프로그래밍에도 그대로 있고, 여기에 비교(>, ==)와 판단(&&, ||)을 위한 기호가 더해져요.
+, >3 + 5에서 3과 5
즉 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 / 2 → 3, 하지만 7.0 / 2 → 3.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 += 3 | x = x + 3 | x → 13 |
x -= 3 | x = x - 3 | x → 7 |
x *= 3 | x = x * 3 | x → 30 |
x /= 3 | x = x / 3 | x → 3 (정수 나눗셈!) |
x %= 3 | x = x % 3 | x → 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 += 3과 x = x + 3은 결과가 똑같아요. 복합 대입은 그저 더 짧고 읽기 좋게 쓰는 방법일 뿐이에요.값을 정확히 1만큼 늘리거나 줄일 때 쓰는 게 증감 연산자예요. ++는 1 증가, --는 1 감소. 반복문에서 카운터를 셀 때 정말 자주 나와요.
int n = 5;
n++; // n = n + 1 과 같음 → n은 6
n--; // n = n - 1 과 같음 → n은 5
여기까지는 쉬워요. 진짜 핵심은 연산자를 변수 앞에 붙이느냐(전위), 뒤에 붙이느냐(후위)에 따라 "값을 언제 꺼내 쓰는지"가 달라진다는 점이에요.
++aa++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)의 재료가 됩니다.
true)과 거짓(false), 딱 두 값만 가질 수 있는 자료형이에요. 비교 연산의 결과가 바로 이 boolean이고, 다음 장 조건문(if)이 "참이냐 거짓이냐"를 판단할 때 쓰는 재료가 돼요.| 연산자 | 뜻 | 예 (a=5, b=3) | 결과 |
|---|---|---|---|
== | 같다 | a == b | false |
!= | 다르다 | a != b | true |
> | 크다 | a > b | true |
< | 작다 | a < b | false |
>= | 크거나 같다 | a >= 5 | true |
<= | 작거나 같다 | a <= 3 | false |
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)에서는 ==가 값이 같은지를 그대로 비교해요. 우리가 지금 다루는 숫자 비교는 전부 여기에 해당해서 헷갈릴 게 없어요.
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
(x != 0) && (10 / x > 1) — 앞에서 x가 0이면 뒤의 나눗셈을 아예 안 하니 오류를 피할 수 있어요.
// 단축 평가 확인 — 뒤쪽 메서드는 호출조차 안 됨
boolean r1 = false && check(); // 앞이 false → check() 실행 안 됨 → r1 = false
boolean r2 = true || check(); // 앞이 true → check() 실행 안 됨 → r2 = true
check()처럼 어떤 일을 하는 코드 묶음에 이름을 붙여 둔 것이에요. 이름() 형태로 불러서 실행하죠. 단축 평가로 뒤쪽이 계산되지 않으면, 그 자리의 메서드는 아예 호출조차 되지 않아요. 메서드를 직접 만드는 법은 뒤 챕터에서 자세히 배워요.삼항 연산자는 조건에 따라 두 값 중 하나를 고르는 연산자예요. 피연산자가 세 개라서 "삼항"이에요. 형태는 이렇습니다.
조건 ? 참일_때_값 : 거짓일_때_값
조건이 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); // 불합격
int max = (a > b) ? a : b; ≡ if문 if (a > b) max = a; else max = b;
++는 더하기도, 이어붙이기도 해요+의 의미가 바뀝니다. 순서가 중요해요.자바에서 +는 두 가지 일을 해요. 양쪽이 숫자면 "더하기", 한쪽이라도 문자열(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
( )를 쓰세요. 계산 순서를 명확히 해주고, 코드를 읽는 사람에게도 친절해요.| 연산자 | 이름 | 하는 일(대략) |
|---|---|---|
& | 비트 AND | 둘 다 1인 비트만 1 |
| | 비트 OR | 하나라도 1이면 1 |
^ | 비트 XOR | 서로 다르면 1 |
~ | 비트 NOT | 0↔1 뒤집기 |
<< | 왼쪽 시프트 | 비트를 왼쪽으로 밀기(×2 효과) |
>> | 오른쪽 시프트 | 비트를 오른쪽으로 밀기(÷2 효과) |
&&(단축 평가함)와 비트 &(단축 평가 안 함)는 기호도 동작도 다르니 헷갈리지 마세요. 비트 연산은 성능 최적화·플래그 처리 등 특수한 상황에서 등장하며, 별도 챕터에서 깊이 다룹니다.
+ - * / %. 정수 ÷ 정수 = 정수라 7 / 2 → 3(버림), 7 % 2 → 1(나머지). 소수 원하면 7.0 / 2.+= -= *= /= %=는 x = x + 3을 x += 3으로 짧게 쓴 것.a++는 "쓰고 나서 증가" → int b = a++;면 b=5, a=6. 전위 ++a는 "증가하고 나서 씀".== != > < >= <=의 결과는 boolean. =(대입)와 ==(비교) 구분!&& || !와 단축 평가: &&는 앞이 false면, ||는 앞이 true면 뒤를 안 봄.조건 ? 참 : 거짓 — 한 줄짜리 택일. 문자열 +는 왼쪽부터: "" + 1 + 2="12", 1 + 2 + "합"="3합".