Skip to main content

4. 메서드, 배열, 문자열 다루기

프로그램이 조금만 길어져도 main 메서드 하나에 모든 코드를 넣는 방식은 금방 버거워집니다. 같은 계산을 여러 번 쓰게 되고, 데이터도 많아지며, 사용자에게 보여 줄 문장도 점점 늘어납니다. 이때 꼭 익혀야 하는 도구가 메서드, 배열, 문자열입니다.

메서드는 코드를 역할별로 나누게 해 주고, 배열은 같은 종류의 데이터를 묶어 다루게 해 줍니다. 문자열은 사람과 프로그램이 주고받는 거의 모든 텍스트를 담당합니다. 이 장에서는 세 가지를 함께 묶어, 더 읽기 쉽고 다시 쓰기 좋은 코드를 만드는 방법을 살펴보겠습니다.

메서드, 배열, 문자열 다루기

메서드: 긴 코드를 역할별로 나누기

메서드는 특정 작업을 묶어 둔 코드 덩어리입니다. "총점을 계산한다", "인사말을 출력한다", "등급을 판정한다"처럼 이름을 붙일 수 있는 작업은 메서드로 만들 수 있습니다.

public class Main {
    public static void main(String[] args) {
        int result = add(10, 20);
        System.out.println(result);
    }

    public static int add(int a, int b) {
        return a + b;
    }
}

add는 두 수를 더하는 메서드입니다. 메서드를 잘 만들면 코드가 짧아지는 것보다 더 중요한 이점이 생깁니다. 읽기 쉬워지고, 수정이 쉬워지고, 재사용이 쉬워진다는 점입니다.

매개변수와 반환값 이해하기

메서드는 값을 받을 수 있고, 결과를 돌려줄 수도 있습니다.

public static int multiply(int x, int y) {
    return x * y;
}

여기서 x, y는 매개변수입니다. 메서드가 입력값을 받기 위해 준비한 변수입니다. 실제로 multiply(3, 4)처럼 호출할 때 넘기는 3, 4는 인수라고 부릅니다.

또한 return x * y;는 계산 결과를 메서드 바깥으로 돌려줍니다. 이처럼 결과를 반환하는 메서드는 반환 타입을 정확히 적어야 합니다. 위 메서드는 int를 반환하므로 반환 타입도 int입니다.

반대로 결과를 돌려줄 필요 없이 동작만 수행할 수도 있습니다.

public static void printHello() {
    System.out.println("안녕하세요");
}

void는 반환값이 없다는 뜻입니다. 초보자는 println()과 return을 자주 헷갈리는데, println()은 화면에 보여 주는 것이고 return은 값을 돌려주는 것입니다.

메서드를 나누는 좋은 기준

코드가 길어질수록 "어디서 끊어야 할까?"가 중요해집니다. 가장 좋은 기준은 하나의 메서드가 하나의 역할만 하게 만드는 것입니다.

예를 들어 학생 점수 처리 프로그램을 만든다면, 총점 계산과 평균 계산과 결과 출력은 성격이 다릅니다. 한곳에 몰아넣기보다 나누는 편이 좋습니다.

public class Main {
    public static void main(String[] args) {
        int[] scores = {90, 80, 100};
        int total = getTotal(scores);
        double average = getAverage(scores);

        printResult(total, average);
    }

    public static int getTotal(int[] scores) {
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        return sum;
    }

    public static double getAverage(int[] scores) {
        return (double) getTotal(scores) / scores.length;
    }

    public static void printResult(int total, double average) {
        System.out.println("총점: " + total);
        System.out.println("평균: " + average);
    }
}

이렇게 나누면 코드를 읽을 때도 자연스럽습니다. main은 전체 흐름을 보여 주고, 실제 계산은 각 메서드가 맡습니다.

배열: 같은 타입의 데이터를 묶어서 관리하기

배열은 같은 타입의 값을 여러 개 저장하는 구조입니다. 학생 다섯 명의 점수를 저장하려고 score1, score2, score3처럼 변수를 계속 늘리는 대신 배열 하나로 묶을 수 있습니다.

int[] scores = {90, 85, 100, 70, 95};

배열은 순서가 있고, 각 위치는 인덱스로 접근합니다. 인덱스는 0부터 시작합니다.

System.out.println(scores[0]); // 90
System.out.println(scores[1]); // 85

배열에서 가장 흔한 실수는 1부터 시작한다고 착각하는 것입니다. 자바 배열의 첫 칸은 항상 0입니다.

배열은 이렇게 만들 수도 있습니다.

int[] numbers = new int[5];

이 코드는 int 값 5개를 저장할 수 있는 배열을 만듭니다. 각 칸에는 기본값 0이 들어 있습니다.

배열과 반복문은 한 팀이다

배열은 반복문과 함께 써야 진짜 편해집니다.

int[] scores = {90, 85, 100, 70, 95};

for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}

배열 길이는 length로 구합니다. 여기서 조건을 i <= scores.length로 쓰면 범위를 벗어나므로 오류가 납니다. 마지막 인덱스는 length - 1이기 때문입니다.

값만 하나씩 읽으면 될 때는 향상된 for문도 편리합니다.

for (int score : scores) {
    System.out.println(score);
}

인덱스가 필요하면 일반 for문, 값만 순서대로 읽으면 향상된 for문이라고 생각하면 됩니다.

배열을 메서드와 함께 쓰면 재사용성이 커진다

배열의 합계나 최댓값처럼 자주 쓰는 기능은 메서드로 만들면 아주 유용합니다.

public static int sumArray(int[] arr) {
    int sum = 0;
    for (int value : arr) {
        sum += value;
    }
    return sum;
}

이제 숫자 배열만 넘기면 어디서든 합계를 구할 수 있습니다.

int[] numbers = {10, 20, 30};
System.out.println(sumArray(numbers));

코드를 복사해 붙여 넣는 대신 기능을 이름 있는 메서드로 바꾸는 습관이 중요합니다. 이것이 재사용 가능한 코드의 출발점입니다.

문자열은 문자들의 묶음이다

문자열은 글자들의 집합입니다. 자바에서는 String 타입을 사용합니다.

String name = "JAVA";
String message = "안녕하세요";

문자 하나는 char, 여러 문자는 String입니다.

char grade = 'A';
String title = "Begin Java";

작은따옴표는 문자 하나, 큰따옴표는 문자열이라는 차이를 꼭 기억해야 합니다.

String은 한 번 만들면 바뀌지 않는다

String의 중요한 특징은 불변(immutable) 이라는 점입니다. 한 번 만들어진 문자열은 직접 수정되지 않습니다.

String str = "Hello";
str = str + " Java";
System.out.println(str);

겉으로는 기존 문자열이 바뀐 것처럼 보이지만, 실제로는 새로운 문자열이 만들어져 str이 그것을 다시 가리키는 것입니다. 초보 단계에서는 "문자열을 더하면 새 문자열이 만들어진다"고 이해하면 충분합니다.

이 특성 덕분에 문자열은 다루기 안전하지만, 반복해서 많이 이어 붙이면 비효율적일 수 있습니다. 아주 많은 문자열 결합은 나중에 StringBuilder로 개선할 수 있습니다. 지금은 String의 동작 방식을 이해하는 것이 더 중요합니다.

문자열 비교는 ==보다 equals()

문자열을 비교할 때 초보자가 가장 많이 틀리는 부분입니다.

String a = "java";
String b = "java";

System.out.println(a.equals(b)); // true

문자열의 내용이 같은지 비교할 때는 equals()를 사용하는 것이 기본입니다. ==는 같은 대상을 가리키는지 비교하는 데 가깝고, 문자열의 내용 비교 용도로는 적절하지 않습니다.

즉, "글자가 같은가?"를 묻고 싶다면 equals()를 먼저 떠올리는 습관을 들이는 것이 좋습니다.

자주 쓰는 문자열 기능

문자열은 프로그램 곳곳에서 쓰이므로 몇 가지 기본 기능은 꼭 익혀 두는 편이 좋습니다.

String text = "Hello Java";

System.out.println(text.length());        // 길이
System.out.println(text.toUpperCase());   // 대문자 변환
System.out.println(text.toLowerCase());   // 소문자 변환
System.out.println(text.contains("Java")); // 포함 여부
System.out.println(text.substring(0, 5)); // 일부 잘라내기

또한 공백 정리도 자주 등장합니다.

String input = "  java  ";
System.out.println(input.trim());

trim()은 앞뒤 공백을 제거합니다. 사용자 입력을 다룰 때 특히 유용합니다.

문자열과 배열을 함께 다루기

문자열 배열도 자주 사용합니다.

String[] fruits = {"사과", "바나나", "포도"};

for (String fruit : fruits) {
    System.out.println(fruit);
}

이제 텍스트 데이터도 배열로 한꺼번에 관리할 수 있습니다. 예를 들어 학생 이름 목록, 메뉴 이름, 파일 이름처럼 같은 성격의 문자열 모음을 저장할 때 유용합니다.

다음처럼 문자열 배열을 받아 출력하는 메서드도 만들 수 있습니다.

public static void printNames(String[] names) {
    for (String name : names) {
        System.out.println(name);
    }
}

메서드와 배열과 문자열이 한 번에 연결되는 지점입니다. 프로그램이 커질수록 이런 조합이 점점 중요해집니다.

실전 예제: 이름 목록에서 특정 글자 찾기

이번 장의 내용을 묶어 간단한 예제를 만들어 봅시다.

public class Main {
    public static void main(String[] args) {
        String[] names = {"김자바", "이코드", "박버그"};
        printNames(names);
        System.out.println(hasKeyword(names, "자바"));
    }

    public static void printNames(String[] names) {
        for (String name : names) {
            System.out.println(name);
        }
    }

    public static boolean hasKeyword(String[] names, String keyword) {
        for (String name : names) {
            if (name.contains(keyword)) {
                return true;
            }
        }
        return false;
    }
}

이 코드는 긴 편이 아니지만, 이미 좋은 구조를 갖고 있습니다. 출력은 printNames, 검색은 hasKeyword, 전체 흐름은 main이 담당합니다. 역할이 나뉘어 있으니 수정도 쉽습니다.

자주 하는 실수

메서드, 배열, 문자열을 처음 배울 때는 비슷한 실수가 반복됩니다. 특히 다음 세 가지를 조심하면 좋습니다.

  • return과 println()을 같은 것으로 생각하는 실수

  • 배열 인덱스를 1부터 시작한다고 착각하는 실수

  • 문자열 비교에 ==를 사용하는 실수

이 실수들은 누구나 겪습니다. 중요한 것은 틀렸다는 사실보다, 왜 틀렸는지를 이해하고 다음 코드에서 바로잡는 것입니다.

마무리

코드가 길어지기 시작하는 순간, 실력 차이는 문법 암기에서 나지 않습니다. 코드를 어떻게 나누는가, 데이터를 어떻게 묶는가, 문자열을 얼마나 정확히 다루는가에서 차이가 납니다.

메서드는 프로그램의 작업을 역할별로 정리해 주고, 배열은 여러 데이터를 한 번에 다루게 해 주며, 문자열은 사용자와 소통하는 대부분의 텍스트를 책임집니다. 이 세 가지를 잘 다룰 수 있다면 이제 단순한 문장 나열을 넘어, 구조를 가진 프로그램을 만들 준비가 된 것입니다.

다음 장에서는 여기서 한 걸음 더 나아가, 메서드와 데이터를 하나의 단위로 묶는 생각, 즉 클래스와 객체를 배우게 됩니다. 이제 프로그램은 단순한 명령의 모음이 아니라, 서로 협력하는 구성요소들의 세계로 들어가게 됩니다.

책 목록

처음부터 실무까지 단계별로 배우는 JAVA 학습

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기