Spring 주차로 넘어오면서 본격적인 학습을 시작하기 전에 전에 들었던 자바 문법에 대해서 복습하는 시간을 갖고 학습을 시작해보기로 했다.
- 배열이 뭔지, 인덱스로 요소에 접근하는 법 익히기
- 향상된 for문이랑 일반 for문 차이 구분하기
- 2차원 배열 개념 잡기
- 메서드의 호출부 / 선언부 구분하기
- void랑 return 차이, 그리고 static 메서드 vs 인스턴스 메서드 호출 차이 정리하기
개념 구조
배열
- 같은 종류의 데이터를 한 묶음으로 관리하는 자료구조. int[] arr = new int[5]; 이런 식으로 선언하고, 길이는 한 번 정하면 못 바꾼다(정적배열).
- 인덱스는 0부터 시작. arr[5] 같은 식으로 범위 밖에 접근하면 ArrayIndexOutOfBoundsException 터진다.
- 일반 for문은 인덱스를 직접 다루니까 값을 수정할 수 있고, 향상된 for문(for (int a : arr))은 꺼내서 읽기만 할 때 편하다. 대신 인덱스 자체는 못 쓴다.
- 2차원 배열은 board[행][열] 구조. 바둑판 같은 좌표 데이터 표현할 때 쓴다.
메서드
- 작업 단위를 묶어놓은 것. 선언부(메서드가 정의된 곳)랑 호출부(메서드를 실제로 쓰는 곳)가 나뉜다.
- 반환값이 없으면 void, 있으면 자료형 써주고 return으로 값을 돌려준다.
- 메서드는 클래스 안에 있어야 하고, static이 아닌 일반(인스턴스) 메서드는 객체를 new로 만든 다음 그 객체를 통해서만 호출할 수 있다.
내용 정리 - 트러블 슈팅
약 한달 전에 강의만 들었을 땐 와닿지 않았고 이해도 잘 안됐었는데,
이번 챕터 내용이 계산기 프로젝트(App.java + Calculator.java 분리하는 작업)에서 그대로 부딪혔던 문제들이라 같이 정리한다.
1. 인스턴스 메서드를 클래스 이름으로 호출함
// 이렇게 썼다가 컴파일 에러
Integer result = Calculator.calculate(num1, num2, op);
calculate()는 results라는 필드를 만지는 메서드라 static이 아니다. static 메서드만 클래스 이름으로 바로 부를 수 있고, 인스턴스 메서드는 new로 객체를 만든 다음 그 객체로 불러야 한다.
Calculator calculator = new Calculator();
Integer result = calculator.calculate(num1, num2, op);
교안에서 본 "호출부 - 선언부" 구조를 생각하면, calculator.calculate(1, 2)에서 점(.) 앞에 오는 게 누구의 기능을 쓰는지를 정해주는 거였다. 클래스 이름을 그냥 써버리면 자바는 어떤 객체의 기능인지 알 길 없다.
2. return이랑 continue 사용법
음수를 입력하면 다시 입력받게 하려고 return을 썼는데, return은 메서드 전체를 끝내버리는 키워드라서 프로그램이 그냥 종료돼버렸다.
// ❌ 메서드 자체가 끝나버림
if (num1 < 0) {
System.out.println("0을 포함한 양의 정수만 입력 가능합니다.");
return;
}
// ✅ while 루프 처음으로 다시 돌아감
if (num1 < 0) {
System.out.println("0을 포함한 양의 정수만 입력 가능합니다.");
continue;
}
return은 함수 종료, continue는 반복문의 현재 회차만 건너뛰고 다음 회차로 넘어가는 거다. "잘못된 입력이면 다시 물어본다"를 만들려면 continue여야 했다.
3. result / results 변수명 오타
// ❌
result.add(result);
// ✅
results.add(result);
단수(result, 계산 한 번의 결과)랑 복수(results, 계산 결과 모음 - 사실상 배열/리스트 역할)를 이름만으로 구분하려다 보니 같은 실수를 두 번 했다. 배열 챕터에서 본 것처럼 여러 개의 값을 묶어서 관리하는 게 results이고, 그 안에 들어가는 하나하나의 요소가 result라는 걸 변수명 단계에서부터 더 명확히 구분했어야 했다.
4. 제네릭 문법 틀림
// ❌
List(Integer) results = ...
// ✅
List<Integer> results = ...
괄호 ()랑 꺽쇠 <> 헷갈렸다. List는 인터페이스, ArrayList는 구현체라서 import도 따로 해줘야 한다는 것도 같이 배웠다.
- 배열은 인덱스 0부터 시작하고 길이 고정. 인덱스 범위 벗어나면 무조건 에러난다는 걸 한 번 더 새겼다.
- 메서드 호출부에서 점(.) 앞에 클래스 이름이 오면 static, 인스턴스 이름이 오면 그 객체의 기능을 쓰는 거다. 둘을 구분 못 하면 컴파일 에러
- return은 끝, continue는 한 번 건너뛰기. 이 둘은 동작이 완전히 다름.
- 변수명이 비슷하면(result/results) 자동완성이나 복붙할 때 실수가 잦다. 다 쓰고 나서 에러가 난다거나 원하는 대로 구현이 안된다면 비슷한 변수명을 보는 걸 습관화 해야 할듯.
핵심 요약
배열-인덱스-메서드 챕터 내용이 계산기 프로젝트 STEP 2(App/Calculator 분리)에서 그대로 응용됐다. 특히 static과 인스턴스 메서드 호출 차이에 대한 이해의 필요성을 더욱 느낌.
return/continue 차이도 마찬가지. 다음에 비슷한 구조 짤 때는 변수명부터 더 신경 써서 짜야겠다.
'Camp > Java 문법 종합' 카테고리의 다른 글
| [TIL] 조건문, 반복문 (0) | 2026.06.09 |
|---|---|
| [TIL] 입출력, 연산자 (0) | 2026.06.08 |
| [TIL] 자바 프로젝트 관리와 변수 (0) | 2026.06.05 |
| [TIL] 자바 입문 (자바의 기초와 메모리 이해) (0) | 2026.06.02 |