본문 바로가기
  • 코딩, 허쌤이 떠먹여 줄게
BackEnd/Java

6장. 메서드(Method)

by 허쌤 2025. 12. 31.

6장. 메서드(Method)

메서드의 개념

메서드란?

메서드(Method)는 특정 작업을 수행하는 코드 블록입니다. 메서드를 사용하면 코드를 재사용하고, 프로그램을 구조화하며, 유지보수를 쉽게 할 수 있습니다.

메서드의 장점

  1. 코드 재사용: 같은 코드를 여러 번 작성하지 않고 메서드를 호출하여 사용
  2. 모듈화: 프로그램을 작은 단위로 나누어 관리
  3. 가독성 향상: 메서드 이름으로 기능을 명확히 표현
  4. 유지보수 용이: 수정이 필요할 때 메서드만 수정하면 됨
  5. 테스트 용이: 각 메서드를 독립적으로 테스트 가능

메서드의 구조

접근제어자 반환타입 메서드명(매개변수목록) {
    // 메서드 본문
    return 반환값;  // 반환 타입이 void가 아닌 경우
}

구성 요소

  • 접근제어자: 메서드의 접근 범위 (public, private 등)
  • 반환타입: 메서드가 반환하는 값의 타입 (없으면 void)
  • 메서드명: 메서드를 식별하는 이름
  • 매개변수: 메서드에 전달하는 값들
  • 메서드 본문: 실제 실행되는 코드

메서드의 개념과 구조

기본 메서드 예제

public class MethodExample {
    // 반환값이 없는 메서드
    public void sayHello() {
        System.out.println("안녕하세요!");
    }

    // 반환값이 있는 메서드
    public int add(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        MethodExample obj = new MethodExample();
        obj.sayHello();  // 메서드 호출

        int result = obj.add(10, 20);  // 메서드 호출 및 결과 저장
        System.out.println("결과: " + result);
    }
}

메서드 호출

메서드를 사용하려면 메서드를 호출해야 합니다.

// 형식: 객체명.메서드명(인자);
// 또는: 클래스명.메서드명(인자); (static 메서드인 경우)

MethodExample obj = new MethodExample();
obj.sayHello();  // 메서드 호출

메서드명 규칙

  1. 영문자, 숫자, 언더스코어(_), 달러 기호($) 사용 가능
  2. 숫자로 시작 불가
  3. Java 예약어 사용 불가
  4. 의미 있는 이름 사용 (동사로 시작하는 것이 좋음)
  5. 카멜 케이스(CamelCase) 사용 권장

좋은 메서드명 예시

calculateSum()      // 합계 계산
getUserName()       // 사용자 이름 가져오기
isValid()           // 유효성 검사 (boolean 반환)
printMessage()      // 메시지 출력

매개변수와 반환값

매개변수 (Parameter)

메서드에 값을 전달하기 위해 사용하는 변수입니다.

// 매개변수가 없는 메서드
public void greet() {
    System.out.println("안녕하세요!");
}

// 매개변수가 하나인 메서드
public void greet(String name) {
    System.out.println("안녕하세요, " + name + "님!");
}

// 매개변수가 여러 개인 메서드
public int add(int a, int b) {
    return a + b;
}

인자 (Argument) vs 매개변수 (Parameter)

  • 매개변수: 메서드 정의에서 사용하는 변수
  • 인자: 메서드 호출 시 전달하는 실제 값
// 메서드 정의
public int add(int a, int b) {  // a, b는 매개변수
    return a + b;
}

// 메서드 호출
int result = add(10, 20);  // 10, 20은 인자

반환값 (Return Value)

메서드가 작업을 수행한 후 결과를 반환할 수 있습니다.

반환값이 있는 메서드

public int multiply(int a, int b) {
    return a * b;  // int 타입의 값을 반환
}

// 사용
int result = multiply(5, 3);  // 15

반환값이 없는 메서드 (void)

public void printSum(int a, int b) {
    int sum = a + b;
    System.out.println("합계: " + sum);
    // return 문이 없거나 return; 만 사용
}

// 사용
printSum(10, 20);  // 반환값 없음

return 문

  • 반환값이 있는 메서드: return 값; 형태로 반환값을 지정
  • 반환값이 없는 메서드: return; 또는 생략 가능 (메서드 끝에서 자동 return)
public int getMax(int a, int b) {
    if (a > b) {
        return a;  // 여기서 메서드 종료
    }
    return b;  // a <= b일 때 실행
}

여러 개의 값 반환하기

Java는 기본적으로 하나의 값만 반환할 수 있습니다. 여러 값을 반환하려면:

  1. 배열 사용

    public int[] getMinMax(int[] numbers) {
     int min = numbers[0];
     int max = numbers[0];
    
     for (int num : numbers) {
         if (num < min) min = num;
         if (num > max) max = num;
     }
    
     return new int[]{min, max};
    }
  2. 클래스나 객체 사용 (나중에 학습)


메서드 오버로딩 (Method Overloading)

오버로딩이란?

메서드 오버로딩은 같은 이름의 메서드를 여러 개 정의하는 것입니다. 매개변수의 개수나 타입이 달라야 합니다.

오버로딩의 조건

  1. 메서드 이름이 같아야 함
  2. 매개변수의 개수 또는 타입이 달라야 함
  3. 반환 타입은 오버로딩과 무관 (반환 타입만 다른 것은 오버로딩이 아님)

오버로딩 예제

public class Calculator {
    // 정수 두 개를 더하는 메서드
    public int add(int a, int b) {
        return a + b;
    }

    // 정수 세 개를 더하는 메서드 (매개변수 개수 다름)
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 실수 두 개를 더하는 메서드 (매개변수 타입 다름)
    public double add(double a, double b) {
        return a + b;
    }

    // 정수와 실수를 더하는 메서드
    public double add(int a, double b) {
        return a + b;
    }
}

오버로딩 사용 예제

Calculator calc = new Calculator();

int result1 = calc.add(10, 20);        // int add(int, int) 호출
int result2 = calc.add(10, 20, 30);    // int add(int, int, int) 호출
double result3 = calc.add(10.5, 20.5); // double add(double, double) 호출
double result4 = calc.add(10, 20.5);   // double add(int, double) 호출

오버로딩의 장점

  • 일관성: 같은 기능을 하는 메서드에 같은 이름 사용
  • 편의성: 다양한 타입의 인자를 받을 수 있음
  • 가독성: 메서드 이름만으로 기능을 알 수 있음

주의사항

// 오류: 반환 타입만 다른 것은 오버로딩이 아님
public int add(int a, int b) { ... }
public double add(int a, int b) { ... }  // 컴파일 오류!

static 메서드

static 메서드란?

static 메서드는 객체를 생성하지 않고도 호출할 수 있는 메서드입니다. 클래스에 속한 메서드로, 클래스명으로 직접 호출합니다.

static 메서드 특징

  1. 객체 생성 불필요: 클래스명.메서드명() 형태로 호출
  2. 클래스에 속함: 객체가 아닌 클래스에 속한 메서드
  3. 인스턴스 변수 접근 불가: static 메서드 내에서는 인스턴스 변수를 사용할 수 없음

static 메서드 정의

public class MathUtils {
    // static 메서드
    public static int add(int a, int b) {
        return a + b;
    }

    public static double calculateCircleArea(double radius) {
        return Math.PI * radius * radius;
    }
}

static 메서드 호출

// 객체 생성 없이 클래스명으로 직접 호출
int result = MathUtils.add(10, 20);
double area = MathUtils.calculateCircleArea(5.0);

// 같은 클래스 내에서는 클래스명 생략 가능
public class MathUtils {
    public static void main(String[] args) {
        int sum = add(10, 20);  // 클래스명 생략 가능
    }
}

static vs 인스턴스 메서드

구분 static 메서드 인스턴스 메서드
호출 방법 클래스명.메서드명() 객체명.메서드명()
객체 생성 불필요 필요
인스턴스 변수 접근 불가 가능
사용 시기 유틸리티 함수, 공통 기능 객체의 상태를 다룰 때

static 메서드 예제

public class StringUtils {
    // 문자열이 비어있는지 확인
    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    // 문자열을 역순으로 변환
    public static String reverse(String str) {
        if (str == null) return null;
        StringBuilder sb = new StringBuilder(str);
        return sb.reverse().toString();
    }

    // 두 문자열을 연결
    public static String concatenate(String str1, String str2) {
        return str1 + str2;
    }
}

// 사용
boolean empty = StringUtils.isEmpty("");  // true
String reversed = StringUtils.reverse("Hello");  // "olleH"

main 메서드

main 메서드는 프로그램의 시작점이며, static 메서드입니다.

public static void main(String[] args) {
    // 프로그램 시작점
    // args는 명령줄 인자를 받는 배열
}

메서드 실습 예제

예제 1: 기본 메서드

public class BasicMethods {
    // 반환값이 없는 메서드
    public void printMessage(String message) {
        System.out.println("메시지: " + message);
    }

    // 반환값이 있는 메서드
    public int square(int number) {
        return number * number;
    }

    public static void main(String[] args) {
        BasicMethods obj = new BasicMethods();
        obj.printMessage("안녕하세요");

        int result = obj.square(5);
        System.out.println("5의 제곱: " + result);
    }
}

예제 2: 계산기 클래스

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

    public int subtract(int a, int b) {
        return a - b;
    }

    public int multiply(int a, int b) {
        return a * b;
    }

    public double divide(int a, int b) {
        if (b == 0) {
            System.out.println("0으로 나눌 수 없습니다!");
            return 0;
        }
        return (double) a / b;
    }
}

예제 3: 배열 처리 메서드

public class ArrayProcessor {
    // 배열의 최댓값 찾기
    public int findMax(int[] numbers) {
        if (numbers.length == 0) {
            return Integer.MIN_VALUE;
        }

        int max = numbers[0];
        for (int num : numbers) {
            if (num > max) {
                max = num;
            }
        }
        return max;
    }

    // 배열의 평균 계산
    public double calculateAverage(int[] numbers) {
        if (numbers.length == 0) {
            return 0.0;
        }

        int sum = 0;
        for (int num : numbers) {
            sum += num;
        }
        return (double) sum / numbers.length;
    }

    // 배열 출력
    public void printArray(int[] numbers) {
        System.out.print("[");
        for (int i = 0; i < numbers.length; i++) {
            System.out.print(numbers[i]);
            if (i < numbers.length - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("]");
    }
}

예제 4: 오버로딩 활용

public class MathOperations {
    // 정수 두 개
    public int add(int a, int b) {
        return a + b;
    }

    // 정수 세 개
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 실수 두 개
    public double add(double a, double b) {
        return a + b;
    }

    // 배열의 합
    public int add(int[] numbers) {
        int sum = 0;
        for (int num : numbers) {
            sum += num;
        }
        return sum;
    }
}

예제 5: static 메서드 유틸리티

public class NumberUtils {
    // 절댓값
    public static int abs(int number) {
        return number < 0 ? -number : number;
    }

    // 최댓값
    public static int max(int a, int b) {
        return a > b ? a : b;
    }

    // 최솟값
    public static int min(int a, int b) {
        return a < b ? a : b;
    }

    // 팩토리얼
    public static long factorial(int n) {
        if (n <= 1) {
            return 1;
        }
        return n * factorial(n - 1);
    }

    // 소수 판별
    public static boolean isPrime(int number) {
        if (number < 2) {
            return false;
        }
        for (int i = 2; i < number; i++) {
            if (number % i == 0) {
                return false;
            }
        }
        return true;
    }
}

예제 6: 문자열 처리 메서드

public class StringProcessor {
    // 문자열을 역순으로 변환
    public static String reverse(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        StringBuilder sb = new StringBuilder(str);
        return sb.reverse().toString();
    }

    // 단어 개수 세기
    public static int countWords(String sentence) {
        if (sentence == null || sentence.trim().isEmpty()) {
            return 0;
        }
        String[] words = sentence.trim().split("\\s+");
        return words.length;
    }

    // 회문(palindrome) 확인
    public static boolean isPalindrome(String str) {
        if (str == null) {
            return false;
        }
        String reversed = reverse(str.toLowerCase());
        return str.toLowerCase().equals(reversed);
    }
}

메서드 작성 시 주의사항

1. 메서드명은 동사로 시작

// 좋은 예
calculateSum()
getUserName()
isValid()

// 나쁜 예
sum()        // 명사
userName()   // 명사
valid()      // 형용사

2. 하나의 메서드는 하나의 기능만

// 나쁜 예: 여러 기능을 한 메서드에
public void processData(int[] data) {
    // 합계 계산
    // 평균 계산
    // 최댓값 찾기
    // 출력
}

// 좋은 예: 기능별로 분리
public int calculateSum(int[] data) { ... }
public double calculateAverage(int[] data) { ... }
public int findMax(int[] data) { ... }

3. 매개변수는 적절한 개수로

매개변수가 너무 많으면 메서드 호출이 복잡해집니다. (일반적으로 3~4개 이하 권장)

4. 반환값은 명확하게

// 좋은 예
public int add(int a, int b) {
    return a + b;
}

// 나쁜 예: 반환값이 불명확
public int process(int a, int b) {
    // 복잡한 로직...
    return someValue;  // 무엇을 반환하는지 불명확
}

연습 문제

  1. 기본 메서드

    • 두 정수를 받아서 더한 값을 반환하는 메서드를 작성하세요.
  2. 반환값이 없는 메서드

    • 이름을 받아서 인사말을 출력하는 메서드를 작성하세요.
  3. 배열 처리 메서드

    • 정수 배열을 받아서 최댓값을 반환하는 메서드를 작성하세요.
  4. 메서드 오버로딩

    • 정수 두 개, 세 개, 배열을 받아서 합계를 계산하는 오버로딩된 메서드들을 작성하세요.
  5. static 메서드

    • 원의 넓이를 계산하는 static 메서드를 작성하세요.
  6. 복합 예제

    • 학생 점수 배열을 받아서 평균, 최댓값, 최솟값을 계산하는 메서드들을 작성하세요.

다음 장 예고

다음 장에서는 클래스(Class)와 객체(Object)에 대해 학습하여 객체지향 프로그래밍의 기초를 다집니다.

'BackEnd > Java' 카테고리의 다른 글

# 8장. 객체지향 핵심 개념  (0) 2026.01.01
7장. 객체지향 프로그래밍(OOP) 기초  (0) 2026.01.01
5장. 배열과 문자열  (0) 2025.12.30
4장. 제어문  (0) 2025.12.30
3장. 연산자  (0) 2025.12.29