6장. 메서드(Method)
메서드의 개념
메서드란?
메서드(Method)는 특정 작업을 수행하는 코드 블록입니다. 메서드를 사용하면 코드를 재사용하고, 프로그램을 구조화하며, 유지보수를 쉽게 할 수 있습니다.
메서드의 장점
- 코드 재사용: 같은 코드를 여러 번 작성하지 않고 메서드를 호출하여 사용
- 모듈화: 프로그램을 작은 단위로 나누어 관리
- 가독성 향상: 메서드 이름으로 기능을 명확히 표현
- 유지보수 용이: 수정이 필요할 때 메서드만 수정하면 됨
- 테스트 용이: 각 메서드를 독립적으로 테스트 가능
메서드의 구조
접근제어자 반환타입 메서드명(매개변수목록) {
// 메서드 본문
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(); // 메서드 호출
메서드명 규칙
- 영문자, 숫자, 언더스코어(_), 달러 기호($) 사용 가능
- 숫자로 시작 불가
- Java 예약어 사용 불가
- 의미 있는 이름 사용 (동사로 시작하는 것이 좋음)
- 카멜 케이스(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는 기본적으로 하나의 값만 반환할 수 있습니다. 여러 값을 반환하려면:
배열 사용
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}; }클래스나 객체 사용 (나중에 학습)
메서드 오버로딩 (Method Overloading)
오버로딩이란?
메서드 오버로딩은 같은 이름의 메서드를 여러 개 정의하는 것입니다. 매개변수의 개수나 타입이 달라야 합니다.
오버로딩의 조건
- 메서드 이름이 같아야 함
- 매개변수의 개수 또는 타입이 달라야 함
- 반환 타입은 오버로딩과 무관 (반환 타입만 다른 것은 오버로딩이 아님)
오버로딩 예제
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 메서드 특징
- 객체 생성 불필요:
클래스명.메서드명()형태로 호출 - 클래스에 속함: 객체가 아닌 클래스에 속한 메서드
- 인스턴스 변수 접근 불가: 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; // 무엇을 반환하는지 불명확
}
연습 문제
기본 메서드
- 두 정수를 받아서 더한 값을 반환하는 메서드를 작성하세요.
반환값이 없는 메서드
- 이름을 받아서 인사말을 출력하는 메서드를 작성하세요.
배열 처리 메서드
- 정수 배열을 받아서 최댓값을 반환하는 메서드를 작성하세요.
메서드 오버로딩
- 정수 두 개, 세 개, 배열을 받아서 합계를 계산하는 오버로딩된 메서드들을 작성하세요.
static 메서드
- 원의 넓이를 계산하는 static 메서드를 작성하세요.
복합 예제
- 학생 점수 배열을 받아서 평균, 최댓값, 최솟값을 계산하는 메서드들을 작성하세요.
다음 장 예고
다음 장에서는 클래스(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 |