Camp/Java 문법 종합

[TIL] : 배열(Array) & 메서드(Method) & 계산기 과제에서의 트러블 슈팅

taeri7204 2026. 6. 24. 20:53

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 차이도 마찬가지. 다음에 비슷한 구조 짤 때는 변수명부터 더 신경 써서 짜야겠다.