1. 메서드
- 아래 코드는 1+2와 10+20에 대한 단순한 계산
- 하지만, 이 코드는 하나하나씩 수작업을 해야함. 그래서 함수. 즉, 메서드 사용해야 함.
package method;
public class Method1 {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a + "+" + b + " 연산 수행");
int sum1 = a + b;
System.out.println("결과1 출력: " + sum1);
int x = 10;
int y = 20;
System.out.println(x + "+" + y + " 연산 수행");
int sum2 = x+y;
System.out.println("결과2 출력: " + sum2);
}
}
1) 메서드 사용
package method;
public class Method1Ref {
public static void main(String[] args) {
int sum1 = add(5,10);
System.out.println("결과1 출력: " + sum1);
int sum2 = add(15,20);
System.out.println("결과2 출력: " + sum2);
}
public static int add(int a, int b) {
System.out.println(a + "+" + b + " 연산 수행");
int sum = a+b;
return sum;
}
}
(1) 메서드 정의
1) 메서드 선언
public static int add(int a, int b)
- 메서드의 선언부분.
- 메서드 이름(add), 반환타입(int), 매개변수(파라미터) 목록 포함
- public: 접근제어자이면서 다른 클래스를 호출할 수 있는 메서드
- static: 객체를 생성하지 않고 호출할 수 있는 정적 메서드
2) 메서드 본문
System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum;
- 메서드가 수행해야 하는 코드 블록
- 메서드를 호출하는 곳에서는 메서드 선언은 알지만 본문은 모른다.
- return sum은 sum 변수에 들어있는 값을 반환
3) 메서드 호출
int sum1 = add(5,10);
int sum2 = add(15,20);
(2) 메서드 호출과 용어 정리
- 메서드를 호출할 때 메서드에 넘기는 값과 매개변수(파라미터) 타입이 맞아야 한다. --> 이런 작업들이 나중에 오류발생 가능성 높음.
호출: call("hello", 20)
메서드 정의: int call(String str, int age)
1) 인수(Argument)
- "hello", 20 처럼 넘기는 값
- 실무에서는 아규먼트, 인수, 인자라는 용어 모두 사용
2) 매개변수(Parameter)
- 메서드를 정의할때 선언한 변수인 String str, int age를 매개변수, 파라미터라고 한다.
- 호출할때 인수를 넘기면 매개변수에 대입
- 실무에서는 매개변수, 파라미터 용어 모두 사용
2) 메서드 정의
public static int add(int a, int b) {
}
제어자 반환타입 메서드 이름(매개변수 목록) {
메서드 본문
}
- 제어자: public, static과 같은 부분.
- 반환타입: 메서드가 실행된 후 반환되는 데이터 타입. 메서드 값을 반환히자 않는 경우는 void 사용
(1) 매개변수가 없거나 반환 타입이 없는 경우
package method;
public class Method2 {
public static void main(String[] args) {
printHeader();
System.out.println("프로그램이 동작합니다.");
printFooter();
}
public static void printHeader() {
System.out.println("= 프로그램을 시작합니다 =");
return;
}
public static void printFooter() {
System.out.println("= 프로그램을 종료합니다 =");
}
}
- 매개변수가 없을 경우
- 선언: public static void printHeader()와 같이 매개변수 비워두고 정의
- 호출: printHeader() 와 같이 인수를 비워두고 호출
- 반환타입이 없을 경우
- 선언: public static void printHeader()와 같이 반환타입을 void로 정의
- 호출: printHeader(); 반환타입이 없으므로 메서드만 호출. 반환값 받지않음.
* 주의 *
메서드 본문에 String str = printHeader() 라는 반환타입을 주게 되면
컴파일 오류 발생
(2) void와 return 생략
- 모든 메서드는 항상 return 호출.
- 하지만 반환타입이 void인 경우 예외로 printHeader()와 같이 생략 가능
- 자바에 반환 타입이 없는 경우에는 return을 마지막 줄에 넣어줌
- return을 만나면 해당 메서드 종료
3) 반환 타입
- 반환 타입이 있는 메서드는 반드시 return을 이용해서 값을 반환
package method;
public class MethodReturn1 {
public static void main(String[] args) {
boolean result = odd(2);
System.out.println(result);
}
public static boolean odd(int i) {
if(i % 2 == 1) {
return true;
} else {
return false;
}
}
}
(1) return문을 만나면 즉시 메서드 빠져나가는 방식
package method;
public class MethodReturn2 {
public static void main(String[] args) {
checkAge(10);
checkAge(20);
}
public static void checkAge(int age) {
if(age < 18) {
System.out.println(age + "살, 미성년자는 출입이 불가능합니다.");
return;
}
System.out.println(age + "살, 입장하세요");
}
}
- if문 조건에 해당하면 미성년자는 출입 불가능을 출력하고 return문 수행
- 조건에 해당되지 않으면 입장하세요 출력
(2) 반환 값 무시
- 반환타입이 있는 메서드를 호출해도 반환 값이 필요하다면 사용x
- 예시
int sum = add(1,2)
add(1,2)
4) 메서드 호출과 값 전달1
(1) 변수와 값 복사
package method;
public class MethodValue0 {
public static void main(String[] args) {
int num1 = 5;
int num2 = num1;
num2 = 10;
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
- num1의 5가 num2 변수로 이동
- 새로 변경된 num2값에 10을 대입. 즉, num1= 5, num2=10
(2) 메서드 호출과 값 복사
package method;
public class MethodValue1 {
public static void main(String[] args) {
int num1 = 5;
System.out.println("1. changeNumber 호출 전, num1: " + num1);
changeNumber(num1);
System.out.println("4. changeNumber 호출 후, num1: " + num1);
}
public static void changeNumber(int num2) {
System.out.println("2. changeNumber 변경 전, num2: " + num2);
num2 = num2 * 2;
System.out.println("3. ChangeNumber 변경 후, num2: " + num2);
}
}
1. int num1 = 5
2. changeNumber 메서드에 매개변수 목록에 int num2라고 적혀있다.
3. changeNumber(num1) 이라는 것은 매개변수 목록인
int num2에 num1을 대입한다는 것
4. 즉, num2는 5가 되고 2를 곱하였더니 10임.
5) 메서드 호출과 값 전달2
(1) 메서드 호출과 이름이 같은 변수
package method;
public class MethodValue2 {
public static void main(String[] args) {
int number = 5;
System.out.println("1. changeNumber 호출 전, number: " + number);
changeNumber(number);
System.out.println("4. changeNumber 호출 후, number: " + number);
}
public static void changeNumber(int number) {
System.out.println("2. changeNumber 변경 전, number: " + number);
number = number * 2;
System.out.println("3. ChangeNumber 변경 후, number: " + number);
}
}
- main 메서드의 number 변수와 changeNumber 메서드의 number 변수는 이름만 같지 그 안의 변수의 저장소는 다르다.
- 그래서 호출했을때 number값은 10이 아닌 5가 호출.
(2) 메서드 호출과 값 반환받기
- 값을 반환하려면 다음과 같은 코드를 작성한다.
package method;
public class MethodValue3 {
public static void main(String[] args) {
int num1 = 5;
System.out.println("1. changeNumber 호출 전, num1: " + num1);
num1 = changeNumber(num1);
System.out.println("4. changeNumber 호출 후, num1: " + num1);
}
public static int changeNumber(int num2) {
num2 = num2 * 2;
return num2;
}
}
- 즉, 두번째 changeNumber 메서드에 void를 선언하지 않고 반환 타입을 작성하면 main 메서드에서 받아온 파라미터 정보를 num2에 2를 곱한 정보를 리턴.
- 그리고, 메인 메서드에 changeNumber(num1)값을 메인 메서드 num1에 대입
- 그렇게하면, 메인 메서드의 num1은 10이 호출된다.
- 중요
자바는 항상 변수의 값을 복사해서 대입하자!
6) 메서드와 형변환
(1) 명시적 형변환
package method;
public class MethodCasting1 {
public static void main(String[] args) {
double number = 1.5;
printNumber((int) number);
}
public static void printNumber(int n) {
System.out.println("숫자: " + n);
}
}
(2) 자동 형변환
package method;
public class MethodCasting2 {
public static void main(String[] args) {
int number = 100;
printNumber(number);
}
public static void printNumber(double n) {
System.out.println("숫자: " + n);
}
}
정리
- 메서드를 호출할 때 전달하는 인수의 타입과 매개변수 타입이 일치해야함
7) 메서드 오버로딩
- 메서드 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 오버로딩이라고 한다.
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)
(1) 오버로딩 규칙
- 메서드 이름이 같아도 매개변수 타입 및 순서가 다르면 오버로딩 가능
- 단, 반환 타입은 인정하지 않음
int add(int a, int b)
double add(int a, int b)
* 용어 정리 *
메서드 시그니처(Method Signature)
메서드 시그니처 = 메서드 이름 + 매개변수 타입(순서)
- 자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 뜻함.
- 즉, 메서드를 구분할 수 있는 기준
- 메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주함
정리
- 본인의 타입에 맞는 최대한 맞는 메서드를 찾아 실행
- 그래도 없다면 형 변환 가능한 타입의 메서드 실행
총 정리
1. 변수명 vs 메서드명
- 변수 이름은 일반적으로 명사로 씀. (Customer)
- 메서드 이름은 동사로 시작함. (addCustomer)
2. 메서드 사용 장단점
- 코드 재사용: 메서드는 특정 기능 캡슐화 가능. 필요할때마다 호출가능
- 코드의 가독성: 이름이 부여된 메서드는 코드가 수행하는 작업 명확하게 나타남
- 모듈성: 큰 프로그램을 작은, 관리 가능한 부분으로 나눌 수 있음.
- 코드유지관리: 메서드를 사용하면 해당 메서드에서만 수정을 할 수 있음.
- 재사용성과 확장성: 잘 설계된 메서드는 다른 프로그램이나 프로젝트에서도 재사용 가능
그리고, 새로운 기능을 추가하거나 기존 기능 확장가능
- 추상화: 메서드를 사용하는 곳에서는 메서드 구현 몰라도됨.
- 테스트와 디버깅 용이성: 개별 메서드는 독립적으로 테스트하고 디버그 가능