💡 동일한 클래스 내에는 동일한 이름의 생성자 혹은 메소드를 작성하지 못한다. 하지만 매개변수의 타입, 갯수, 순서를 다르게 작성하면 서로 다른 생성자나 메소드로 인식하기 때문에 동일한 이름의 생성자나 메소드를 여러 개 작성할 수 있게 해준다.
package com.ohgiraffers.section05.overloading;
public class OverloadingTest {
/* 수업목표. 오버로딩(Overloading)에 대해 이해할 수 있다. */
/* 필기.
* 메소드의 시그니처?
* public void method(int num){}이라면, 메소드의 메소드명과 파라미터 선언부 부분을
* 메소드의 시그니처(signature)라고 한다.(즉, method(int num))
*
* 필기.
* 동일한 메소드 이름으로 다양한 종류의 매개변수에 따라 처리해야 하는 경우 적용하는 기술을
* 오버로딩이라고 한다.
*
* 필기.
* 오버로딩의 조건?
* 매개변수의 타입, 갯수, 순서를 다르게 작성하여 하나의 클래스 내에 동일한 이름의 메소드를
* 여러 개 작성할 수 있다.
* 메소드의 헤드부(중괄호 앞)에 있어 시그니처를 제외한 부분이 다르게 작성되는 것은 인정되지 않는다.
* */
/* 필기. ex. println
* 하나의 메소드, 여러 개의 매개변수.
* 메소드의 시그니처가 달라서 가능하다.
* 같은 클래스 안에서!
* */
public void test() {}
// private String test() {} // 메소드 오버로딩에서는 시그니처를 제외한 나머지는 무관
/* 설명. 매개변수의 갯수가 달라짐 */
public void test(int num) {}
public void test(int num1, int num2) {}
// public void test(int num2, int num1) {} // 매개 변수명이 다른 것은 무관
/* 설명. 매개변수의 타입이 달라짐 */
public void test(int num1, String str) {}
/* 설명. 매개변수의 순서가 달라짐(타입만 고려) */ // 문제 내기 딱 좋네!!!!!!!
public void test(String str, int num) {}
}
2. 매개변수로 사용 가능한 자료형
💡 5가지 형태의 매개변수 : 기본자료형, 기본자료형 배열, 클래스 자료형, 클래스 자료형 배열, 가변인자
package com.ohgiraffers.section05.parameter;
import java.util.Arrays;
public class Application {
public static void main(String[] args) {
System.out.println("프로그램 실행 시 던져진 값: " + Arrays.toString(args));
/* 수업목표. 메소드의 파라미터(매개변수)에 대해 이해하고 사용할 수 있다. */
/* 필기.
* 파라미터로 사용 가능한 자료형
* 1. 기본자료형
* 2. 기본자료형 배열
* 3. 클래스자료형(참조자료형)
* 4. 클래스자료형 배열(객체 배열이지만 다음 챕터에서 다룰 예정)
* 5. 가변인자
* */
ParameterTest pt = new ParameterTest();
/* 목차. 1. 기본자료형을 매개변수로 전달 받는 메소드 호출 */
/* 필기. call by value, call by reference 차이 정리! (면접) */
/* 설명. 리터럴 값(참조 주소값 X)을 전달해서 메소드를 호출 시에는 서로 다른 지역 변수는 서로 영향 X */
int num = 20; // 리터럴을 메소드에 넘겨도 여기에 영향을 받지 않는다
System.out.println("call by value 전: " + num);
pt.testPrimitiveTypeParameter(num); // 리터럴 값에 의한 호출(call by value)
System.out.println("call by value 후: " + num);
/* 목차. 2. 기본자료형 배열을 매개변수로 전달 받는 메소드 호출 */
int[] iArr = new int[]{1, 2, 3, 4, 5};
System.out.println("call by reference 전: " + Arrays.toString(iArr));
pt.testPrivitiveTypeArrayParameter(iArr); // 참조 값에 의한 호출 , 주소값을 넘긴다.
System.out.println("call by reference 후: " + Arrays.toString(iArr));
/* 목차. 3. 클래스 자료형을 매개변수로 전달 받는 메소드 호출 */
Rectangle r1 = new Rectangle(22, 12);
// r1.calArea();
// r1.calRound();
pt.testClassTypeParameter(r1);
/* 목차. 4. 아직 클래스 배열(객체 배열)은 배우지 않았으므로 건너 뜀 */
/* 목차. 5. 가변인자를 매개변수로 전달 받는 베소드 호출(자바는 왠만하면 권장 X) */
pt.testVariableLengthArrayParameter();
pt.testVariableLengthArrayParameter("홍길동");
pt.testVariableLengthArrayParameter("유관순", "볼링");
pt.testVariableLengthArrayParameter(new String[]{"강감찬", "낚시", "독서"});
}
}
// 실행 결과
프로그램 실행 시 던져진 값: []
call by value 전: 20
매개변수로 전달받은 값: 10
call by value 후: 20
call by reference 전: [1, 2, 3, 4, 5]
매개변수로 전달받은 값: [100, 2, 3, 4, 5]
call by reference 후: [100, 2, 3, 4, 5]
사각형의 넓이는 264
사각형의 둘레는 68
str = []
str = [홍길동]
str = [유관순, 볼링]
str = [강감찬, 낚시, 독서]
2-2. call by value VS. call by reference
call by value
리터럴 값에 의한 호출
함수에 인자를 전달할 때, 인자의 실제 값이 복사되어 전달
함수 내부에서 인자의 값을 변경하더라도 원래의 인자 값에는 영향을 미치지 않는다.
call by reference
참조 값에 의한 호출 / 주소를 넘긴다.
함수에 인자를 전달할 때, 인자의 참조(주소)가 전달
함수 내부에서 인자의 값을 변경하면 원래의 인자 값도 변경된다.
package com.ohgiraffers.section05.parameter;
import java.util.Arrays;
public class ParameterTest {
public void testPrimitiveTypeParameter(int num) {
num = 10;
System.out.println("매개변수로 전달받은 값: " + num);
}
public void testPrivitiveTypeArrayParameter(int[] iArr) {
iArr[0] = 100;
System.out.println("매개변수로 전달받은 값: " + Arrays.toString(iArr));
}
public void testClassTypeParameter(Rectangle rectangle) {
rectangle.calArea();
rectangle.calRound();
}
public void testVariableLengthArrayParameter(String... str) {
System.out.println("str = " + Arrays.toString(str)); // 문자열 배열로 되어서 그냥 str 출력 시 주소값 나온다.
}
}
package com.ohgiraffers.section05.parameter;
public class Rectangle {
private int height;
private int width;
public Rectangle() {
}
public Rectangle(int height, int width) {
this.height = height;
this.width = width;
}
public void calArea() {
System.out.println("사각형의 넓이는 " + (this.width * this.height));
}
public void calRound() {
System.out.println("사각형의 둘레는 " + (this.width + this.height) * 2);
}
}