메소드 선언
- 메소드는 특정 작업을 수행하는 일련의 문들을 하나로 묶은 문 그룹
- 함수, 서브루틴, 프로시저, 서브 프로그램과 비슷한 개념
- main 메소드: 사용자가 정의하는 메소드와 동일한 문법을 사용함
1
2
3
4
5
6
7
8
| class MyClass{
static void myMethod(){
System.out.println("My Method");
}
public static void main(String[] args) {
// ...
}
}
|
메서드 호출
- 선언한 메소드의 사용
- 같은 클래스 내에서 메소드 호출
- 메소드 이름 뒤에 괄호에 하나 이상의 파라미터를 사용
- 다른 클래스에 있는 메소드 호출
- 호출할 때 메소드가 있는 클래스를 표시
- 호출되는 메소드는 private으로 선언되면 안됨
- 중첩 호출
- 메소드는 다른 메소드를 호출할 수 있고, 다른 메소드를 호출하는 메소드를 호출할 수 있음
return
- return에는 두 가지 뜻이 잇음: “귀한” , “반환”
- return문을 만나면 메소드는 실행을 멈추고 즉시 호출자 코드로 돌아감
- return문을 마나면 메소드는 즉시 종료되고, 뒤의 코드는 실행되지 않음
- 조건문에서 return 할수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| class MyClass{
static void myMethod(int i){
System.out.println("Hello, world!");
if(i>10) return;
//return
OhterClass.methodInOtherClass();
}
public static void main(String[] args) {
System.out.println("The Program is Starting");
myMethod(10);
System.out.println("The Program is end");
}
}
class OhterClass{
public static void methodInOtherClass(){
System.out.println("method fro OtherClass");
}
}
|
위처럼 return을 사용할 수 있고, 만약 if절 없이 return을 사용할 경우 그뒤에 코드들은 컴파일 오류가 발생한다.
지역 변수
1
2
3
4
5
6
7
8
9
| class MyClass{
static int i;//공유 변수
void myMethod(){
int i;//지역 변수
}
public static void main(String[] args) {//...
}
}
|
- 지역 변수(Local Variable)
- 메소드가 시작할 때 생성됨
- 메소드 내에서만 유효함
- 메소드가 종료될 때 제거됨
- 공유 변수
- 클래스 수준에서 선언된 변수는 공유될 수 있음
- 범위 충돌
- 로컬 변수 이름과 클래스 이름이 같은 경우 컴파일러는 이를 경고하지 않음
값 반환
- void가 아닌 타입으로 메소드 선언
- return 문을 사용하여 식을 반환
- void가 아닌 메소드는 반드시 값을 return 해야함
파라미터 사용
- 파라미터 선언
- 메소드 이름 뒤 괄호에 선언
- 각 파라미터의 이름과 타입을 정의
- 메소드를 호출하며 파라미터에 인자를 전달
- 호출할 메소드에 정의된 파라미터의 타입에 맞는 값을 전달
파라미터 선언과 호출
- 파라미터 선언
- 메소드 이름 뒤 괄호 사이에 선언
- 각 파라미터의 이름과 타입을 정의
- 메소드를 호출하며 파라미터에 인자(Argument)를 전달
- 호출할 메소드에 정의된 파라미터의 타입에 맞는 값을 전달
1
2
3
4
| static void defineParamtersIntoMethod(int n,string s){
...
}
defineParamtersIntoMethod(1,"hello, world!")
|
파라미터 전달 메커니즘
- Pass by Value
- 값을 복사해서 전달
- 값을 수정해도 원본 데이터에는 영향을 미치지 않음
- Pass by Reference
- 주소 값을 전달 - 실제 값이 있는 위치 전달
- 값을 수정하면 원본 데이터의 값에 영향을 미침
- Java는 모든 파라미터 전달에 Pass By Value를 사용함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class PassByValue{
static void aMethod(){
int i = 10;
System.out.println(i);
changeDigit(i);
System.out.println(i);
}
static void changeDigit(int i){
i++;
}
public static void main(String[] args) {
aMethod();
}
}
|
출력결과를 보면 Java는 Pass by Value를 사용한다는 것을 확인할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class PassByValue{
static void aMethod(){
int[] i = {10};
System.out.println(i[0]);
changeDigit(i);
System.out.println(i[0]);
}
static void changeDigit(int[] i){
i[0]++;
}
public static void main(String[] args) {
aMethod();
}
}
|
배열을 선언할 경우 heap영역에 데이터가 존재하고 메소드(aMethod)에서는 배열의 주소를 참조 만 하고 있다. 그렇기 때문에 changeDigit를 통해 i값을 증가하게 되면 이역시 참조하고 있기 때문에 heap영역에 있는 데이터 값을 바꾸게 되고, 다시 메소드(aMethod)에서 배열을 호출할 경우 주소에 있는 변경된 값을 가지고 오게 된다.
가변길이 목록 파라미터 사용
- 파라미터 타입 뒤에 …을 사용
- 같은 타입의 파라미터 여러 개를 배열로 변환하여 전달
다른 타입의 파라미터와 함께 쓸경우 파라미터 목록의 제일 마지막에 선언되어야함
```java public class Test { static int add(int… i){ int sum=0; for(int num : i){ sum+=num; } return sum; } public static void main(String[] args) { System.out.println(add(1,2,3,4)); System.out.println(add(1,2)); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
위와 같이 몇개의 숫자가 들어올지 모를때 '...'을 통해 해결할 수 있다.
### 재귀 메소드 사용
- 메소드는 자신을 호출할 수 있음
- 직접적 호출
- 간접적 호출
- 특정 문제를 해결하는데 유용하게 사용할 수 있음
```java
class Factorial{
static int factorial(int n){
if(n<1){
return 1;
}
else{
return factorial(n-1)*n;//자기 자신을 리턴
}
}
public static void main(String[] args) {
System.out.println(factorial(Integer.parseInt(args[0])));
}
}
|
함수 안에서 함수를 호출하여 같은 작업을 반복하는 방식이다.
메소드 오버로딩 정의
- 클래스 내에서 같은 이름을 사용하는 메소드
- 파라미터의 개수와 타입을 검사하여 구분
- Java에서 다형성을 표현하는 한가지 방법
1
2
3
4
5
6
7
8
9
10
11
12
| public class Overload {
static int add(int i, int j, int k){
return i+j+k;
}
static int add(int i,int j){
return i+j
; }
public static void main(String[] args) {
System.out.println(add(1,2,3));
System.out.println(add(1,2));
}
}
|
위와 같이 같은 이름을 오버로딩 하여 2개 들어올 때 3개 들어올 때를 처리할 수 있다.
메소드 시그너처
- 메소드 시그너처는 클래스 내에서 유일해야 함
- 시그너처 정의
1
2
| static int add(String i){ return i;}
static int add(int i){ return i;}
|
위와 같이 파라미터 타입이 다를 경우 다른 메소드로 인식한다.
1
2
| static int add(int i){ return i;}
static int add(int j){ return j;}
|
위와 같이 메소드 이름이 같을 경우 파라미터 이름이 다르더라도 똑같은 것으로 인식한다.
1
2
| static int add(int i){ return i;}
static String add(int j){ return j;}
|
이역시 메소드 시그너처는 return 타입을 포함하지 않기 때문에 같은 메서드로 인식한다.