매서드 내에서 선언된 변수의 효력 범위
- 메서드 안에서 사용하는 변수의 이름을 메서드 밖에서 사용한 이름과 동일하게 사용한다면 어떻게 될까?
public class Sample {
void varTest(int a) {
a+=1;
}
public static void main(String[] args) {
int a = 1;
Sample sample = new Sample();
sample.varTest(a);
System.out.println(a);
}
}
- 위 코드의 varTest 메서드는 입력으로 들어온 int 자료형의 값을 1만큼 증가시키는 역할을 한다.
- main 메서드를 순서대로 분석해보자.
먼저 main 메서드에서 a라는 int 자료형의 변수를 생성하고 1을 대입했다. 그리고 varTest 메서드를 입력 값 a를 주어 호출했다. 그 다음에 a의 값을 출력하게 하였다. 당연히 varTest 메서드에서 a의 값을 1만큼 증가시켰으니 2가 출력되어야 할 것 같지만 프로그램을 실행시켜 보면 1이라는 결과 값이 나온다.
그 이유는 메서드에서 사용한 매개 변수는 메서드 안에서만 쓰여지는 변수이기 때문이다.
varTest라는 메서드를 이용해서 메서드 외부의 a의 값을 1만큼 증가시킬 수 있는 방법
- 다음과 같이 varTest 메서드와 main 메서드를 변경해 보자.
public class Sample {
int varTest(int a) {
a+=1;
return a;
}
public static void main(String[] args) {
int a = 1;
Sample sample = new Sample();
a = sample.varTest(a);
System.out.println(a);
}
}
- varTest의 return 문을 이용하면 된다. varTest 메서드는 입력으로 들어온 값을 1만큼 증가시켜 리턴한다. 따라서 a = sample.varTest(a)처럼 하면 a의 값은 다시 varTest 메서드의 리턴값으로 대입된다. (1만큼 증가된 값으로 a의 값이 변경된다.)
객체를 넘기는 방법?
public class Sample {
int a; // 객체변수 a
void varTest(Sample sample) {
sample.a+=1;
}
public static void main(String[] args) {
Sample sample = new Sample();
sample.a = 1;
sample.varTest(sample);
System.out.println(sample.a);
}
}
- 이번에는 int 자료형인 a 변수를 Sample 클래스의 객체변수로 선언했다. 그리고 varTest 메서드는 Sample 클래스의 객체를 입력받아 해당 객체의 객체변수 a의 값을 1만큼 증가시키도록 했다. 그리고 main 메서드에서는 varTest 메서드 호출 시 Sample 클래스의 객체인 sample을 전달하도록 수정했다.
이렇게 수정하고 프로그램을 실행시켜보면 sample 객체의 객체변수 a의 값이 원래는 1이었는데 varTest 메서드 실행 후 1만큼 증가되어 2가 출력되는 것을 확인할 수 있다.
여기서 주목해야 하는 부분은 varTest 메서드의 입력 파라미터가 값이 아닌 Sample 클래스의 객체라는 데 있다. 이렇게 메서드가 객체를 전달받으면 메서드 내의 객체는 전달받은 객체 그 자체로 수행된다. 따라서 입력으로 전달받은 sample 객체의 객체변수 a의 값이 증가하게 되는 것이다.
메서드의 입력 항목이 값인지 객체인지를 구별하는 기준은 입력 항목의 자료형이 primitive 자료형인지 아닌지에 따라 나뉜다. int 자료형과 같은 primitive 자료형인 경우 값이 전달되고 그 이외의 경우는 객체가 전달된다.
this 활용하기
sample.varTest(sample);
- sample 객체를 이용하여 varTest라는 메서드를 호출할 경우 굳이 sample 객체를 전달할 필요가 없다. 왜냐하면 전달하지 않더라도 varTest 메서드는 this라는 키워드를 이용하여 객체에 접근할 수 있기 때문이다. this를 이용하여 varTest 메서드를 수정한 버전은 다음과 같다.
public class Sample {
int a; // 객체변수 a
void varTest() {
this.a+=1;
}
public static void main(String[] args) {
Sample sample = new Sample();
sample.a = 1;
sample.varTest();
System.out.println(sample.a);
}
}