오버로딩은 함수가 하나의 기능만 구현하는 것이 아니라, 하나의 매서드 이름으로 여러 기능을 구현하도록 하는 Java의 기능이다.
한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 매서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 매서드를 정의할 수 있다.
매서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 한다. (개수 or 타입 or 순서가 달라야 함 셋 다 다를 필요X)
'응답 값'만 다른 것은 오버로딩 할 수 없다.
접근 제어자만 다른 것도 오버로딩 할 수 없다.
※오버로딩: 매개변수의 차이로만 구현할 수 있다.
매서드 이름(ex. println) 하나로 상황에 따른 동작을 개별 정의가 가능하다.
ex. 메세지를 출력할때 쓰는 println()이 있다.
println()의 매개변수로는 int,double,String,boolean등 다양하게 넣을 수 있다.
매서드의 이름을 절약할 수 있다.
만약 오버로딩이 안된다면 println()은 printlnInt(), printlnDouble()처럼 매서드명이 길어지고 낭비되었을 것이다.
매서드가 호출할 때 전달할 매개 값으로 지정한 값을 매서드의 매개변수에 복사하여 전달한다.
매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 X
매서드를 호출할 때 전달할 매개값으로 지정한 값의 주소를 매개변수에 복사해서 전달한다.
매개변수를 참조형으로 선언하면, 값이 저장된 곳의 원본 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능
매서드의 매개변수 뿐만 아니라 반환타입도 참조형이 될 수있다.
반환타입이 참조형인 것은 반환하는 값의 타입이 "실제 값의 주소"라는 의미이다.
기본형 매개변수: 지정한 값을 매개변수에 복사하여 전달 / 변수의 원본 값이 변경 X
참조형 매개변수: 지정한 값의 주소를 매개변수에 복사하여 전달 / 값을 변경 O
기본형
출력값
type = D
gear = P
car객체에서 breakPedal을 호출한다. breakPedal엔 type이 들어오고 그 타입은 'D'로 되어 있다.
type이 들어와있음에도 불구하고 Car클래스 안의 type = 'P'에 의해서 'D'를 'P'로 업데이트 해주었다. 이후 Car클래스 안에서 changeGear(type); 로인해서 gear = type; 이므로 gear는 'P'가 된다.
이후 Main클래스에서 출력되는 2개의 값은 첫 번째로 맨처음 선언한 type이 출력되고 이후 Car클래스에서 gear는 type값이 'D' → 'P'로 바뀐 'P'값을 출력한다.
따라서 원본 객체를 변경시킬 순 없다고 정리된다.
참조형
출력값
tire.company = KIA
carInstanceTire.company = KIA
Main클래스에서 tire 객체를 하나 만들고 tire.company를 "금호"로 세팅하였다. → Tire class를 확인해보면 String company;로 선언되어있음.
car.setTire(tire); → car 클래스 안에 있는 setTire을 호출 Car 클래스의 SetTire을 가보면 tireCompany.company = "KIA"에 의해서 강제로 "KIA"값이 세팅되었다. 이때 참조형 변수는 Main 클래스 안의 tire.company = "금호" 인 원본 변수까지도 "KIA"로 바꿔버린다.
따라서 원본값인 tire.company를 출력해도 "KIA"가 나오고, carInstancetire.company를 출력해도 "KIA"값이 나오게 된다.