Chapter 04

Java 연산자와 계산 순서

블록 제작 비용과 피해량을 계산하며 Java의 산술, 나머지, 비교, 논리 연산자와 괄호 우선순위를 익힙니다.

난이도
입문
예상 학습
50분
Java 기준
Java 25 LTS
최종 검토

전체 22개 Chapter 확장 구조 중 Chapter 04입니다.

기능 구분

정식 Java 25에서도 쓸 수 있는 이전 버전 기능

Java SE 정식 기능

산술, 비교, 논리 연산자는 Java 25에서도 그대로 쓰는 기존 문법입니다.

이 Chapter의 예제는 Preview 또는 Incubator API 실행 옵션 없이 Java 25 LTS 정식 기능 기준으로 읽을 수 있습니다.

여러 색 블록을 정해진 계산 순서에 따라 조합하는 Java 연산자 학습 이미지
같은 재료라도 처리 순서가 달라지면 결과가 달라집니다. 코드에서는 괄호로 계산 순서를 분명히 표시할 수 있습니다.

Learning goals

오늘 배울 내용

  • 산술 연산자로 게임 수치 계산하기
  • 나머지 연산자로 묶음과 홀짝 판단하기
  • 비교와 논리 연산 결과 이해하기
  • 괄호로 계산 의도 분명하게 표현하기

연산자는 값을 움직이는 규칙입니다

변수에 값을 저장했다면 다음 단계는 그 값을 계산하고 비교하는 일입니다. 체력이 줄어들고, 아이템 비용을 합산하고, 레벨 조건을 확인하고, 여러 조건을 묶어 입장 가능 여부를 판단합니다. 이런 작업을 표현하는 기호와 문법이 연산자입니다.

연산자는 단순한 수학 기호보다 넓은 개념입니다. +, -, *, /, %는 산술 연산자이고, >, <=, ==는 비교 연산자이며, &&, ||, !는 논리 연산자입니다. =도 값을 저장하는 대입 연산자입니다. 코드를 읽을 때는 기호를 하나씩 이름 붙여 읽어보면 흐름이 선명해집니다.

산술 연산으로 제작 수량 계산하기

다음 예제는 통나무를 판자로 바꾸고, 판자를 상자 단위로 묶습니다.

public class Main {
    public static void main(String[] args) {
        int logs = 23;
        int planksPerLog = 4;
        int planksPerCrate = 9;

        int totalPlanks = logs * planksPerLog;
        int fullCrates = totalPlanks / planksPerCrate;
        int leftoverPlanks = totalPlanks % planksPerCrate;

        System.out.println("통나무: " + logs);
        System.out.println("전체 판자: " + totalPlanks);
        System.out.println("완성 상자: " + fullCrates);
        System.out.println("남은 판자: " + leftoverPlanks);
    }
}

예상 출력은 다음과 같습니다.

통나무: 23
전체 판자: 92
완성 상자: 10
남은 판자: 2

/는 나눗셈이고 %는 나머지입니다. 정수끼리 나누면 결과도 정수입니다. 92를 9로 나누면 실제 수학 결과는 10.222…이지만, int 나눗셈 결과는 몫인 10입니다. 나머지 2는 %로 구합니다. 묶음 계산, 페이지 계산, 짝수 판정, 반복 주기 처리에서 %는 자주 등장합니다.

정수 나눗셈과 소수 나눗셈

정확한 비율이 필요하면 double을 사용해야 합니다.

public class Main {
    public static void main(String[] args) {
        int clearedRooms = 7;
        int totalRooms = 12;

        double ratioA = clearedRooms / totalRooms;
        double ratioB = (double) clearedRooms / totalRooms;
        double percent = ratioB * 100;

        System.out.println("정수 나눗셈 후 저장: " + ratioA);
        System.out.println("소수 나눗셈: " + ratioB);
        System.out.println("진행률: " + percent + "%");
    }
}

예상 출력에서 ratioA는 0.0입니다. 먼저 int / int가 계산되어 0이 되고, 그 값이 double 변수에 저장되기 때문입니다. ratioB는 한쪽을 double로 바꾼 뒤 나누므로 소수 결과를 얻습니다.

형 변환은 필요한 곳에 좁게 쓰는 편이 좋습니다. 계산 전체를 무조건 double로 바꾸면 정수로 유지해야 할 값까지 소수로 흐를 수 있습니다. 개수와 인덱스는 정수로, 비율과 평균은 소수로 다루는 기준을 세우세요.

대입과 복합 대입

대입 연산자 =는 오른쪽 값을 왼쪽 변수에 저장합니다. 오른쪽 계산이 먼저 끝난 뒤 저장됩니다.

int health = 15;
health = health - 4;
health += 2;
health++;

health -= 4health = health - 4와 비슷하고, health += 2는 2만큼 증가시킵니다. health++는 1 증가입니다. 짧은 표현은 편리하지만, 처음 배울 때는 긴 형태로 읽어본 뒤 줄여 쓰는 것이 좋습니다.

증감 연산자는 위치에 따라 값이 사용되는 시점이 달라질 수 있습니다. count++++count의 차이는 초반 예제에서 굳이 섞어 쓰지 않는 편이 안전합니다. 반복문에서는 관례적으로 index++처럼 한 줄의 증감식에 단독으로 둡니다.

비교 연산은 boolean을 만듭니다

비교 연산 결과는 true 또는 false입니다.

public class Main {
    public static void main(String[] args) {
        int level = 8;
        int requiredLevel = 6;
        int health = 0;

        boolean enoughLevel = level >= requiredLevel;
        boolean alive = health > 0;
        boolean sameLevel = level == requiredLevel;

        System.out.println("레벨 충분: " + enoughLevel);
        System.out.println("행동 가능: " + alive);
        System.out.println("요구 레벨과 동일: " + sameLevel);
    }
}

==는 같은지 비교하고, !=는 다른지 비교합니다. 숫자 비교에서는 자연스럽게 사용할 수 있지만, 문자열 내용 비교는 나중에 equals를 사용합니다. "start" == command처럼 문자열을 ==로 비교하는 습관은 피해야 합니다.

논리 연산과 단축 평가

여러 조건을 연결할 때 &&||를 사용합니다.

public class Main {
    public static void main(String[] args) {
        int level = 9;
        int health = 11;
        boolean hasPass = false;
        boolean night = true;

        boolean canEnterMine = level >= 5 && health > 0;
        boolean canEnterTower = hasPass || level >= 10;
        boolean safeToTravel = health >= 10 && !night;

        System.out.println("광산 입장: " + canEnterMine);
        System.out.println("탑 입장: " + canEnterTower);
        System.out.println("야외 이동 안전: " + safeToTravel);
    }
}

&&는 왼쪽이 거짓이면 오른쪽을 평가하지 않아도 전체가 거짓입니다. ||는 왼쪽이 참이면 오른쪽을 보지 않아도 전체가 참입니다. 이를 단축 평가라고 합니다. 조건문에서 null 검사나 범위 검사를 안전하게 배치할 때 중요한 성질입니다.

!는 논리 부정입니다. !night는 밤이 아니라는 뜻입니다. 부정이 여러 번 겹치면 읽기 어려워집니다. !isNotReady 같은 이름은 피하고, 가능하면 ready처럼 긍정형 이름을 사용하세요.

우선순위보다 괄호를 믿기

Java에는 연산자 우선순위가 있습니다. 곱셈과 나눗셈은 덧셈보다 먼저 계산되고, 비교는 산술 계산 뒤에 이루어집니다. 하지만 우선순위를 외워서 코드를 짧게 쓰는 것이 항상 좋은 것은 아닙니다.

int resultA = 10 + 2 * 5;
int resultB = (10 + 2) * 5;

boolean checkA = 3 + 4 * 2 >= 11 && true;
boolean checkB = ((3 + (4 * 2)) >= 11) && true;

resultA는 20이고 resultB는 60입니다. checkAcheckB는 같은 결과지만, 두 번째처럼 괄호를 쓰면 의도가 더 잘 보입니다. 특히 돈, 세금, 점수, 할인율처럼 실수가 비용으로 이어지는 계산은 괄호로 읽는 순서를 드러내는 편이 좋습니다.

문자열 연결에서 생기는 착시

+는 숫자 덧셈이기도 하고 문자열 연결이기도 합니다.

public class Main {
    public static void main(String[] args) {
        int wood = 10;
        int stone = 15;

        System.out.println("재료 합계: " + wood + stone);
        System.out.println("재료 합계: " + (wood + stone));
    }
}

첫 줄은 재료 합계: 1015가 되고, 둘째 줄은 재료 합계: 25가 됩니다. 왼쪽부터 문자열 연결이 시작되었기 때문입니다. 출력문 안에서 계산과 설명 문자열을 섞을 때는 계산 부분을 괄호로 묶어 의도를 분명히 하세요.

계산식을 작은 이름으로 나누기

연산자가 많아지면 한 줄로 모든 계산을 끝내고 싶어집니다. 하지만 긴 계산식은 오류를 숨기기 쉽습니다. 중간 결과에 이름을 붙이면 계산 의도가 선명해지고, 출력으로 검증하기도 쉬워집니다.

public class Main {
    public static void main(String[] args) {
        int baseDamage = 12;
        int weaponBonus = 5;
        double criticalMultiplier = 1.5;
        int armor = 4;

        int rawDamage = baseDamage + weaponBonus;
        double criticalDamage = rawDamage * criticalMultiplier;
        double finalDamage = criticalDamage - armor;

        System.out.println("기본 피해: " + rawDamage);
        System.out.println("치명타 적용: " + criticalDamage);
        System.out.println("최종 피해: " + finalDamage);
    }
}

한 줄로 쓰면 (baseDamage + weaponBonus) * criticalMultiplier - armor입니다. 짧은 예제에서는 괜찮지만, 규칙이 늘어나면 중간 이름이 훨씬 안전합니다. rawDamage, criticalDamage, finalDamage는 계산 단계 자체를 설명합니다. 나중에 조건문으로 방어력이 음수가 되지 않게 막거나, 반올림 규칙을 추가할 때도 수정 위치가 분명합니다.

boolean 식도 읽기 좋게 나누기

논리 연산도 마찬가지입니다. 조건이 세 개 이상이면 boolean 변수로 나누는 편이 좋습니다.

int level = 12;
int health = 9;
boolean hasCompass = true;
boolean stormWarning = false;

boolean experiencedEnough = level >= 10;
boolean healthyEnough = health >= 8;
boolean canNavigate = hasCompass && !stormWarning;
boolean canStartExpedition = experiencedEnough && healthyEnough && canNavigate;

마지막 줄만 보면 탐험을 시작할 수 있는지 알 수 있고, 위쪽 이름을 보면 조건의 의미를 각각 확인할 수 있습니다. 디버깅할 때도 어떤 조건이 거짓인지 출력하기 쉽습니다. 실무 코드에서는 계산식과 조건식이 요구사항을 그대로 반영합니다. 할인율, 세율, 입장 조건, 권한 확인처럼 중요한 규칙일수록 식을 읽기 쉽게 나누고 이름을 붙이는 습관이 필요합니다.

직접 해보기

  1. 통나무 수를 31로 바꾸고 완성 상자와 남은 판자를 예상합니다.
  2. clearedRoomstotalRooms로 진행률을 계산해 소수 결과를 출력합니다.
  3. level, health, hasPass 조건을 바꾸어 세 boolean 결과가 어떻게 달라지는지 봅니다.
  4. System.out.println("합계: " + 2 + 3 * 4);의 결과를 예상하고 괄호로 의도한 결과를 만듭니다.
  5. 짝수 판정 number % 2 == 0을 사용해 boolean 변수를 만들어 봅니다.
나머지 연산 힌트

어떤 수를 2로 나눈 나머지가 0이면 짝수입니다. 5개마다 특별 처리를 하고 싶다면 number % 5 == 0처럼 주기를 바꿀 수 있습니다.

연산자 복습 체크리스트

연산자를 배운 뒤에는 같은 기호가 문맥에 따라 다르게 동작할 수 있음을 알아야 합니다. +는 숫자끼리 있으면 덧셈이고, 문자열이 끼면 연결입니다. /는 정수끼리 계산하면 정수 나눗셈이고, 한쪽이 double이면 소수 결과를 만듭니다. =는 저장이고, ==는 비교입니다. 이 네 가지 차이는 초반 오류의 대부분과 연결됩니다.

다음 질문에 답해 보세요. 몫과 나머지를 동시에 구하려면 어떤 연산자를 함께 사용하나요? 진행률을 소수로 계산하려면 어느 시점에 형 변환이 필요할까요? &&||는 각각 언제 참이 되나요? !가 붙은 조건을 더 읽기 쉽게 바꿀 수 있는 변수 이름은 무엇일까요?

연산식은 짧을수록 좋은 것이 아니라 의도가 분명할수록 좋습니다. 계산이 길어지면 중간 결과에 이름을 붙이고, 중요한 우선순위에는 괄호를 사용하세요. 컴파일러는 우선순위를 알고 있지만, 코드를 검토하는 사람은 매번 머릿속으로 계산해야 합니다.

검증용 출력 만들기

연산 결과가 의심될 때는 최종 결과만 출력하지 말고 중간 값을 출력하세요. 전체 판자, 완성 상자, 남은 판자를 따로 출력하면 어떤 단계에서 예상과 달라졌는지 바로 알 수 있습니다. 논리 조건도 마찬가지입니다. canEnter만 출력하기보다 enoughLevel, alive, hasKey를 함께 출력하면 거짓이 된 원인을 찾기 쉽습니다.

이런 검증용 출력은 학습 단계에서 특히 강력합니다. 다만 최종 예제에서는 너무 많은 임시 출력을 정리하고, 사용자에게 필요한 정보만 남겨야 합니다. 계산을 확인하는 출력과 결과를 안내하는 출력은 목적이 다릅니다.

이번 장의 정리

연산자는 값을 계산하고, 비교하고, 조건을 연결합니다. 정수 나눗셈은 소수점을 버리므로 비율 계산에는 한쪽을 double로 바꾸어야 합니다. =는 대입, ==는 비교입니다. 복잡한 수식은 우선순위 암기에 기대기보다 괄호로 의도를 드러내는 편이 안전합니다. 다음 장에서는 이 boolean 결과를 이용해 실행 경로를 나누는 조건문을 배웁니다.

FAQ

자주 묻는 질문

정수끼리 나누면 왜 소수점이 사라지나요?

int끼리 나눈 결과도 int이므로 소수 부분을 버립니다. 정확한 소수 결과가 필요하면 한쪽 값을 double로 바꾸세요.

=와 ==는 어떻게 다른가요?

=는 오른쪽 값을 왼쪽 변수에 저장하고 ==는 두 값이 같은지 비교해 boolean 결과를 만듭니다.

&&와 &는 같은가요?

boolean에서 모두 사용할 수 있지만 &&는 앞 조건이 false면 뒤 조건을 평가하지 않는 단축 평가를 합니다. 조건식에는 보통 &&를 사용합니다.

작성·편집 ToolPado

콘텐츠 유형 Java 학습 가이드

Java 기준 Java 25 LTS

마지막 검토