가장 먼저 배우는 것은 컴퓨터에게 "화면에 이것 좀 띄워줘!"라고 명령하는 방법입니다.
System.out.print(): 괄호 안의 내용을 출력하고 줄 바꿈을 하지 않습니다. (옆으로 이어서 출력)System.out.println(): 괄호 안의 내용을 출력하고 자동으로 줄 바꿈을 합니다. (가장 많이 사용)System.out.printf(): 포맷(형식)을 지정해서 출력합니다. (예: 소수점 2자리까지만 출력 등)System.out.println("안녕하세요!"); // 출력 후 줄이 바뀜
System.out.print("자바 ");
System.out.print("프로그래밍"); // 자바 프로그래밍 (이어서 출력됨)데이터를 담아두는 '상자'와 그 상자의 '종류'입니다.
int: 정수 (예: 10, -5). 가장 기본적으로 쓰이는 숫자형.double: 실수 (예: 3.14). 소수점이 있는 숫자.boolean: 논리형 (true 또는 false). 맞다/틀리다를 판별할 때 사용.String: 문자열 (예: "Hello"). 글자들의 집합. (주의: S가 대문자입니다)int age = 25; // 정수형 변수 선언 및 25로 초기화
double height = 175.5; // 실수형 변수
boolean isPass = true; // 논리형 변수
String name = "홍길동"; // 문자열 변수"만약 ~라면 A를 하고, 아니면 B를 해라"라고 컴퓨터에게 판단을 맡기는 문법입니다.
if ~ else if ~ else문: 조건의 범위를 지정하거나 복잡한 논리를 따질 때 사용합니다. (예: 점수가 90점 이상이면 A, 80점 이상이면 B)switch ~ case문: 변수의 값이 특정 값과 정확히 일치할 때 사용합니다. (예: 버튼 1번을 누르면 저장, 2번을 누르면 삭제). 범위 지정이 불가능하지만, 값이 딱딱 떨어질 때는 코드가 훨씬 깔끔해집니다.int score = 85;
if (score >= 90) {
System.out.println("A등급입니다.");
} else if (score >= 80) {
System.out.println("B등급입니다."); // 이 코드가 실행됨
} else {
System.out.println("C등급입니다.");
}똑같은 코드를 100번, 1000번 작성하기 힘들 때 사용하는 마법입니다.
[Image of for loop flow chart]
for문: 반복 횟수가 명확하게 정해져 있을 때 주로 사용합니다. (예: 1부터 10까지 출력해라). 괄호 안에 초기식, 조건식, 증감식이 한데 모여 있어 가독성이 좋습니다.while문: 반복 횟수는 모르지만 특정 조건이 만족될 때까지 계속 반복해야 할 때 사용합니다. (예: 사용자가 '종료'를 입력할 때까지 계속해라).// 1부터 5까지 출력 (초기화; 조건식; 증감식)
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}변수 100개를 일일이 선언하기 힘들 때, 아파트처럼 한 건물에 호수를 매겨 묶어서 관리하는 방법입니다.
int score1, score2 ... score30을 만들지 않고, int[] scores = new int[30]; 하나로 끝냅니다.for문)과 찰떡궁합으로 쓰입니다.// 1. 배열 선언과 동시에 값 넣기
int[] numbers = {10, 20, 30, 40, 50};
// 2. 인덱스 0부터 시작하여 값 출력하기
System.out.println(numbers[0]); // 10 출력
// 3. 배열과 for문의 결합 (가장 중요)
// numbers.length는 배열의 크기(5)를 알려줍니다.
for (int i = 0; i < numbers.length; i++) {
System.out.println("배열의 " + i + "번째 값: " + numbers[i]);
}특정 조건을 if, else if, else를 사용하여 나타내고, 코드가 그 조건(true/false)에 부합할 때만 해당 블록을 실행하도록 흐름을 제어하는 문법이다.
[나의 초기 코드]
int i = sc.nextInt();
if (i % 2 == 0) {
System.out.println("짝수입니다.");
}
if (i % 2 != 0) {
System.out.println("홀수입니다.");
}
[보충 포인트: else의 활용]
위 코드는 결과는 맞지만, 컴퓨터가 조건을 두 번 연속으로 검사해야 하므로 비효율적이다. 짝수가 아니면 무조건 홀수이므로, 두 번째 if 대신 else를 사용하는 것이 훨씬 깔끔하고 성능에 좋다.
[리팩토링 코드]
if (i % 2 == 0) {
System.out.println("짝수입니다.");
} else {
System.out.println("홀수입니다."); // 짝수가 아니라면 무조건 실행
}
[보충 포인트: else if의 활용]
성적 판별 시 if문만 나열하면, 95점(A등급)을 받았을 때 A를 출력하고도 밑에 있는 B, C, D, F 조건식을 쓸데없이 또 검사하게 된다. 이럴 때는 else if를 사용하여 "위 조건이 맞으면 아래는 무시하고 빠져나간다"는 구조를 만들어야 한다.
[리팩토링 코드]
if (i >= 90) {
System.out.println("A");
} else if (i >= 80) { // i <= 89 조건은 안 써도 된다. (위에서 90 이상은 이미 걸러졌기 때문)
System.out.println("B");
} else if (i >= 70) {
System.out.println("C");
} else if (i >= 60) {
System.out.println("D");
} else {
System.out.println("F"); // 그 외 나머지
}
특정 조건이 참(true)일 때 코드를 반복 실행한다.
for문: 횟수가 정해져 있을 때 주로 사용 (초기화, 조건, 증감식이 한 줄에 있어 가독성이 좋음).while문: 횟수보다는 '특정 조건'이 만족될 때까지 무한정 반복해야 할 때 주로 사용.[나의 실수]
println을 사용했다.[수정 포인트]
System.out.print("*");System.out.println();을 넣어 엔터 처리.반복문 안에 또 다른 반복문이 들어있는 형태다. 2차원 배열이나 표(Grid), 좌표, 피라미드 등 복합적인 구조를 만들 때 필수적이다. 바깥 반복문이 1번 돌 때, 안쪽 반복문은 끝까지 전부 돈다는 흐름을 이해하는 것이 핵심이다.
별 찍기는 컴퓨터가 "무조건 왼쪽에서 오른쪽으로만 글씨를 쓴다"는 사실을 이해해야 풀 수 있다. 가운데서 별이 생겨나는 것이 아니라, 왼쪽에 투명한 공백을 쌓아 별을 오른쪽으로 밀어내는 것이다.
반드시 외워야 할 피라미드 공식 (높이가 N일 때)
- 공백의 개수 (
N - i): 내려갈수록 빈칸이 줄어들어야 별이 퍼진다.- 별의 개수 (
(i * 2) - 1): 대칭을 이루려면 별은 항상 홀수(1, 3, 5...) 단위로 늘어나야 한다.
[정답 구조]
int h = 5; // 높이
for (int i = 1; i <= h; i++) {
// 1. 공백 찍기
for (int l = 1; l <= h - i; l++) { System.out.print(" "); }
// 2. 별 찍기
for (int s = 1; s <= (i * 2) - 1; s++) { System.out.print("*"); }
// 3. 줄바꿈
System.out.println();
}
배열은 한 번 만들면 크기(방의 개수)를 절대 바꿀 수 없다는 특징이 있다.
int[] arr = new int[10]; (안에는 0이 채워짐)int[] arr = {10, 20, 30};int[] arr;arr = new int[]{10, 20, 30}; (나중에 넣을 땐 new int[] 필수)[나의 주요 실수들]
1. 변수명 혼동: Scanner sc로 선언해놓고 scanner.nextInt() 호출. (이름을 일치시켜야 함)
2. 스코프(Scope) 오류: 첫 번째 for문에서 만든 int i는 괄호 }가 닫히면 사라진다. 두 번째 출력용 for문에서 i를 다시 선언해야 한다.
3. 배열 인덱스 혼동: 출력할 때 System.out.println(i);를 하면 0, 1, 2 같은 방 번호만 나온다. 안의 값을 보려면 배열이름[i]를 써야 한다.
배열 인덱스 주의사항
컴퓨터는 0부터 센다. 크기가 10인 배열의 인덱스는 0부터 9까지다.
따라서for문 조건은i <= 10이 아니라i < 10또는i < 배열.length로 작성해야 에러(ArrayIndexOutOfBoundsException)가 나지 않는다.
[문제 상황]
배열 안의 값을 모두 합해 35가 나오고 개수가 6개일 때, System.out.println(sum / arr.length);를 하면 5.8333이 아니라 정수 5만 출력된다.
[원인 및 해결]
자바에서는 정수 / 정수 = 정수(몫)이라는 강력한 규칙이 있어 소수점을 전부 버려버린다.
소수점까지 정확한 평균을 구하고 싶다면, 계산할 때 잠시 실수(double)로 변환(캐스팅)해주어야 한다.
[리팩토링 코드]
int sum = 0;
int[] arr = {3, 2, 6, 8, 7, 9};
for(int i = 0; i < arr.length; i++) {
sum += arr[i]; // sum = sum + arr[i] 와 동일 (축약형)
}
// sum을 잠시 double로 바꿔서 계산 (정답: 5.8333...)
System.out.println((double) sum / arr.length);
조건문이란 프로그램의 흐름을 제어하는 문법이다. 주어진 조건식의 결과가 참(true)인지 거짓(false)인지에 따라 서로 다른 코드를 실행하도록 분기하는 역할을 한다. 자바에서는 크게 범위를 비교할 때 사용하는 if-else문과, 특정 값에 따라 분기할 때 사용하는 switch문으로 나누어 사용한다.
if-else if 문과 switch 문의 차이점if-else if 문: 조건식의 결과가 boolean(참/거짓)으로 도출되며, 부등호를 사용한 범위 비교나 여러 조건이 결합된 복잡한 로직 처리에 유리하다.switch 문: 변수의 값(정수, 문자열 등)이 명확하게 일치할 때 사용한다. 가독성이 좋고 분기가 많을 때 처리 속도가 상대적으로 빠르다는 장점이 있다.while문과 for문의 차이점반복문은 특정 조건이 만족되는 동안 같은 코드를 여러 번 반복해서 실행하게 해주는 제어문이다.
for문: 초기식, 조건식, 증감식을 한 줄에 작성하므로 반복 횟수가 명확하게 정해져 있을 때 사용하기 적합하다.while문: 반복 횟수보다는 특정 조건이 참(true)인 동안 계속 반복해야 할 때 (예: 사용자가 '종료'를 입력할 때까지 무한 반복) 주로 사용한다.break문과 continue문의 차이점break문: 자신이 포함된 가장 가까운 반복문을 즉시 완전히 종료하고 빠져나갈 때 사용한다.continue문: 반복문을 종료하지 않고, 현재 반복 차례의 나머지 코드를 무시하고 건너뛴 후, 곧바로 다음 반복(조건식이나 증감식)으로 넘어가서 계속 진행할 때 사용한다.이중 반복문은 하나의 반복문 안에 또 다른 반복문이 포함된 구조이다.
실행 흐름은 외부 반복문이 한 번 실행될 때마다, 내부 반복문이 자신의 조건이 끝날 때까지 전체 반복을 모두 수행한다. 즉, 내부 반복문이 완전히 끝나야 외부 반복문의 다음 차례로 넘어가는 방식으로 동작한다.
주로 행(Row)과 열(Column)로 이루어진 2차원 형태의 데이터를 다룰 때 사용된다. 대표적으로 구구단 출력, 별 찍기(피라미드) 같은 표 형태의 출력이나, 2차원 배열의 값을 초기화하고 탐색할 때 필수적으로 사용된다.
배열은 **'같은 타입'**의 데이터 여러 개를 **'연속된 메모리 공간'**에 저장하는 자료구조이다.
ArrayIndexOutOfBoundsException 발생 원인배열에 할당된 유효한 인덱스 범위를 벗어난 공간에 접근하려고 할 때 발생하는 에러다. 예를 들어 크기가 5인 배열은 인덱스가 0부터 4까지 존재하는데, arr[5] 처럼 존재하지 않는 인덱스에 값을 넣거나 읽으려 할 때 이 예외가 발생한다.
💡 서술형 답안 작성 팁
핵심 키워드를 반드시 포함하는 것이 중요하다.
for문: 반복 횟수 명확while문: 특정 조건 만족 시break: 반복문 즉시 종료continue: 이번 턴만 건너뜀