<메소드 선언>
메소드 선언은 선언부와 실행 블록으로 구성되며, 선언부를 메소드 시그니처(signature)라고 한다.
▶리턴 타입
리턴타입 : 리턴 값의 타입을 말하며, 리턴 값이란 메소드를 실행한 후의 결과값을 말함.
메소드는 리턴값이 있을 수도 있고 없을 수도 있으나 리턴 값이 있을 경우 리턴 타입이 선언부에 명시되어야 함.
▶메소드 이름
메소드 이름은 자바 식별자 규칙에 맞게 작성하면 되는데, 다음 사항에 주의해야 함.
- 숫자로 시작하면 안 되고, $와 _를 제외한 특수 문자를 사용하지 말아야 한다.
- 관례적으로 메소드 이름은 소문자로 작성한다.
- 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성한다.
//메소드이름예제
void run() { ... }
void startEngine() { ... }
String getName() { ... }
int[] getScores() { ... }
▶매개 변수 선언
매개 변수는 메소드가 실행할 대 필요한 데이터를 외부로부터 받기 위해 사용함
그렇기 때문에 메소드에서 매개 변수가 필요한 경우가 있고 필요 없는 경우가 있음
//예제 : 계산기
public class Calculator {
//메소드
void powerOn() {
System.out.println("전원을 켭니다.");
}
int plus(int x, int y) {
int result = x + y;
return result;
}
double divide(int x, int y) {
double result = (double)x / (double)y;
return result;
}
void powerOff() {
System.out.println("전원을 끕니다");
}
}
위의 예제에서 powerOn()메소드와 powerOff()메소드는 매개변수가 필요하지 않으므로 지정해주지 않았다.
plus()메소드와 divide()메소드는 계산해야하는 값 2개가 필요하므로 매개 변수를 2개를 받아서 계산하는 모습을 확인할 수 있다.
public class CalculatorExample {
public static void main(String[] args) {
Calculator myCalc = new Calculator();
myCalc.powerOn();
int result1 = myCalc.plus(5, 6);
System.out.println("result1: " + result1);
byte x = 10;
byte y = 4;
double result2 = myCalc.divide(x, y);
System.out.println("result2: " + result2);
myCalc.powerOff();
}
}
외부 클래스에서 Calculator 클래스의 메소드를 호출하기 위해서는 Calculator 객체를 생성하고 참조 변수인 myCalc를 이용해야 한다. myCalc 변수에 도트연산자와 함께 메소드 이름(매개값,...)을 호출하면 메소드 블록이 실행된다.
결과:
▶ 매개 변수의 개수를 모를 경우
해결책 : 매개 변수를 배열 타입으로 선언
//ex: 여러 개의 수를 모두 합산하는 메소드를 선언할 경우
//방법 1
int sum1(int[] values) { }
//방법 2
int sum2(int ... values) { }
...로 선언하게 되면 메소드 호출 시 넘겨준 값의 수에 따라 자돈으로 배열이 생성되고 매개값으로 사용된다.
//예제: 매개 변수의 개수를 모를 경우
public class Computer {
int sum1(int[] values) {
int sum = 0;
for(int i=0; i<values.length; i++) {
sum += values[i];
}
return sum;
}
int sum2(int ... values) {
int sum = 0;
for(int i=0; i<values.length; i++) {
sum += values[i];
}
return sum;
}
}
public class ComputerExample {
public static void main(String[] args) {
Computer myCom = new Computer();
int[] values1 = {1, 2, 3};
int result1 = myCom.sum1(values1);
System.out.println("result1: " + result1);
int result2 = myCom.sum1(new int[] {1, 2, 3, 4, 5});
System.out.println("result2: " + result2);
int result3 = myCom.sum2(1, 2, 3);
System.out.println("result3: " + result3);
int result4 = myCom.sum2(1, 2, 3, 4, 5);
System.out.println("result4: " + result4);
}
}
결과 :
sum1()과 sum2() 메소드의 실행문의 결과가 완전 일치하는 것을 볼 수 있다. 이는 매개 변수의 선언 방법만 다를 뿐 매개 변수의 타입이 같은 배열이므로 처리 내용이 같을 수밖에 없음을 보여준다.
<리턴(return)문>
▶리턴값이 있는 메소드
메소드 선언에 리턴 타입이 잇는 메소드는 반드시 리턴(return)문을 사용해서 리턴값을 지정해야 한다.
만약 return문이 없다면 컴파일 에러가 발생하고, return문이 실행되면 메소드는 즉시 종료된다.
//return문
return 리턴값;
return문의 리턴값은 리턴 타입이거나 리턴 타입으로 변환될 수 있어야 함.
ex) int일 경우 : byte, short, int
//예제:int형
int plus(int x, int y){
int result = x + y;
return result;
}
//byte형도 가능
int plus(int x, int y){
byte result =(byte) (x + y);
return result;
}
▶리턴값이 없는 메소드:void
리턴값이 없는 메소드는 리턴 타입으로 void를 사용하지만 return문을 사용할 수 있음(메소드 강제 종료 시키는 역할)
//void return문
return;
<메소드 호출>
메소드는 클래스 내부 또는 외부의 호출에 의해 실행
내부 : 단순한 메소드 이름으로 호출
외부 : 클래스로부터 객체를 생성한 뒤 참조 변수를 이용해서 메소드를 호출
▶객체 내부에서 호출
//클래스 내부에서 메소드 호출 방법
//매개 변수의 타입과 수에 맞게 매개값 제공
메소드(매개값, ...);
//ex:: mothod2()에서 mothod1()호출
public class ClassName{
void method1(String p1, int p2){
//p1에 홍길동 대입, p2에 100 대입
//대입된 p1과 p2를 활용
}
void method2(){
method1("홍길동",100);
}
}
메소드가 리턴값이 없거나, 있어도 받고 싶지 않을 경우 모두 호출이 가능함.
리턴값이 있는 메소드를 호출하고 리턴값을 받고 싶다면 변수를 선언하고 리턴값을 대입
타입 변수 = 메소드(매개값, ...);
//method2()에서 method1()을 호출하여 결과값 저장
public class ClassName{
int method1(int x, int y){
int result = x + y;
return result;
}
void method2(){
int result1 = mothod(10,20); // 30저장
double result2 = method1(10,20); // 30.0저장
}
}
▶객체 외부에서 호출
외부 클래스에서 메소드를 호출하려면 클래스로부터 객체를 생성해야 함
(메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문!)
//객체 생성 방법
클래스 참조변수 = new 클래스(매개값, ...);
객체 생성이 완료되었다면 참조 변수와 함께 도트연산자를 사용해서 메소드를 호출할 수 있음
참조변수.메소드(매개값, ...); //리턴값이 없거나, 있어도 리턴값을 받지 않을 경우
타입 변수 = 참조변수.메소드(매개값, ...); //리턴값이 있고, 리턴값을 받고 싶을 경우
public class Car {
//필드
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)");
}
}
}
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.keyTurnOn();
myCar.run();
int speed = myCar.getSpeed();
System.out.println("현재 속도: " + speed + "km/h");
}
}
결과 :
keyTurnOn()과 run() 메소드는 리턴값이 없기 때문에 단순 호출만 했고, getSpeed()메소드는 리턴값이 있으므로 리턴값을 받아 변수 speed에 저장하여 사용함
<메소드 오버로딩>
메소드 오버로딩(overloading) : 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
오버로딩의 사전적 의미는 많이 싣는 것을 의미하며, 이를 통해 하나의 메소드 이름으로 여러 기능을 담는다 하여 붙여진 이름이라는 것을 추측할 수 있다.
메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다는 점이다.
메소드 오버로딩이 필요한 이유 : 매개값을 다양하게 받아 처리할 수 있도록 하기 위해서
메소드 오버로딩의 가장 대표적인 예는 System.out.println()메소드이다.
만약, println() 메소드가 하나의 타입만 출력할 수 있도록 되어있다면?
상상할 수 없을 것이다....
그래서 println()메소드는 호출할 때 주어진 매개값의 타입에 따라서 다음과 같이 오버로딩된 println() 메소드 중 하나를 호출한다.
void println() {...}
void println(boolean x) {...}
void println(char x) {...}
void println(char[] x) {...}
void println(double x) {...}
void println(float x) {...}
void println(int x) {...}
void println(long x) {...}
void println(Object x) {...}
void println(String x) {...}
//사각형 넓이를 구하는 메소드 오버로딩 예제
public class Calculator {
//정사각형의 넓이
double areaRectangle(double width) {
return width * width;
}
//직사각형의 넓이
double areaRectangle(double width, double height) {
return width * height;
}
}
매개값이 1개이면 정사각형의 넓이를 계산하고, 매개값이 2개이면 직사각형의 넓이를 계산하여 리턴한다.
public class CalculatorExample {
public static void main(String[] args) {
Calculator myCalcu = new Calculator();
//정사각형의 넓이 구하기
double result1 = myCalcu.areaRectangle(10);
//직사각형의 넓이 구하기
double result2 = myCalcu.areaRectangle(10, 20);
//결과 출력
System.out.println("정사각형 넓이=" + result1);
System.out.println("직사각형 넓이=" + result2);
}
}
결과 :
'프로그래밍언어 > Java' 카테고리의 다른 글
06-6 패키지와 접근 제한자 (0) | 2021.02.23 |
---|---|
06-5 인스턴스 멤버와 정적 멤버 (0) | 2021.02.17 |
06-3. 생성자 (0) | 2021.02.08 |
06-2. 필드 (0) | 2021.01.26 |
06-1. 객체 지향 프로그래밍 (1) | 2021.01.25 |