※해당 글은 신용권님의 혼자 공부하는 자바를 참고하며 적은 글입니다.
메소드 호출
메소드 호출은 클래스 내부의 다른 메소드에서 호출하는 경우, 클래스 외부의 메소드에서 호출하는 경우 두 가지로 나뉜다.
클래스 내부에서 다른 메소드를 호출할 경우에는 단순히 메소드 이름으로 호출한다.
클래스 외부의 메소드를 호출 할 때는 우선 클래스로부터 객체를 생성한 뒤 참조 변수를 이용해서 메소드를 호출해야 한다.
(객체가 존재해야 메소드도 존재하기 때문이다.)
객체 내부에서 호출
클래스 내부에서 다른 메소드를 호출할 경우, 단순히 메소드 이름으로 호출할 수 있다.
만약 메소드가 매개 변수를 가지고 있을 때에는 매개 변수의 타입과 수에 맞게 매개 값을 제공한다.
메소드가 리턴 값이 없거나, 있어도 받고 싶지 않을 경우 메소드를 그냥 실행하면 되고,
만약 메소드를 호출하고 리턴 값을 받고 싶다면 변수를 선언하고 리턴 값을 대입할 수 있다.
package chap6;
public class chapter06_4 {
//클래스 내부 메소드 생성
static void method1(String p1, int p2) {
System.out.println(p1 + p2);
}
public static void main(String[] args) {
//클래스 내부 메소드 사용
method1("홍길동", 10);
}
}
이때 변수 타입은 메소드 리턴 타입과 동일하다.
자동 타입 변환이 될 수 있어야 한다는 점에서 주의해야 하는데, 예를 들어 int는 double 타입으로 자동 타입 변환이 가능하기 때문에 int 리턴 값은 double 타입 변수에 대입할 수 있다.
package chap6;
public class chapter06_4 {
// 메소드 타입 자동 변환 예제
static int method2_1(int x, int y) {
return x + y;
}
static void method2_2() {
int result = method2_1(10, 20);
double result2 = method2_1(10,20);
System.out.println(result); //30
System.out.println(result2); //30.0
}
public static void main(String[] args) {
//클래스 내부에서 메소드 호출 예제 (계산기)
method2_2();
}
}
객체 외부에서 호출
외부 클래스에서 메소드를 호출하려면 우선 다음과 같이 클래스로부터 객체를 생성해야 한다.
(메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문이다.)
클래스 참조변수 = new 클래스 ( 매개값1, 매개값2, ...); |
내부에서 메소드를 불러와 사용할 때와 마찬가지로 return값이 없거나, 있어도 해당 값을 받지 않을 경우
참조 변수. 메소드(); 형태로 그냥 사용하면 되며, return값이 있고, 해당 값을 받고 싶을 경우 타입 변수에 대입하여 준다.
//외부 클래스에서 메소드 생성
public class chapter06_4OutsideClassExample {
//필드
int speed;
//생성자
//메소드
int getSpeed() {
return speed;
}
void keyTurnOn() {
System.out.println("키를 돌립니다.");
}
void run() {
for (int i = 10; i <= 50; i+=10) {
speed = i;
System.out.println("달립니다.(시속: " + speed + "km/h)");
}
}
}
//클래스 외부의 메소드 호출 예시
package chap6;
public class chapter06_4 {
public static void main(String[] args) {
//클래스 참조변수 = new 클래스
chapter06_4OutsideClassExample car = new chapter06_4OutsideClassExample();
car.keyTurnOn();
car.run();
int speed = car.getSpeed();
System.out.println("현재 속도: " + speed + "km/h");
}
}
메소드 오버 로딩
클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버 로딩이라고 한다.
메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다는 점이다.
만약 매개 변수의 타입과 개수, 순서가 똑같을 경우 매개 변수 이름이 다르다고 해서 이것을 메소드 오버 로딩이라고 하지 않는다. 또한 리턴 타입만 다르고 매개 변수가 동일하다면 이것도 오버 로딩이 아니다.
package chap6;
public class chapter06_4 {
//메소드 오버로딩 예제
static int plus(int x, int y) {
return x + y;
}
static double plus(double x, double y) {
return x + y;
}
public static void main(String[] args) {
//메소드 오버로딩 예제
int result1 = plus(10, 20);
double result2 = plus(10.5, 20.3);
System.out.println(result1); //30
System.out.println(result2); //30.8
}
}
메소드 오버 로딩이 필요한 이유는 매개 값을 다양하게 받아 처리할 수 있도록 하기 위함이다.
오버 로딩된 메소드를 호출할 경우 JVM은 매개 값의 타입을 보고 메소드를 선택한다.
만약 아래와 같이 매개 변수의 타입이 각각 int와 double로 선언된 메소드가 있을 때 아래와 같이 메소드를 사용하면 어떻게 될까?
package chap6;
public class chapter06_4 {
//메소드 오버로딩 예제
static int plus(int x, int y) {
return x + y;
}
static double plus(double x, double y) {
return x + y;
}
public static void main(String[] args) {
//메소드 오버로딩 예제
System.out.println(plus(10.5, 20)); //??
}
}
앞서 잠깐 말했 듯 JVM은 일차적으로 매개 변수의 타입을 보지만, 매개 변수의 타입이 일치하지 않을 경우 자동 타입 변환이 가능한지 검사한다. 첫 번째 매개 변수인 int는 double 타입으로 변환이 가능하므로 최종적으로 plus(double x, doubley) 메소드가 선택된다. 따라서 출력 값은 30.5가 된다.
읽어주셔서 감사합니다.
'📖혼자공부하는자바' 카테고리의 다른 글
Chapter 07-3 추상 클래스, 추상 메소드 (0) | 2022.12.10 |
---|---|
Chapter 06-6-1 패키지와 접근 제한자 (0) | 2022.12.02 |
Chapter 05-2 배열 (0) | 2022.11.26 |
Chapter 06-1 객체 (0) | 2022.11.22 |
Chapter 05-1 참조 타입과 참조 변수 (0) | 2022.11.21 |