오버로딩은 매개변수의 개수, 타입,순서에 따라 매서드 이름이 같은 함수들이 다른 기능을 구현하도록 하는 Java의 기능이다. 즉 한개의 클래스 내에 같은 이름을 가진 매서드가 있어도 매개변수의 개수, 타입,순서에 따라 다르게 정의를 할수 있다.
오버로딩의 장점
ex class에 메서드 오버로딩
public class Car {
String company; // 자동차 회사
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
Tire tire;
Door door = new Door();
Handle handle = new Handle();
public Car() {} // 기본 생성자
double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
double brakePedal(char type) {
speed = 0;
type = 'P'; // 정지 후 매개변수 type을 어떤 타입으로 전달 받았는지 상관없이 'P'로 고정시키기
changeGear(type);
return speed;
}
char changeGear(char type) {
gear = type;
return gear;
}
boolean onOffLights() {
lights = !lights;
return lights;
}
void horn() {
System.out.println("빵빵");
}
Tire setTire(Tire tireCompany) {
tireCompany.company = "KIA"; // 금호 타이어를 전달 받았지만 강제로 KIA 타이어로 교체
tire = tireCompany;
return tire;
}
}
public class Tire {
String company; // 타이어 회사
public Tire() {}
}
ex 오버로딩 된 메서드 사용
public class Main {
public static void main(String[] args) {
Car car = new Car(); // 객체 생성
// 기본형 매개변수
char type = 'D';
car.brakePedal(type);
// 메서드 실행 완료 후 전달할 매개값으로 지정된 type 값 확인
System.out.println("type = " + type); // 기존에 선언한 값 'D' 출력, 원본 값 변경되지 않음
// 메서드 실행 완료 후 반환된 car 인스턴스의 gear 타입 확인
System.out.println("gear = " + car.gear); // 객체 내부에서 type을 변경하여 수정했기 때문에 'P' 출력
System.out.println();
// 참조형 매개변수
Tire tire = new Tire();
tire.company = "금호"; // 금호 타이어 객체 생성
// 차 객체의 타이어를 등록하는 메서드 호출한 후 반환값으로 차 객체의 타이어 객체 반환
Tire carInstanceTire = car.setTire(tire);
// 메서드 실행 완료 후 전달할 매개값으로 지정된 참조형 변수 tire의 company 값 확인
System.out.println("tire.company = " + tire.company); // "KIA" 출력
// 전달할 매개값으로 지정된 tire 인스턴스의 주소값이 전달되었기 때문에 호출된 메서드에 의해 값이 변경됨.
// 메서드 실행 완료 후 반환된 car 인스턴스의 tire 객체 값이 반환되어 저장된 참조형 변수 carInstanceTire의 company 값 확인
System.out.println("carInstanceTire.company = " + carInstanceTire.company); // "KIA" 출력
}
}
오버로딩을 통해 여러개의 생성자를 만들수도 있다!
ex 여러개의 생성자
public class Car {
static final String COMPANY = "GENESIS"; // 자동차 회사 : GENESIS
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear = 'P'; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
public Car(String modelName) {
model = modelName;
}
public Car(String modelName, String colorName) {
model = modelName;
color = colorName;
}
public Car(String modelName, String colorName, double priceValue) {
model = modelName;
color = colorName;
price = priceValue;
}
double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
double brakePedal() {
speed = 0;
return speed;
}
char changeGear(char type) {
gear = type;
return gear;
}
boolean onOffLights() {
lights = !lights;
return lights;
}
void horn() {
System.out.println("빵빵");
}
}
ex 생성자 사용
public class Main {
public static void main(String[] args) {
// 기본 생성자 호출 오류 확인
// Car car1 = new Car(); // 오류 발생
// 생성자 오버로딩을 통해 여러 상황에서 자동차 생산
// 제네시스 자동차를 생산 : static final String COMPANY = "GENESIS"; 상수 고정
// 모든 자동차는 생산시 기어의 최초 상태 'P' 로 고정 : char gear = 'P'; 직접 대입하여 초기화
// GV60 모델만 기본으로 선택
Car car2 = new Car("GV60");
System.out.println("car2.model = " + car2.model);
System.out.println("car2.gear = " + car2.gear + "\n");
// GV70 모델, 색상 Blue 만 기본으로 선택
Car car3 = new Car("GV70", "Blue");
System.out.println("car3.model = " + car3.model);
System.out.println("car3.color = " + car3.color);
System.out.println("car3.gear = " + car3.gear + "\n");
// GV80 모델, 색상 Black, 가격 50000000 으로 완전하게 고정된 경우
Car car4 = new Car("GV80", "Black", 50000000);
System.out.println("car4.model = " + car4.model);
System.out.println("car4.color = " + car4.color);
System.out.println("car4.price = " + car4.price);
System.out.println("car4.gear = " + car4.gear + "\n");
}
}