💁♀️ 매개변수(Parameter)란,
메소드를 호출할 때 인자(argument)로 전달된 값을 메소드 내부에서 사용할 수 있게 해주는 변수
📍 매개변수(parameter)로 사용 가능한 자료형
1) 기본 자료형
2) 기본 자료형 배열
3) 클래스 자료형
4) 클래스 자료형 배열 (추후 학습)
5) 가변인자
public class ParameterTest {
public void testPrimaryTypeParameter(int num) {
System.out.println("매개변수로 전달받은 값 : "+ num);
num += 10;
}
public void testPrimaryTypeArrayParameter(int[] iarr) {
>>> 배열의 주소가 전달된다.
>>> 즉, 인자로 전달하는 배열과 매개변수로 전달받은 배열은 서로 동일한 배열을 가리킴 (얕은 복사)
System.out.println("매개변수로 전달 받은 값 : " + iarr);
System.out.println(Arrays.toString(iarr));
>>> 메소드 내에서 배열의 값을 변경하면 호출한 main 메소드에서도 변경된 값을 확인할 수 있음
iarr[0] = 99;
}
public void testClassTypeParameter(Rectangle rectangle) {
>>> 클래스 자료형도 매개변수에 넣을 수 있음 (클래스자료형 레퍼런스변수명)
System.out.println("매개변수로 전달 받은 값 : " + rectangle);
>>> 인자로 전달하는 값과 같은 주소값을 참조하고있음 (증거 : 출력시, 주소값 같음)
System.out.println(rectangle.getWidth());
>>> Rectangle 클래스의 getWidth를 참조해옴
System.out.println(rectangle.getHeight());
>>> Rectangle 클래스의 getHeight를 참조해옴
rectangle.setWidth(100.0);
>>> 미리 만들어둔 Rectangle 클래스의 setter메소드를 이용하여 값을 100으로 변경
rectangle.setHeight(120.0);
>>> 미리 만들어둔 Rectangle 클래스의 setter메소드를 이용하여 값을 120으로 변경
}
public void testVariableLengthArrayParameter(String name, String... hobby) {
>>> String... hobby : 가변 인자. name 이후, 두 번째 전달되는 값부터 몇 개인지 정확히 정해둘 수 없음.
>>> 1개가 될 수도 10개가 될 수도 있음
>>> 가변인자는 배열로 취급된다. (출력시, 배열 다루듯 하기)
System.out.println("이름 : " + name);
System.out.println("취미의 개수 : " + hobby.length);
System.out.println("취미 : " + Arrays.toString(hobby));
>>> ==> 즉 hobby는 배열로 취급됨
}
>>> 가변 인자를 매개변수로 이용한 메소드는 모호성으로 인해 오버로딩 하지않는 것이 좋음
>>> public void testVariableLengthArrayParameter(String... hobby){}
>>> App에서 출력할 때, 오버로딩한 메소드들 중 어떤 것을 사용해야할지 컴퓨터는 모름 -> 에러
}
📌 Ref.
* 가변 인자 배열은 몇 개가 전달 될지 모르는 상황이기 때문에 이름과 구분하기 위해 뒤쪽에 작성해야하며,
앞 쪽에 작성하는 경우 에러가 발생
public class Rectangle {
// 필드
private double width;
private double height;
// 생성자
>>> 기본 생성자로 객체 생성하는 것을 막고,
>>> 모든 필드를 초기화 하는 생성자로 초기값을 입력해서 인스턴스 생성하도록 제한
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// getter & setter
public void setWidth(double width) {
this.width = width;
}
public void setHeight(double height) {
this.height = height;
}
public double getWidth() {
return width;
}
public double getHeight() {
return height;
}
}
public class Application {
public static void main(String[] args) {
// 객체 생성
ParameterTest pt = new ParameterTest();
>>> pt : ParameterTest 클래스를 참조하는 레퍼런스변수
>>> 기본자료형 8가지 모두 가능
int num = 20;
pt.testPrimaryTypeParameter(num);
System.out.println("메소드 호출 후 num : " + num);
int[] iarr = {1, 2, 3, 4, 5};
System.out.println("인자로 전달 하는 값 : " + iarr);
pt.testPrimaryTypeArrayParameter(iarr); >>> 주소값 (얕은 복사)
System.out.println(Arrays.toString(iarr));
>>> int[0]가 99로 변경되어 나온다.
>>> (testPrimaryTypeArrayParameter 메소드로 인해)
Rectangle r = new Rectangle(10.0, 10.0);
>>> r : Rectangle 클래스를 참조하는 레퍼런스변수
>>> Rectangle 메소드에 기본 생성자를 만들지 않았기 때문에 꼭 값을 넣어주어야함
pt.testClassTypeParameter(r);
>>> 주소값을 넘기고 있음
System.out.println("인자로 전달하는 값 : " + r);
pt.testClassTypeParameter(r);
>>> pt(ParameterTest 클래스를 참조하는 레퍼런스변수)
System.out.println(r.getWidth());
System.out.println(r.getHeight());
>>> 인자로 전달하는 값의 개수가 정해져있지 않은 경우 가변 인자를 활용할 수 있음
pt.testVariableLengthArrayParameter("효연이"); >>> 가변 인자는 전달하지 않아도 됨
pt.testVariableLengthArrayParameter("우현이", "요리", "유투브", "롤", "포커");
pt.testVariableLengthArrayParameter("치즈", new String[] {"배까기", "코골기", "간식먹기"});
}
💻 Mini Console
매개변수로 전달받은 값 : 20
메소드 호출 후 num : 20
인자로 전달 하는 값 : [I@626b2d4a
매개변수로 전달 받은 값 : [I@626b2d4a
[1, 2, 3, 4, 5]
[99, 2, 3, 4, 5]
매개변수로 전달 받은 값 : com.greedy.section05.parameter.Rectangle@1c4af82c
10.0
10.0
인자로 전달하는 값 : com.greedy.section05.parameter.Rectangle@1c4af82c
매개변수로 전달 받은 값 : com.greedy.section05.parameter.Rectangle@1c4af82c
100.0
120.0
100.0
120.0
이름 : 효연이
취미의 개수 : 0
취미 : []
이름 : 우현이
취미의 개수 : 4
취미 : [요리, 유투브, 롤, 포커]
이름 : 치즈
취미의 개수 : 3
취미 : [배까기, 코골기, 간식먹기]