메소드란?
public class Car{
// 필드
int gas;
...
// 메소드
boolean isLeftGas(){
...
}
void run(){
...
}
}
메소드 사용 이유
메소드 선언
접근제한자 리턴타입 메소드이름 ([매개변수 선언, ...]){
실행할 코드
}
public
, protected
, default
, private
가 있으며 메소드를 선언할 때 접근제한자를 생략하면 default
를 갖게된다. void
로 작성한다.매개 변수 선언
byte
는 int
로 자동 타입 변환)...
을 통해 매개 값을 전달할 수 있다. public class Main {
public static void main(String[] args) {
int[] values = {1, 2, 3, 4, 5};
int result = sum1(values);
System.out.println("배열 사용: " + result);
result = sum2(2, 3, 4, 5, 6);
System.out.println("... 사용: " + result);
}
static int sum1(int[] values) {
int sum = 0;
for (int val : values)
sum += val;
return sum;
}
static int sum2(int... values) {
int sum = 0;
for (int val : values)
sum += val;
return sum;
}
}
리턴(return)문
void
를 사용한다.void
로 선언된 메소드에서도 리턴문을 메소드 실행을 강제 종료시키는 역할로 사용할 수 있다.break
를 사용한 것과 같은 효과가 나타난다.메소드 호출
.
)를 통해 호출할 수 있다. public class Calculator{
int plus(int x, int y){
int result = x + y;
return result;
}
double avg(int x, int y){
double sum = plus(x, y); // plus(x, y)는 클래스 내부의 있는 메소드이므로 단순히 메소드 이름으로 부를수 있다.
double result = sum / 2;
return result;
}
}
...
class CalculatorTest{
public static void main(String[] args){
Calculator cal = new Calculator();
double avgResult = cal.avg(6, 4) // avg(x,y)는 현재 클래스 외부에 있으므로 객체를 생성한 후 사용된다.
}
}
메소드 오버로딩 (overloading)
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.test();
m.test(1);
m.test(1, 2.0);
m.test(1.0, 2);
}
void test(){
System.out.println("테스트");
}
void test(int a){
System.out.println(a);
}
void test(int a, double d){
System.out.println(a + " " + d);
}
void test(double d, int a){ // 위 메소드와 매개변수의 순서가 다르기 때문에 ok.
System.out.println(d + " " + a);
}
}
1.
void test(int a, double d){
System.out.println(a + " " + d);
}
/*
오버로딩 된 메서들 중에 매개변수를 int와 double을 사용하는 메서드 한 개만 있다면
호출할 때 m.test(1, 2)와 같이 int 값을 두개 넣어주어도 자동형변환이 되어 메소드가 실행되지만
*/
2.
void test(int a, double d){
System.out.println(a + " " + d);
}
void test(double d, int a){
System.out.println(d + " " + a);
}
/*
위와 같이 데이터 타입이 같고 순서가 다른 두 메서드가 있을 시 m.test(1,2)를 넣어주면
두 메서드 모두 자동 형변환이 되어 둘 다 들어갈 수 있기 때문에 에러 발생.
Ambiguous method call. Both
*/