이번 편은 작은 프로그램 하나를 키워 가며 배웁니다. 강좌 글의 조회수를 받아 평균을 내고 기준에 못 미치는 글을 골라내는 리포트를 만들 텐데, 이 과정에서 연산자와 조건문, 반복문이 모두 등장합니다.
1단계 · 산술 연산자와 정수 나눗셈의 함정
사칙연산 기호는 익숙한 그대로이고, 나머지를 구하는 %가 하나 더 있습니다.
int totalView = 1250;
int postCount = 8;
System.out.println(totalView + postCount); // 1258
System.out.println(totalView % postCount); // 2 (나머지)
System.out.println(totalView / postCount); // 156 ← 156.25 가 아닙니다
마지막 줄이 이 단계의 함정입니다. 자바는 정수끼리 나누면 결과도 정수로 만들고 소수점 아래를 버립니다. 평균을 제대로 구하려면 한쪽을 실수로 바꿔 줘야 합니다.
double average = (double) totalView / postCount;
System.out.println(average); // 156.25
붙이는 위치도 중요합니다. (double)(totalView / postCount)라고 쓰면 이미 156으로 잘린 뒤에 실수가 되어 156.0이 나옵니다. 나누기 전에 바꿔야 합니다. 형변환이 헷갈린다면 자바 변수와 자료형 편을 확인해 보십시오.
2단계 · 참과 거짓을 만들어 내는 비교·논리 연산자
판단을 하려면 먼저 true 또는 false가 나오는 식이 있어야 합니다. 그 식을 만드는 것이 비교 연산자로, 같으면 ==, 다르면 !=, 크기는 > < >= <=를 씁니다.
여러 조건을 묶을 때는 논리 연산자를 씁니다. &&는 둘 다 참일 때, ||는 하나라도 참일 때, !는 결과를 뒤집습니다.
boolean isPublished = true;
int view = 40;
if (isPublished && view < 100) {
System.out.println("공개했지만 조회수가 낮습니다.");
}
여기서 반드시 짚어야 할 실수가 있습니다. 같은지 물을 때는 ==, 값을 넣을 때는 =입니다. if (view = 40)처럼 하나만 쓰면 비교가 아니라 대입이 되어 버립니다. 더하면서 대입하는 view += 10, 1씩 늘리는 view++ 같은 축약형도 자주 쓰입니다.
3단계 · if와 switch로 갈림길 만들기
조건이 범위로 갈리면 if, 값이 딱 떨어지면 switch가 읽기 좋습니다. 조회수를 등급으로 바꿔 보겠습니다.
int view = 320;
char grade;
if (view >= 1000) {
grade = 'A';
} else if (view >= 300) {
grade = 'B';
} else {
grade = 'C';
}
else if는 위에서부터 순서대로 검사하다가 처음 참이 된 곳에서 멈춥니다. 그래서 조건은 좁은 범위부터 써야 합니다. 위 코드에서 1000 이상과 300 이상의 순서를 바꾸면 조회수 5000인 글도 B가 되어 버립니다.
switch (grade) {
case 'A':
System.out.println("대표 글로 고정합니다.");
break;
case 'B':
System.out.println("제목만 다듬습니다.");
break;
default:
System.out.println("전면 재작성 대상입니다.");
}
break를 빠뜨리면 아래 case들이 줄줄이 함께 실행되니 각 case 끝에 반드시 넣으십시오.
4단계 · for와 while로 열 편을 한 번에 처리하기
반복 횟수를 알고 있으면 for, 언제 끝날지 모르고 조건이 무너질 때까지 돌려야 하면 while이 어울립니다.
public class ViewReport {
public static void main(String[] args) {
int[] views = {120, 45, 980, 310, 60};
int sum = 0;
for (int i = 0; i < views.length; i++) {
sum += views[i];
if (views[i] < 100) {
System.out.println((i + 1) + "번 글 조회수 부족: " + views[i]);
}
}
double average = (double) sum / views.length;
System.out.println("평균 조회수: " + average);
}
}
for의 괄호 안은 시작값 int i = 0, 계속할 조건 i < views.length, 매회 할 일 i++의 세 부분입니다. 조건에 <=를 쓰면 마지막 한 칸을 더 건드려 오류가 납니다.
5단계 · break와 continue, 그리고 우선순위
break는 반복을 통째로 끝내고, continue는 이번 회차만 건너뜁니다.
int[] views = {120, 45, 980, 310, 60};
for (int v : views) {
if (v < 100) {
continue; // 저조한 글은 건너뜁니다
}
if (v >= 900) {
System.out.println("인기 글 발견: " + v);
break; // 하나 찾으면 반복 종료
}
}
우선순위는 산술이 비교보다, 비교가 논리보다 먼저이고 대입이 가장 나중입니다. 외우려 애쓰기보다 헷갈리면 괄호를 치는 것이 실무에서도 정답입니다. 이제 흩어진 변수와 로직을 하나의 부품으로 묶을 차례입니다. 자바 클래스와 객체 편에서 이어집니다.
핵심 정리
- 정수 나눗셈 —
int / int는 소수점을 버립니다. 나누기 전에(double)을 붙이십시오 - == 와 = — 비교는
==, 대입은=. 문자열 내용 비교는equals() - if / switch — 범위 판단은 if, 값이 정해진 분기는 switch (
break필수) - for / while — 횟수를 알면 for, 조건이 끝날 때까지면 while
- break / continue — 반복 종료, 이번 회차 건너뛰기