필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해 다양한 기능을 수행하기도 한다. 메소드는 객체 간의 데이터 전달의 수단으로 사용된다.
외부로부터 매개값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있다.
선언부(리턴타입, 메소드이름, 매개변수선언)와 실행블록으로 구성된다.
메소드 선언부를 시그너처(signature)라고 하기도 한다.
// 메소드 형태
리턴타입 메소드이름 ([매개변수 선언,...]){
실행코드
}
// 생성자 형태
클래스 ([매개변수 선언, ...]) {
객체의 초기화 코드
}
강의
메소드 정의
접근지정자 리턴타입 메소드명(매개변수) {
//동작할 내용
}
메소드는 정의해두었다가 사용할 때 호출해 사용
(호출)
리턴타입 변수명 = 메소드명(매개변수)
메소드가 실행 후 리턴하는 값의 타입을 말한다. 리턴이 없는 경우도 있지만 실행 후 결과를 호출한 곳에 넘겨줄 경우에는 리턴값이 있어야한다.
// 리턴 값이 없는 메소드
void powerOn(){...}
// 불러올때 전해줄 매개변수가 없으니 단순 호출
poserOn();
// 리턴이 있는 메소드
double avg(int x, int y){...}
// 불러올 때 필요한 값을 전해줘야하니
// double result = avg(10, 20);
/* 하지만 리턴타입이 있다고 해서 반드시 리턴값을 변수에 저장할 필요는 x
단순히 메소드 실행만이 중요하다면 변수 선언 없이 메소드 호출도 가능하다 */
avg(10, 20);
주의 사항
1. 숫자로 시작하면 안되고, ($와 _를 제외한) 특수문자 사용 안됨
2. 관례적으로 메소드명은 소문자작성
3. 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자
void run(){ }
void startEngine(){ }
String studentName(){ }
int get_scores(){ }
-매개 변수는 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용된다. 매개 변수가 필요한 경우가 있고 없는 경우도 있다.
-외부 클래스에서 ex.Book 클래스의 메소드를 호출하기 위해서는 Book b = new Book();
으로 Book 객체를 생성하고, 참조변수인 b 변수에 도트( . )와 함께 메소드이름(매개값, ... ) 형태로 호출해야 메소드 블록이 실행된다.
(Book 클래스)
public class Book {
int sum(int x, int y) {
int hap = x + y;
return hap;
}
}
(메소드 호출)
public class Booknum {
public static void main(String[] args) {
Book b = new Book();
int result = b.hap(5,6);
System.out.println(result);
}
}
경우에 따라서는 메소드를 선언할 때 매개 변수의 개수를 알 수 없는 경우가 있다. 이때의 해결책은 매개 변수를 다음과 같이 배열 타입으로 선언하는 것이다.
// (1) 배열 타입으로 선언
int sum1(int[] values) { }
// (2) 배열을 생성하지 않고 값의 리스트만 넘겨주는 방법도 있다.
int sum2(int ... values) { }
sum1() 메소드를 호출할 때 배열을 넘겨줌으로써 배열의 항목 값들을 모두 전달할 수 있다. 배열의 항목 수는 호출 시 결정된다.
(1)
int[] values = { 1,2,3 };
int result = sum1(values);
int result = sum1(new int[] { 1,2,3,4,5 });
(2)
int[] values = { 1,2,3 };
int result = sum2(1,2,3);
int result = sum2(values);
int result = sum2(new int[] { 1,2,3,4,4 });
(강의)
메소드
// 경우에 따라 메소드를 선언할 때 매개변수의 개수를 알 수 없는 경우가 있다
// 해결책은 매개 변수를 배열 타입으로 선언하는 것이다
// 방법1.
public class Computer {
int sum1(int[] values) {
int sum = 0 ;
for(int i=0; i<values.length; i++) {
sum += values[i];
}
return sum;
}
// 방법 2.
//... : 매개변수에 ...을 사용해 선언하면 메소드 호출시 넘겨준 값의 갯수에 따라 배열이 생성된다
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();
// 방법 1 호출
// 값을 선언한 뒤 넣어주기
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);
// 방법2 호출
// ... 을 사용해준 (매개변수 갯수를 모를때 만들어준 배열) 입력
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);
}
}
-메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴(return)문을 사용해 리턴값을 지정해야 한다. return 문이 실행되면 메소드는 즉시 종료된다.
-void로 선언된 리턴값이 없는 메소드에서도 return;
형태로 return 문을 사용할 수는 있는데, 사용시 메소드 실행을 강제 종료시킨다.
-리턴있는 예시
int plus(int x, int y) {
int result = x + y;
return result;
}
-리턴없는 void의 return 사용 예시
void run(){
while(true){
if(num>0) {
System.out.println("진행하세요");
num-= 1;
} else {
System.out.println("중지합니다");
return;
// run 메소드 실행 종료
}
}
}
(강의)
```java
메소드 종류
public int testSum() { // 리턴타입이 int인 메소드
hap = num1 + num2;
return hap;
}
public double testSum1() { // 리턴타입이 double 인 메소드
hap = num1 + num2;
return hap;
}
public void testSum2() { // 리턴타입이 없는 void 메소드
hap = num1 + num2;
System.out.println(hap);
}
void print() { // 리턴타입이 없는 void 메소드
System.out.println(hap);
}
클래스 내, 외부의 호출에 의해 실행된다.
-클래스 내에서 다른 메소드를 호출할 경우 메소드(매개값, ...);
형태로 작성하면 된다.
-클래스 변수 = new 클래스(…);
안해줘도 된다는 것
-메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문에 객체 외부에서 호출시 클래스로부터 객체를 생성해야 한다.
클래스 변수 = new 클래스(…);
해줘야 한다는 것
-객체 생성 되었다면 참조 변수와 함께 도트( . ) 연산자를 사용해 메소드를 호출할 수 있다. 도트는 객체 접근 연산자로 객체가 가지고 있는 필드나 메소드에 접근할 때 사용된다.
public class Calcu {
int plus(int x, int y) {
int result = x + y;
return result;
}
double avg(int x, int y) {
double sum = plus(x, y); // 2. int plus() 호출
double result = sum / 2;
return result;
}
void execute() {
double result = avg(7, 10); // 1. double avg() 호출
println("실행결과: " + result); // 3. 계산 후 println() 호출
}
void println(String message) {
System.out.println(message);
}
}
// 객체에서 같은 멤버인 다른 메소드 호출시 아래와 같은 형태
// int plus(int x, int y)
// double sum = plus(x, y);
// double result = avg(7, 10);
---------------------------
public class CalcuEx {
public static void main(String[] args) {
Calcu myCalc = new Calcu();
myCalc.execute();
}
}
// 외부 객체에서 다른 객체 호출시 아래와 같은 형태
// Calcu myCalc = new Calcu();
// 참조변수.메소드(…); ←리턴값이 없거나, 있어도 리턴값을 받지 않을 경우
// myCalc.execute();
// 타입변수 = 참조변수.메소드(…) ←리턴값이 있고, 리턴값을 받고 싶을 경우
// int sum = myCalc.plus();
클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩(overloading)이라 한다. 사전적 의미는 많이 싣는 것을 뜻한다. 하나의 메소드 이름으로 여러 기능을 담는다 하여 붙여진 이름이라 생각할 수 있다.
(강의)
// 메소드 명을 똑같이 해도 매개변수가 다르면 오류 안남 : 메소드 오버로딩
// 메소드 오버로딩 규칙
// 1.메소드 명이 동일 2.매개변수가 티입,순서,갯수 달라야함 3.리턴타입은 상관 없
// 메소드의 리턴타입과 매개변수의 리턴타입은 같아야함
int sum(int num1, int num2) {
return num1+num2;
}
double sum(double num1, double num2, double num3) {
return num1 + num2 + num3;
}
String sum(String num1, String num2) {
return num1 + num2;
}