메소드 (Method)
- 메소드를 사용하는 이유?
여러번 반복되는 내용을 효율적으로 이용하기 위해
public class Test {
public int sum(int a, int b) {
return a+b;
}
public static void main(String[] args) {
int a = 3;
int b = 4;
Test myTest = new Test();
int c = myTest.sum(a, b);
System.out.println(c);
}
}
위의 예제는 a와 b의 합계를 구하는 sum 메소드이다. 여기서 return은 메소드의 결과 값을 돌려주는 명령어이다.
- 기본구조
public 리턴자료형 메소드명(입력자료형1 입력변수1, 입력자료형2 입력변수2, ...) {
...
return 리턴값; // 리턴자료형이 void 인 경우에는 return 문이 필요없다.
}
메소드는 입출력 유무에 따라 다음과 같이 4가지로 분류할 수 있다.
- 입력과 출력이 모두 있는 메소드
public int sum(int a, int b) {
return a+b;
}
사용
//리턴값받을변수 = 객체.메소드명(입력인수1, 입력인수2, ...)
Test myTest = new Test();
int c = myTest.sum(a, b);
- 입력은 없고 출력은 있는 메소드
public String say() {
return "Hi";
}
사용
//리턴값받을변수 = 객체.메소드명()
Test myTest = new Test();
String a = myTest.say();
System.out.println(a);
//Hi
- 입력은 있고 출력은 없는 메소드
리턴값이 없는 메소드는 명시적으로 리턴타입 부분에 void라고 표기한다.
public void sum(int a, int b) {
System.out.println(a+"과 "+b+"의 합은 "+(a+b)+"입니다.");
}
사용
//객체.메소드명(입력인수1, 입력인수2, ...)
Test myTest = new Test();
myTest.sum(3, 4);
//3과 4의 합은 7입니다.
- 입력과 출력이 모두 없는 메소드
public void say() {
System.out.println("Hi");
}
사용
//객체.메소드명()
Test myTest = new Test();
myTest.say();
- 메소드 내에서 선언된 변수의 효력 범위
메소드 안에서 사용하는 변수는 메소드 안에서만 쓰여지는 변수이다.
class Test {
public void vartest(int a) {
a++;
}
public static void main(String[] args) {
int a = 1;
Test myTest = new Test();
myTest.vartest(a);
System.out.println(a);
}
}
즉, 메소드 안에서 사용되는 변수 a와 메인 메소드에서 사용되는 a는 동일하지 않다.
위의 예제에서 출력되는 a의 값은 vartest 메소드를 이용해 1을 증가시킨 2가 아니라 1이 출력된다.
이렇게 메소드 내에서만 쓰이는 변수를 로컬 변수(local variable)라고도 말한다.
vartest라는 메소드를 이용해서 메소드 외부의 a를 1만큼 증가시킬 수 있는 방법은 return문을 이용하는 것이다.
※ 만약 vartest의 입력값이 int 자료형이 아닌 객체였다면 얘기가 다르다. 객체를 메소드의 입력으로 넘기고 메소드가 객체의 속성값(객체변수 값)을 변경한다면 메소드 수행 이후에도 객체는 변경된 속성값을 유지한다. 이러한 차이가 나는 이유는 메소드에 전달하는 입력 자료형의 형태 때문인데 메소드에 값을 전달하느냐 아니면 객체를 전달하느냐에 따라 차이가 난다.
Call by value
https://re-build.tistory.com/3
<메모>
이해는 되는데 이해가 되지 않는다,,,,
public class Test {
int a; // 객체변수 a
public void vartest(Test test) {
test.a++;
}
public static void main(String[] args) {
Test myTest = new Test();
myTest.a = 1;
myTest.vartest(myTest);
System.out.println(myTest.a);
}
}
메소드 안에서 사용하는 변수의 이름은 메소드 안에서만 쓰여지는 변수인데 메소드를 생성할 때 입력파라미터에 해당 클래스의 객체를 넣으면 메인 클래스에서 a를 사용할 수 있다는 소리인가?
더 알아볼 것.
'Study > JAVA' 카테고리의 다른 글
[점프투자바] 05 객체지향 프로그래밍 05-5 생성자 (0) | 2021.10.22 |
---|---|
[점프투자바] 05 객체지향 프로그래밍 05-4 상속 (0) | 2021.10.22 |
[점프투자바] 05 객체지향프로그래밍 05-1 클래스 (0) | 2021.10.22 |
[점프투자바] 04장 제어문 04-4 ~ 5 for문, for each문 (0) | 2021.10.21 |
[점프투자바] 04장 제어문 04-3 while문 (0) | 2021.10.21 |