본문 바로가기

LECTURE/# java basic

[초급 JAVA]자바 메서드 (CallByName/CallByValue/return)

반응형

자바 메서드 (CallByName/CallByValue/return)-1 

Programming

 
ExamMethod1.java
package method;
public class ExamMethod1 {
public static void callByName(){
System.out.println("'CallByName' was called");
}
public static void callByValue(String name){
System.out.println("'"+name+"'"+" was called");
}
public static int addNumber(int a,int b){
return a+b;
}
public static void main(String[] ar) {
// 메서드란?
/* 자주 반복되어 사용되는 내용을 묶어서 특정이름으로 정의한 묶음 */
// 형식
/* 메서드 명(매개변수) throws 예외 클래스{ 내용정의; } */
//메서드의 종류
//Call By Name - 메서드의 이름으로 호출하는 메서드. 특정 매개변수가없습니다.
callByName();
//Call By Value - 메서드를 호출 할때 특정 매개변수를 전달함으로써 그 값을 가지고 실행하는 메서드
callByValue("callByValue");
//Call By Reference - 메서드 호출 시 매개변수로 사용되는 값이 특정 위치를 참조하는 reference변수
//매개 변수의 원래 주소값을 저장하는 방식으로써 Java에서는 클래스 객체를 인수로 전달하는 경우에만 Reference로 처리합니다.
//CallByValue와 많이 혼동되고 어려운 개념으로써, 현 초급단계에서는 설명하지않겠습니다.
//추후에 CallByValue 와 CallByReference의 차이점에대해 따로 포스팅 하겠습니다.
//자신이 원할때 만들어 놓은 메서드는 언제든 다시 호출해서 쓸 수있습니다.
callByName();
callByValue("callByValue");
//결과를 리턴하는 메서드
//return 예약어를 쓰면 값을 리턴받아서 사용할 수있습니다.
int result = addNumber(10,20);
System.out.println("result : "+result);
}
}

CallByName

이름그대로 매개변수 없이 이름으로만 호출하는 method를 말합니다. 메서드는 언제든지 다시 호출 할 수 있습니다.  

CallByValue

CallByName과 다르게 매개변수를 통하여 값을 전달하고 그값을 메서드에서 이용할 수 있는 호출 방식입니다. 이 때 중요하게 생각 해야 할 점은 전달한 매개변수의 Data가 어디까지 생존해있느냐입니다. 전달된 매개 변수의 data는 호출된 메서드안에서만 이용되어지고 없어집니다. 예를 통해 보시죠.

1
2
3
4
5
6
7
8
9
10
11
12
public static void getNumber(int a,int b){
    a++;
    b++;
}
 
public static void main(String ar){
    int a =10;
    int b =20;
    getNumber(a,b);
    System.out.println("a : "+a+"b : "+b);
}
 
cs

getNumber(int a, int b)라는 메서드에 a,b를 매개변수로 하여 넘겼고 a와 b는 그안에서 1 씩 증가됩니다. 그럼 출력되는  a,b의 값은 몇 일까요? 그렇습니다. 변화 없이 10과 20 입니다. 절달 되는 a,b는 그 data가 가는 것이 아니고, 다른 곳에 똑같은 value로 복사되어 가는것입니다. 한마디로 서로 참조하는 주소가 다른데, 값이 똑같은거죠. 여기서 CallByReference와 차이가 발생하는 것인데, 이점에대해선 나중에 더 설명하도록 하고 지금은 CallByValue를 완전히 이해하는데 더 노력을 해봅시다. 

1
2
3
4
5
6
7
8
9
10
11
12
public static void getNumber(int num1,int num2){
    num1++;
    num2++;
}
 
public static void main(String ar){
    int a =10;
    int b =20;
    getNumber(a,b);
    System.out.println("a : "+a+"b : "+b);
}
 
cs

위와 똑같은 소스입니다만, getNumber의 인자 이름이 바뀌었죠? 그러니 호출하는 쪽에서의 매개변수와 value만 같지 서로 전혀 다른 놈이라고 생각하시면됩니다. 매서드에서의 저 매개변수는 메서드와 생명주기를 같이하죠. 메서드가 끝나면 매개변수도 없어진다라는 겁니다.

매개변수/인자

1
2
3
4
5
6
7
8
9
10
public static void getNumber(int 매개변수){
    
}
 
public static void main(String ar){
    int 인자 =100;
    getNumber(인자);
 
}
 
cs

매개변수와 인자가 눈에 들어오시나요? 메서드를 호출하는 쪽에서 넣는 값을 인자라고하고, 받는쪽에서 값을 매개변수라고 합니다. 같은 메서드일때 매개변수와 인자의 값은 자료형의 타입과 순서, 갯수가 일치하여야합니다. 또한 메서드를 생성할 때 이름이 같더라도 매개변수의 갯수나 타입이 다르다면 여러개를 생성할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void getNumber(int 매개변수){
    
}
public static void getNumber(int 매개변수,int 매개변수2){
    
}
public static void getNumber(String 매개변수){
    
}
 
public static void main(String ar){
    int 인자 =100;
    getNumber(인자);
 
}
 
cs
CallByValue이므로 메서드의 이름은 그렇게 중요하지않고 안에 매개변수가 중요한거죠. getNumber를 호출할때 인자를 String 타입으로 넣으면 어떻게될까요? 네 그렇습니다. 매개변수가 String 으로 정의되어있는 getNumber(String 매개변수){} 를 호출 하게되겠죠? 중요한 거니 잘 알아두셔야 합니다.

return

return은 정말 너무 중요한 개념입니다. 메서드 안에서 실행 되는 내용은 메서드가 끝나는 즉시 사라지기때문에(메서드 안에서 생성된 변수들이라면) 필요한 결과를 return받아 메서드를 호출한 곳에서 사용해야 할 필요가있습니다. 그때 return을 써야하며, return되는 타입은 메서드를 생성할 때 정의해줘야합니다.이렇게요.

1
2
3
4
5
6
7
8
9
10
11
public static int getNumber(int num1,int num2){
    return num1+num2
}
 
public static void main(String ar){
    int a =100;
    int b =200;
    int c = getNumber(a,b);
 
}
 
cs
getNumber메소드는 항상 void 즉 아무것도 리턴하지않는다라는 의미의 return 타입으로 정의되다가 이번에는 int 로 바뀌었습니다. 그래서 이메서드는 끝날때 무조건 int형으로된 값을 리턴하여야 합니다. 매개변수로 받은 num1, num2를 더한 값을 리턴함으로써 더하기 메서드가 되었네요 ^^ 이걸 이용해서 계산기 소스를 만들어서 해보셔도됩니다.^^


Closing
소스는 모두 올려놓았습니다. github 링크는 나중에 좀더 자료가 많아지면 수정해서 올려놓도록하겠습니다. 일단 copy&paste를 해서 결과를 눈으로 확인하시고 설명을 보면서 직접 코딩을 해보세요. 대부분의 설명은 소스안에 주석에 써놓았으니, 주석을 참고하여 설명을 봐주세요.



반응형