정답
완성형 실습입니다.
해설
기본형 변수가 메서드에 전달될 때는 값의 복사본을 전달합니다. 그렇게 전달된 값은 메서드에 선언된 매개변수에 저장됩니다. 원본 변수에도 값이 들어있고, 메서드에 선언된 변수에도 값이 들어있으므로, 메서드를 실행하면서 해당 값이 바뀐다고 하더라도, 원본 변수의 값은 바뀌지 않습니다. 그러므로 해당 결과는 그대로 10을 출력합니다.
참조형 변수는 변수에 값이 아닌 주소가 들어있으므로 메서드에 전달될 때 주소의 복사본을 전달합니다. 따라서 메서드에 선언된 매개변수에도 주소값이 들어가게 됩니다. 원본 변수와 메서드에 선언된 변수에도 값이 저장된 메모리의 주소가 들어있으므로, 결국 두 변수는 같은 곳을 가리키게 됩니다. 그러므로 메서드를 실행하면서 해당 값이 바뀌면 원본 변수가 가리키는 곳의 값이 바뀌었으므로 같이 바뀌게 되는 것입니다. 그러므로 결과는 11을 출력합니다.
예를 들어 정리하겠습니다. main 메서드 입장에서 생각하면 add에 매개변수로 전달하는 숫자가 10이라고 했을 때
• int value로 전달할 때는 그냥 10이라고 새로운 종이에 적어서 전달하는 것입니다. 그 종이를 돌려주지 않으면 가져간 다음에 뭘 하건 나랑은 상관이 없습니다.
• int[] arr로 전달할 때는 "저기 1958번 강의실에 있는 화이트보드에 값을 써놨어."라고 값이 적힌 주소를 전달합니다. 거기에 가보면 10이라는 값이 써 있습니다. add 메서드는 값을 변경할 때 그 강의실에 가서 그걸 지우고 다시 11을 적어버립니다. 나중에 main이 그 값을 사용할 때도 강의실에 가서 값을 보고 확인해야 사용합니다. 그러면 11이 적혀있겠죠.
문제 2 CarExam의 main에서 Car 클래스의 인스턴스를 만들고 run 메서드를 호출해보세요. Car 클래스는 다음과 같이 정의했습니다.
package javaStudy; public class Car{ public void run() { System.out.println("차가 달립니다."); } }
package javaStudy; public class CarExam{ public static void main(String [] args) { // 아래에서 car에 Car 클래스의 인스턴스를 생성하고 run 메서드를 사용해보세요. Car car = _________________ ___________________________ } }
실행결과
차가 달립니다.
정답
Car car = new Car(); car.run();
해설
클래스는 틀입니다. 실체가 아닙니다. 예를 들어 붕어빵을 만들기 위해서는 붕어빵 틀이 필요합니다. 붕어빵 틀을 이용해서 붕어빵을 만듭니다. 이때 붕어빵 틀이 클래스고, 붕어빵은 인스턴스입니다. 붕어빵을 먹는 것이지 붕어빵 틀을 먹는 것은 아닙니다. 즉, 클래스를 사용하기 위해서는 반드시 인스턴스화해야 합니다. 인스턴스를 생성하기 위해 new 키워드를 이용합니다. new 키워드를 이용하면 같은 인스턴스를 얼마든지 만들어낼 수 있습니다. Car의 인스턴스도 얼마든지 만들어낼 수 있으므로, Car가 가진 필드나 메서드를 사용하기 위해서는 어떤 차를 이용할 것인지 명확하게 알려줘야겠죠? 그렇기에 run이라는 메서드를 사용할 때는 인스턴스를 가리키는 변수명.메서드명() 형태로 사용해야 합니다.