(1) 반환 부분(= return)
: 리턴이 없다면 리턴타입에 void를 사용한다.
: 메서드는 실행할 때 return문을 만나면 그대로 종료하게 되는데 void 타입일 때 'return;' 이렇게 return문을 사용하면 원하는 지점에서 메서드를 종료할 수 있다. 메서드의 output부분이다.
(2) 매개변수
: 메서드를 호출할 때 메서드로 전달하려는 값을 받아내기 위한 변수이다.
: input부분이다. 2개의 값을 전달하기 위해서는 (type 변수명, type 변수명) 순서와 타입에 맞춰 값을 넣어주면 된다. 전달하려는 값이 없다면 생략 가능하다.
: 아래의 형태처럼 '...' 을 이용하여 가변길이 변수도 선언할 수 있다. 그러면 carSpeeds(100, 80); carSpeeds(110, 120, 150); 처럼 매개값을 ,(반점)으로 구분하여 개수 상관없이 전달 가능하다.
: 메서드이름 ( 매개변수 ); 형식으로 호출한다.
: 메서드를 호출한다 라는 의미는 메서드의 블록 내부에 작성된 코드를 실행한다는 의미
: 필드와 마찬가지로 객체를 만들고 난 후 도트연산자 등 을 통해서 사용할 수 있다.
(1) class에서 gasPedal 에 2개의 매개변수(double kmh, char type)를 입력 받도록 했다(우측 1번째 그림). 결과로 객체에서 gasPedal의 매개변수로 kmh와 type을 input해야 호출할 수 있다. 값은 "speed = 100.0" 이고 ChangeGear는 해당부분 sout에서 "D"로 나왔다.
(2) 다음으로 class에서 가변길이 매개변수를 선언했다. 그 결과 객체에서 입력값 개수 제한없이 전달 할 수 있게되었다.
(3) 혹시 같이 사용할 수는 없는가 싶어서 가변길이 매개변수를 사용하는 새로운 메서드 'Gears'를 만들고 실험해보았다.
결과값은 이렇게 나왔다. G = D / G = A / G = V / G = C / speed = 100.0 / car gear = /
같이 사용할 수 있다는 점을 확있했고 역시나 새로운 메서드를 만들었기에 기존의 gears에는 초기값인 공란이 출력되는 모습이다.
: 함수가 하나의 기능만 구현하는 것이 아니라 하나의 메서드 이름으로 여러 기능을 구현하도록 하는 기능
: 한 클래스 내에 이미 사용하는 같은 이름의 메서드가 있더라도, 매개변수의 개수, 타입, 순서가 다르면 동일한 이름을 사용해 메서드를 정의할 수 있다.
예시 (매개 변수가 다 다르다.)
public void println(boolean x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(char x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
public void println(int x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
: 메서드의 이름이 같고, 매개변수의 개수 or 타입 or 순서가 달라야한다. 모두 다를 필요없다.
: '응답 값만' 다른 것은 오버로딩을 할 수 없다.
: 접근 제어자만 다른 것도 오버로딩 할 수 없다.
: 메서드 이름 하나로 상황에 따른 동작을 개별로 정의할 수 있다.
ㄱ. 기본형 매개변수
: 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않는다. 즉, 읽기만 가능하다.
ㄴ. 참조형 매개변수
: 값이 저장된 원본 주소를 알 수 있기에 값을 읽고 변경할 수 있다. 즉 읽고 변경할 수 있다.