1. 메소드
메소드는 객체의 동작에 해당하는 구성 멤버이다.
메소드는 다음과 같은 요소들도 구성된다.
- 리턴 타입: 메소드 실행 후 리턴하는 결과의 타입을 명시한다.
- 메소드 이름: 메소드의 이름이다. 메소드의 기능을 잘 표현하고, 식별자 규칙에 따라 명시한다.
- 매개변수 선언: 메소드를 실행할 때 외부로부터 데이터를 받아올 매개변수를 선언한다.
- 메소드 실행 블록: 메소드를 호출했을 때 실행될 과정들을 작성한다.
- 리턴타입 메소드 이름(매개변수 선언, ... , 매개변수 선언) { 메소드 실행블록 }
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("전원을 끕니다.");
}
}
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); //byte는 int로 자동변환 가능하기 때문에, 컴파일 에러가 발생하지 않는다.
System.out.println("result2: " + result2);
myCalc.powerOff();
}
}
2. 매개변수의 개수를 모를 경우
어떤 상황에서는 매개변수의 개수를 알 수 없는 경우가 있다.
이럴 때 해결책은 매개변수를 배열타입으로 선언하는 것이다.
아래와 같이 메소드의 매개변수를 int[] values로 선언할 경우,
int[] 타입 변수를 생성한 뒤 매개변수로 사용할 수도 있고,
메소드 호출과 동시에 int[] 목록을 생성하여 사용할 수도 있다.
- int sum1(int[] values) { };
- int[] values = {1, 2, 3};
- int result = sum1(values);
- int result = sum1(new int[] {1, 2, 3,});
더 편한방법이 있는데, 매개변수를 ... 으로 선언하는 것이다.
이럴 경우, 메소드 호출 때 전달해준 값의 개수에 따라 자동으로 배열이 생성되어 매개값으로 사용된다.
그리고 ...으로 매개변수를 선언하면, 위의 경우처럼 직접 배열타입 변수를 생성하여 매개변수로 전달할 수 있다.
- int sum2(int ... values);
- int result = sum2(1, 2, 3);
- int result = sum2(values);
- int result = sum2(new int[] {1, 2, 3});
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);
int result5 = myCom.sum2(values1);
System.out.println("result5: " + result5);
int result6 = myCom.sum2(new int[] {1, 2, 3, 4, 5});
System.out.println("result6: " + result6);
}
}
3. 리턴문
메소드 선언에 리턴타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해줘야한다.
리턴문의 리턴값은 리턴타입과 동일하거나, 리턴타입으로 변환될 수 있어야한다.
리턴값이 없는 메소드는 리턴타입으로 void를 사용한다.
void를 사용하는 메소드는 리턴문을 사용할 필요는 없지만, 사용할 수도 있다.
이런 경우, 리턴문은 메소드 실행을 종료하는 역할을 한다.
public class Car {
//필드
int gas;
//생성자
//메소드
void setGas(int gas) {
this.gas = gas;
}
boolean isLeftGas() {
if(gas == 0) {
System.out.println("gas가 없습니다.");
return false;
}
System.out.println("gas가 있습니다.");
return true;
}
void run() {
while(true) {
if(gas > 0) {
System.out.println("달립니다.(gas잔량:" + gas + ")");
gas -= 1;
} else {
System.out.println("멈춥니다.(gas잔량:" + gas + ")");
return;
}
}
}
}
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.setGas(5);
boolean gasState = myCar.isLeftGas();
if(gasState) {
System.out.println("출발합니다.");
myCar.run();
}
if(myCar.isLeftGas()) {
System.out.println("gas를 주입할 필요가 없습니다.");
} else {
System.out.println("gas를 주입하세요.");
}
}
}
4. 메소드 호출
메소드 호출도 필드와 마찬가지로 클래스 내부, 클래스 외부에서 사용될 때 사용 방법이 다르다.
클래스 내부에서 호출할 때는 메소드명을 통해 호출할 수 있으며,
클래스 외부에서 호출할 때는 객체를 먼저 생성한되 객체.메소드명 으로 호출한다.
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);
double result = sum / 2;
return result;
}
void execute() {
double result = avg(7, 10);
println("실행결과: " + result);
}
void println(String message) {
System.out.println(message);
}
}
public class CalculatorExample {
public static void main(String[] args) {
Calculator myCalc = new Calculator();
myCalc.execute();
}
}
5. 메소드 오버로딩
생성자 오버로딩과 마찬가지로 메소드에도 오버로딩이 존재한다.
메소드에 대해서도 외부에서 주어지는 데이터의 형태가 다양할 것이며,
그 다양한 데이터 형태를 처리하기 위한 다양한 메소드가 필요하기 때문이다.
생성자 오버로딩과 마찬가지로 매개변수의 타입, 개수, 순서를 달리하여 메소드 오버로딩을 할 수 있으며,
매개변수 타입, 개수, 순서가 동일하고 매개변수 이름이 다르다면, 그것은 오버로딩이 아니다.
추가적으로 매개변수 타입, 개수, 순서가 동일하고 리턴타입만 다르다면, 그것도 오버로딩이 아니다.
public class Calculator {
//정사각형의 넓이
double areaRectangle(double width) {
return width * width;
}
//직사각형의 넓이
double areaRectangle(double width, double height) {
return width * height;
}
}
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 > Java' 카테고리의 다른 글
클래스_패키지와 접근 제한자 (0) | 2022.02.14 |
---|---|
클래스_인스턴스 멤버와 정적멤버 (0) | 2021.11.28 |
클래스_생성자 (0) | 2021.11.14 |
클래스_필드 (0) | 2021.11.14 |
클래스_객체 지향 프로그래밍 (0) | 2021.11.12 |