Menu

Java if-else: 예제로 배우는 조건문

if, else if, else로 Java에서 판단을 내리는 방법: boolean 조건, 분기 연결, 중첩, 삼항 연산자, 그리고 많은 사람을 헷갈리게 하는 흔한 실수까지 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

if로 판단하기

프로그램은 데이터에 반응해야 합니다. 합격이냐 불합격이냐, 재고가 있느냐 품절이냐, 유효하냐 아니냐. if 문은 Java가 조건에 따라 어떤 코드를 실행할지 선택하는 방법입니다.

if는 괄호 안에 boolean 조건을 받고, 그 조건이 true일 때만 중괄호 안의 블록을 실행합니다.

조건 score >= 60true이므로 메시지가 출력됩니다. 닫는 중괄호 뒤의 줄은 항상 실행됩니다. 그것은 if 바깥에 있기 때문입니다. score40으로 바꾸면 "passed" 줄은 완전히 건너뜁니다.

C와 달리 Java는 boolean이 와야 할 자리에 숫자를 넣는 것을 허용하지 않습니다. if (score)는 컴파일 오류입니다. 조건은 비교(>, >=, ==, !=)나 boolean 논리(&&, ||, !)로 만들어진 진짜 boolean 식이어야 합니다.

else 추가하기

else는 "그렇지 않으면"의 경로, 즉 조건이 false일 때만 실행되는 코드를 제공합니다.

두 블록 중 정확히 하나만 실행됩니다. 둘 다 실행되는 일도, 아무것도 실행되지 않는 일도 없습니다. else는 자체 조건이 없으며, 그저 if가 잡지 못한 모든 경우를 받아 냅니다.

else if로 연결하기

결과가 둘보다 많을 때는 else if로 조건을 연결합니다. Java는 위에서 아래로 조건을 확인하고 조건이 참인 첫 번째 블록을 실행한 뒤 나머지는 건너뜁니다.

순서가 중요합니다. 84는 먼저 >= 90에 대해(거짓), 그다음 >= 80에 대해(참) 확인되므로 B에서 멈추고 하한은 아예 검사하지 않습니다. 바로 그래서 score >= 80 && score < 90이라고 쓸 필요도 없습니다. 두 번째 분기에 도달했다는 것은 이미 score가 90 미만이었음을 보장하기 때문입니다. 가장 좁거나 우선순위가 가장 높은 조건을 맨 앞에 두세요.

마지막 else는 모든 경우를 받는 처리입니다. 여기서 그것을 빼면 컴파일 오류가 납니다. 출력하는 시점에 grade가 대입되지 않은 채로 남을 수 있기 때문입니다.

값 비교하기: == 와 equals()

Java에서 가장 흔한 if 버그는 문자열==로 비교하는 것입니다. 기본형(int, double, char, boolean)에는 ==가 맞습니다. 객체의 경우 ==는 "이것이 메모리상의 같은 객체인가?"를 묻고, .equals()는 "이것들이 같은 내용을 가지는가?"를 묻습니다. 그리고 거의 항상 원하는 것은 후자입니다.

출력되는 것은 두 번째 메시지뿐입니다. new String("yes")는 리터럴 "yes"와 다른 객체이므로 ==false이지만, 텍스트가 동일하므로 .equals()true입니다. 경험칙: 기본형은 ==, 객체는 .equals()를 사용합니다.

변수가 null일 수 있을 때 NullPointerException을 피하는 안전한 요령: 리터럴을 앞에 두는 것, 즉 if ("yes".equals(input))입니다. 리터럴은 결코 null이 아니기 때문입니다.

조건 결합과 중첩

조건은 &&(그리고), ||(또는), !(아님)으로 결합할 수 있습니다. 또한 어떤 검사가 이전 검사를 통과한 후에만 의미가 있을 때는 if를 다른 if 안에 중첩할 수 있습니다.

&&||는 단락 평가를 합니다. a && b에서 a가 거짓이면 Java는 b를 절대 평가하지 않습니다. 이는 오류를 막는 데 유용합니다. if (s != null && s.length() > 0)는 안전합니다. s가 null일 때 길이 검사가 건너뛰어지기 때문입니다. 가능하면 깊은 중첩보다 &&로 결합하는 편을 택하세요. 평평한 코드가 중괄호 피라미드보다 더 명확하게 읽힙니다.

전형적인 함정: 하나의 =는 대입이고 ==는 비교입니다. if (x = 5)를 쓰면 int에는 컴파일 오류가 나지만(좋은 일), boolean에 대한 if (flag = true)는 컴파일이 되고 조용히 대입해 버립니다. 조심하세요.

삼항 연산자

중 하나를 고르는 것만이 목적이라면, 삼항 연산자 ?:는 간결한 한 줄짜리입니다. condition ? a : b를 "조건이 참이면 a, 아니면 b"로 읽으세요.

삼항 연산자는 대입하거나 직접 전달할 수 있는 값을 만들어 냅니다. 단순한 선택에만 쓰세요. 어느 한 분기에 여러 문장이나 실제 로직이 필요하다면, 완전한 if-else가 읽기 좋게 유지되는 반면 중첩된 삼항은 금세 수수께끼가 됩니다.

함정: 선택적 중괄호의 덫

Java는 분기에 문장이 하나뿐일 때 중괄호를 생략하도록 허용하지만, 이는 미묘한 버그를 부릅니다. 들여쓰기가 거짓말을 합니다.

if (loggedIn)
    System.out.println("Welcome");
    System.out.println("Loading dashboard");   // NOT part of the if!

if가 제어하는 것은 첫 줄뿐이고, 둘째 줄은 들여쓰기가 무엇을 암시하든 항상 실행됩니다. 한 줄이라도 항상 중괄호를 사용하면 이 부류의 실수가 통째로 사라집니다.

다음: switch

if-else if 체인은 각 분기가 서로 다른 조건을 검사할 때 완벽합니다. 하지만 하나의 값을 여러 고정된 가능성(요일 이름, 메뉴 선택, enum)과 대조할 때는 긴 else if 사다리가 반복적으로 됩니다. switch 문은 바로 그것을 위해 만들어졌으며, 그것이 다음 페이지입니다.

자주 묻는 질문

Java에서 if-else 문은 어떻게 작성하나요?

if 뒤 괄호 안에 boolean 조건을 넣고, 그다음 중괄호 안에 실행할 코드를 쓰며, 조건이 거짓일 때를 위해 선택적으로 else 블록을 둡니다: if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }. 조건은 boolean으로 평가되어야 합니다. Java는 C처럼 int를 받아들이지 않습니다.

Java의 if 문에서 == 와 equals()의 차이는 무엇인가요?

==는 두 참조가 같은 객체를 가리키는지 비교하고, .equals()는 내용을 비교합니다. int 같은 기본형에는 ==를 사용합니다. 객체, 특히 String에는 .equals()를 사용합니다: if (name == "Sam")가 아니라 if (name.equals("Sam"))입니다. 문자열에 ==를 사용하는 것은 Java에서 가장 흔한 if 버그입니다.

Java의 삼항 연산자란 무엇인가요?

삼항 연산자 condition ? valueIfTrue : valueIfFalse는 값을 만들어 내는 간결한 if-else입니다. 예를 들어 String label = age >= 18 ? "adult" : "minor";는 조건에 따라 두 값 중 하나를 대입합니다. 단순한 값 선택에 사용하고, 각 분기에서 실행할 로직이 있을 때는 완전한 if-else를 사용하세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기