메서드란?
특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.
메서드는 작업을 수행하는데 필요한 값만 넣고 원하는 결과를 얻으면 될 뿐, 내부적으로 어떤 과정을 거쳐 결과를 만들어내는지 전혀 몰라도 된다. 이를 내부가 보이지 않는 '블랙박스(black box)'라고도 한다.
메서드는 크게 '선언부(header, 머리)' 와 '구현부(body, 몸통)'으로 이루어져 있다.
메서드 선언부(method declaration, method header)
작업을 수행하기 위해서 어떤 값들을 필요로 하고, 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공한다.
메서드의 선언부를 변경하게 되면, 그 메서드를 호출하는 모든 곳도 같이 변경해야되기 때문에 변경사항이 발생하지 않도록 신중히 작성해야 한다.
매개변수 선언(parameter declaration)
매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 것이다.
두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다.
개수의 제한은 없지만 입력해야할 값의 개수가 많은 경우에는 배열이나 참조변수(사용자정의 타입)를 사용하는게 좋다.
메서드의 이름(method name)
메서드의 이름은 변수의 명명규칙대로 작성하면 된다.
메서드의 기능을 쉽게 알 수 있도록 함축적이면서도 의미있는 이름을 지어야 한다.
반환타입(return type)
메서드의 작업 수행 결과(출력)인 반환값의 타입을 선언한다.
반환값이 없는 경우 void(아무것도 없음)를 사용한다.
메서드의 구현부(method body, 메서드 몸통)
메서드의 선언부 다음 오는 괄호{}를 메서드의 구현부라고 한다.
메서드를 호출했을 때 수행될 문장들을 넣는다.
return 문
메서드의 반환타입이 void가 아닌경우, 구현부 괄호{}안에 'return 반환값'이 반드시 포함되어야 한다.
이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
반환값은 최대 하나만 허용한다.
반환타입 메서드이름 (매개변수) { // 선언부(header, 머리)
메서드 호술 시 수행할 코드 // 구현부(body, 몸통)
}
int add(int a, int b) {
int result = a + b;
return result; // return 문
}
메서드를 사용하는 이유
높은 재사용성(reusability)
- 한번 만들어 놓은 메서드는 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용이 가능하다.
중복된 코드의 제거
- 같은 내용의 문장들이 여러 곳에 반복해서 나타나는데 이것을 묶어서 하나의 메서드로 작성할 수 있다.
- 그러면 전체 소스 코드의 길이도 짧아지고 수정해야할 코드의 양도 줄어들어 오류가 발생할 가능성도 줄어든다.
프로그램의 구조화
- 큰 규모의 프로그램에서는 문장들을 작업단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단수화 시키는 것이 필수적이다.
- 작업단위로 나누게 되면 코드가 짧아지고 간단해 진다.
메서드의 호출
메서드를 정의했어도, 메서드를 호출하여야 구현부{}의 문장들이 수행된다.
인자(argument)와 매개변수(parameter)
메서드를 호출할 때 괄호()안에 지정해준 값을 인자(argument) 또는 인수라고 한다.
인자의 개수와 순서, 타입은 메서드의 매개변수와 일치해야 한다.(적어도 자동 형변환이 가능해야 한다.)
반환타입이 void가 아닌 경우, 메서드 호출 후 반환값을 변수에 저장하지 않아도 문제가 되지 않는다.
메서드이름(인자1, 인자2 ...); // 메서드 호출
int result = add(1, 2); // 변수에 저장
add(3, 4); // 저장하지 않아도 됨
메서드의 실행 흐름
같은 클래스 내에 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만, static메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.
class MyMath {
int instanceAdd1(int a, int b) {
return a + b;
}
int instanceAdd2(int a, int b) {
// 같은 클래스 내에 인스턴스 메서드를 참조변수를 사용하지 않고 사용할 수 있다.
return instanceAdd1(a, b);
}
static int staticAdd(int a) {
// 에러 발생. static 메소드 안에 같은 클래스의 인스턴스 메서드를 사용할 수 없다.
return instanceAdd1(a, b);
}
}
매개변수의 유효성 검사
메서드를 작성할때 인자가 적절한 값으로 들어온다는 생각을 절대로 가져서는 안된다.
그에 대비한 코드를 작성해 유효성 검사를 해야 한다.
float divide(int x, int y) {
// 작업을 하기 전에 나누는 수(y)가 0인지 확인 - 유효성 검사
if (y == 0) {
System.out.println("0으로 나눌 수 없습니다!");
return 0; // 0 반환, 메서드 종료
}
return x / (float)y;
}
'Java' 카테고리의 다른 글
오버로딩(overloading) (0) | 2021.09.14 |
---|---|
생성자(constructor) (0) | 2021.09.14 |
선언위치에 따른 변수의 종류 (0) | 2021.09.13 |
클래스의 또 다른 정의 (0) | 2021.09.13 |
클래스(Class)와 객체(Object) (0) | 2021.09.13 |