연산자 우선순위와 표현식 분해
한 표현식에 연산자가 여러 개 있으면 Java의 우선순위와 결합 방향이 계산 순서를 정합니다.
규칙을 모두 외우는 것보다 사람이 의도한 경계를 괄호와 중간 변수로 드러내는 편이 안전합니다.
메서드 호출의 부작용까지 섞이면 문법상 순서를 알아도 코드를 검토하기 어렵습니다.
조건식과 산술식은 계산 단계별로 이름을 붙일 수 있습니다.
이 절에서는 짧은 코드보다 검증 가능한 표현식을 만드는 기준을 다룹니다.
곱셈은 덧셈보다 먼저 계산된다
기본 우선순위는 수학과 비슷하지만 시프트, 비교, 논리, 삼항 연산이 섞이면 직관만 믿기 어렵습니다.
중요한 경계에는 괄호를 사용합니다.
괄호는 독자에게 의도를 전달한다
컴파일러에 불필요한 괄호라도 계산 묶음을 보여 주면 유지보수에 도움이 됩니다.
반대로 모든 토큰을 괄호로 감싸면 핵심 구조가 흐려집니다.
괄호가 없어도 같은 결과가 나오는 식과, 괄호 위치에 따라 값이 달라지는 식을 나란히 둡니다. 핵심은 우선순위 표를 외우는 것이 아니라 계산 단위를 코드에 표시해 다음 독자가 다시 해석하지 않게 하는 것입니다.
public class ReadableExpressions {
public static void main(String[] args) {
int base = 10;
int bonus = 3;
int multiplier = 2;
int adjusted = bonus * multiplier;
int total = base + adjusted;
String label = total >= 15 ? "high" : "normal";
System.out.println("total=" + total);
System.out.println("label=" + label);
}
}price + shipping * count와 (price + shipping) * count는 어떤 비용을 건당 부과하는지라는 업무 규칙부터 다릅니다. 괄호는 컴파일러 지시이기 전에 계산 모델을 문서화하므로, 요구 사항을 문장으로 읽었을 때의 묶음과 맞춰야 합니다.
total=16
label=high중간 변수 adjusted와 total이 각 계산 단계의 타입과 의미를 검증할 지점을 제공합니다.
긴 표현식을 읽을 때는 먼저 괄호로 업무 계산의 묶음을 표시하고, 두 번째로 중간 결과에 단위를 담은 이름을 붙입니다. 마지막에 남은 단순한 두 값 선택만 삼항 연산자로 표현합니다.
예를 들어 subtotal, discount, shippingFee를 각각 계산한 뒤 합치면 어느 값이 잘못되었는지 출력으로 곧바로 좁힐 수 있습니다. 한 줄을 줄이는 것보다 각 계산을 독립적으로 검증할 수 있는지가 더 중요한 기준입니다.
삼항 연산자는 값 선택에만 쓴다
간단한 두 값 가운데 하나를 고를 때는 유용하지만 중첩하거나 상태 변경을 넣으면 읽기 어렵습니다.
여러 문장이 필요하면 if가 더 적합합니다.
삼항 연산자는 두 값 가운데 하나를 선택해 변수에 담을 때 가장 선명합니다. 조건마다 로그를 남기거나 여러 변수를 바꿔야 한다면 if 문으로 펼쳐 각 경로의 부작용을 눈에 보이게 둡니다.
boolean enabled = true;
boolean hasQuota = false;
boolean allowed = enabled && (hasQuota || total < 20);// 중첩 삼항은 피한다.
// String grade = score > 90 ? "A" : score > 80 ? "B" : "C";
// 여러 구간은 if 또는 switch로 나눈다.중간 변수로 단계를 검증한다
복잡한 식을 의미 있는 지역 변수로 나누면 각 단계의 타입과 값을 출력해 볼 수 있습니다.
성능 차이는 대개 JIT가 제거하므로 명료성을 먼저 선택합니다.
메서드 호출의 부작용을 식 밖으로 뺀다
값을 반환하면서 상태도 바꾸는 호출을 논리식 안에 여러 번 두면 실행 여부가 단락 평가에 달라집니다.
먼저 호출 결과를 변수에 저장해 순서를 고정합니다.
부작용이 있는 메서드 호출을 긴 식 안에 넣으면 호출 순서와 실패 지점을 추적하기 어렵습니다. 호출 결과를 이름 있는 지역 변수에 먼저 담고 각 값을 출력해 보면, 계산 오류인지 입력을 만드는 메서드의 오류인지 분리할 수 있습니다.
우선순위 지식은 복잡한 식을 유지하기보다 어디에서 괄호를 쓰거나 식을 나눌지 판단하는 데 사용해야 합니다.