Java 별찍기는 바깥쪽 for문으로 행을 만들고, 안쪽 for문으로 각 행의 공백과 별 개수를 결정하는 문제다. 모양을 통째로 외우기보다 현재 행 번호 i에서 무엇을 몇 번 출력할지 계산하면 삼각형, 역삼각형, 피라미드를 같은 원리로 풀 수 있다.
for문의 실행 순서부터 복습해야 한다면 Java 조건문·반복문·배열 코딩테스트 입문을 먼저 읽고 이어가면 흐름이 자연스럽다.
핵심: 바깥 반복문 = 세로 행, 안쪽 반복문 = 한 행의 가로 출력, println() = 다음 행으로 이동.

행 번호가 증가할 때 공백과 별 개수가 달라지는 네 가지 별찍기 패턴
1. 중첩 for문은 행과 열을 나눠 생각한다
행 개수가 rows = 5라면 바깥 반복문의 i는 0, 1, 2, 3, 4 순서로 움직인다. 화면에서는 첫째 줄부터 다섯째 줄이지만, 코드에서는 0부터 시작한다. 그래서 첫 행의 별 하나는 i + 1로 표현한다.
for (int i = 0; i < rows; i++) {
// 현재 i번째 행에 필요한 공백과 별 출력
System.out.println(); // 한 행이 끝난 뒤 줄바꿈
}예를 들어 오른쪽 정렬 삼각형의 세 번째 행은 i = 2다. 전체 폭이 5칸이므로 공백은 5 - 2 - 1 = 2개, 별은 2 + 1 = 3개다. 코드 실행 순서도 공백 2개 → 별 3개 → 줄바꿈이 된다.
| 모양 | 공백 개수 | 별 개수 | 행이 내려갈수록 |
|---|---|---|---|
| 왼쪽 삼각형 | 0 | i + 1 | 별 1개 증가 |
| 왼쪽 역삼각형 | 0 | rows - i | 별 1개 감소 |
| 오른쪽 삼각형 | rows - i - 1 | i + 1 | 공백 감소, 별 증가 |
| 중앙 피라미드 | rows - i - 1 | 2 * i + 1 | 공백 감소, 별 2개 증가 |
2. 왼쪽 삼각형과 역삼각형
왼쪽 삼각형: 별 개수는 i + 1
첫 행은 1개, 둘째 행은 2개처럼 별이 한 개씩 늘어난다. 공백을 따로 출력할 필요가 없어 별찍기 원리를 익히기 가장 좋은 형태다.
*
**
***
****
*****static void printLeftTriangle(int rows) {
for (int i = 0; i < rows; i++) {
for (int star = 0; star < i + 1; star++) {
System.out.print("*");
}
System.out.println();
}
}왼쪽 역삼각형: 별 개수는 rows - i
전체 행 수에서 현재 행 번호를 빼면 별이 5, 4, 3, 2, 1개로 줄어든다. rows - i가 0이 되기 전에 바깥 반복문이 끝나므로 마지막 행에도 별 하나가 출력된다.
*****
****
***
**
*static void printReverseTriangle(int rows) {
for (int i = 0; i < rows; i++) {
for (int star = 0; star < rows - i; star++) {
System.out.print("*");
}
System.out.println();
}
}3. 오른쪽 정렬 삼각형: 공백을 먼저 출력한다
오른쪽 정렬에는 한 행 안에서 두 번의 작업이 필요하다. 먼저 rows - i - 1개의 공백으로 시작 위치를 오른쪽으로 밀고, 이어서 i + 1개의 별을 출력한다.
*
**
***
****
*****i = 2일 때: 공백 5 - 2 - 1 = 2개, 별 2 + 1 = 3개 → ··***
static void printRightTriangle(int rows) {
for (int i = 0; i < rows; i++) {
for (int space = 0; space < rows - i - 1; space++) {
System.out.print(" ");
}
for (int star = 0; star < i + 1; star++) {
System.out.print("*");
}
System.out.println();
}
}공백 반복문과 별 반복문의 순서를 바꾸면 모양이 달라진다. 오른쪽 정렬에서는 반드시 공백을 먼저, 별을 나중에 출력해야 한다.
4. 중앙 피라미드: 별이 2개씩 늘어난다
피라미드는 오른쪽 정렬 삼각형과 공백 공식이 같다. 차이는 별 개수다. 가운데 꼭짓점에서 시작해 좌우로 한 칸씩 넓어지므로 별이 1, 3, 5, 7, 9개가 된다. 이를 식으로 쓰면 2 * i + 1이다.
*
***
*****
*******
*********static void printPyramid(int rows) {
for (int i = 0; i < rows; i++) {
for (int space = 0; space < rows - i - 1; space++) {
System.out.print(" ");
}
for (int star = 0; star < 2 * i + 1; star++) {
System.out.print("*");
}
System.out.println();
}
}5. 배열 값만큼 별 막대 출력하기
삼각형은 행 번호로 별 개수를 계산하지만, 막대 그래프는 배열의 현재 값이 별 개수가 된다. 바깥 반복문은 배열 원소를 고르고, 안쪽 반복문은 그 값만큼 별을 출력한다.
static void printBars(int[] counts) {
for (int i = 0; i < counts.length; i++) {
System.out.print(counts[i] + " : ");
for (int star = 0; star < counts[i]; star++) {
System.out.print("*");
}
System.out.println();
}
}3 : ***
1 : *
5 : *****음수 입력은 별을 출력할 수 없으므로 배열을 만들 때 0 이상인지 검증한다. 이 예제는 원문 35의 사용자 입력형 별 그래프를 중첩 반복문의 같은 원리로 연결한 것이다.
6. 네 가지 패턴과 별 막대를 실행하는 Java 코드
입력값 검증까지 포함한 실행 가능한 예제다. 메서드로 분리하면 각 패턴의 반복 조건을 비교하기 쉽고, 필요한 모양만 다시 호출할 수도 있다.
import java.util.Scanner;
public class StarPatterns {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("행 개수: ");
int rows = sc.nextInt();
if (rows <= 0) {
System.out.println("행 개수는 1 이상이어야 합니다.");
sc.close();
return;
}
System.out.println("[왼쪽 삼각형]");
printLeftTriangle(rows);
System.out.println("\n[왼쪽 역삼각형]");
printReverseTriangle(rows);
System.out.println("\n[오른쪽 삼각형]");
printRightTriangle(rows);
System.out.println("\n[중앙 피라미드]");
printPyramid(rows);
System.out.println("\n[배열 값만큼 별 막대]");
printBars(new int[] {3, 1, 5});
sc.close();
}
static void printLeftTriangle(int rows) {
for (int i = 0; i < rows; i++) {
for (int star = 0; star < i + 1; star++) {
System.out.print("*");
}
System.out.println();
}
}
static void printReverseTriangle(int rows) {
for (int i = 0; i < rows; i++) {
for (int star = 0; star < rows - i; star++) {
System.out.print("*");
}
System.out.println();
}
}
static void printRightTriangle(int rows) {
for (int i = 0; i < rows; i++) {
for (int space = 0; space < rows - i - 1; space++) {
System.out.print(" ");
}
for (int star = 0; star < i + 1; star++) {
System.out.print("*");
}
System.out.println();
}
}
static void printPyramid(int rows) {
for (int i = 0; i < rows; i++) {
for (int space = 0; space < rows - i - 1; space++) {
System.out.print(" ");
}
for (int star = 0; star < 2 * i + 1; star++) {
System.out.print("*");
}
System.out.println();
}
}
static void printBars(int[] counts) {
for (int i = 0; i < counts.length; i++) {
System.out.print(counts[i] + " : ");
for (int star = 0; star < counts[i]; star++) {
System.out.print("*");
}
System.out.println();
}
}
}7. 별찍기에서 자주 틀리는 부분
println()을 안쪽 반복문에 넣는 경우
별 하나를 출력할 때마다 줄이 바뀐다. 한 행의 공백과 별을 모두 출력한 뒤, 바깥 반복문 끝에서 한 번만 println()을 호출해야 한다.
<와 <=를 혼동하는 경우
star < i + 1과 star <= i는 같은 횟수만큼 반복한다. 두 표현을 섞어 고치다 보면 별이 한 개 더 나오거나 덜 나오는 오프바이원 오류가 생기기 쉽다. 한 글 안에서는 개수를 기준으로 < 형태를 통일하는 편이 읽기 쉽다.
공백 대신 빈 문자열을 출력하는 경우
System.out.print("")는 아무것도 출력하지 않는다. 정렬에 필요한 것은 실제 한 칸인 System.out.print(" ")다. 결과를 확인할 때는 공백을 점으로 바꿔 출력하면 개수를 눈으로 세기 쉽다.
공백 수를 rows - i로 계산하는 경우
오른쪽 삼각형 첫 행의 별 앞에는 4칸만 필요하다. rows - i를 쓰면 5칸이 되어 전체가 한 칸 오른쪽으로 밀린다. 0부터 시작하는 행 번호 때문에 마지막에 - 1이 필요하다.
핵심 요약
- 바깥
for문은 행, 안쪽for문은 한 행의 공백과 별을 담당한다. - 증가 삼각형은
i + 1, 역삼각형은rows - i개의 별을 출력한다. - 오른쪽 정렬은 공백
rows - i - 1개를 먼저 출력한다. - 중앙 피라미드는 별 개수가
2 * i + 1로 늘어난다. - 배열 막대 그래프는 현재 원소 값이 안쪽 반복문의 횟수가 된다.
- 각 행의 출력이 모두 끝난 뒤
println()을 한 번 호출한다.
'자격증·공부 아카이브 > Java 기초' 카테고리의 다른 글
| Java 자릿수와 진법 변환: 숫자 합·10진수·2진수 원리 (0) | 2026.07.30 |
|---|---|
| Java 배열 문제 풀이: 조건 필터링·배수·정렬·가장 가까운 두 수 (0) | 2026.07.30 |
| Java 메서드 예제 3가지: 계산기·가운데 글자·거듭제곱 구현 (0) | 2026.07.30 |
| Java 메서드와 객체지향: 클래스·생성자·상속 한 번에 정리 (0) | 2026.07.16 |
| Java 조건문·반복문·배열: 코딩테스트 입문 (0) | 2026.07.15 |