오버로딩을 설명 하기위해 예제를 하나 만들겠습니다.
그러기 위해서는 먼저 class를 하나 생성해줍니다.
public class Calc {
int plus(int a, int b){
return (a+b);
}
int minus(int a, int b){
return (a-b);
}
}
그리고 위의 코드를 main method에 클래스를 불러보겠습니다.
public class App {
public static void main(String[] args) throws Exception {
Calc calc = new Calc();
calc.plus(3, 2); // 예) a값 3 ,b값 2
System.out.println(calc.plus(3, 2)); // 출력값 5
System.out.println(calc.minus(3, 2)); // 출력값 1
}
}
위의 코드들은 간단한 예제일 뿐 우리는 클래스를 만들 때
기능을 더 명확하고 자세히 포함 시켜줘야 합니다.
따라서 조금 더 효율적으로 작성해보겠습니다.
public class Calc {
void plus(int a, int b){
int k = a + b;
System.out.println(k);
}
void plus(double a, double b){
double k = a + b;
System.out.println(k);
}
void minus(int a, int b){
int k = a-b;
System.out.println(k);
}
void minus(double a, double b){
double k = a-b;
System.out.println(k);
}
}
위처럼 클래스에 기능을 다 집어 넣으면 조금 더 효율적으로 처리를 할 수 있습니다.
그리고 main method도 고쳐 보겠습니다.
public class App {
public static void main(String[] args) throws Exception {
Calc calc = new Calc();
calc.plus(3, 2); // 예) a값 3 ,b값 2 /출력값 5
calc.minus(3, 2); // 예) a값 3 ,b값 2 /출력값 1
calc.plus(3.2, 2.8); // 예) a값 3 ,b값 2 /출력값 6
calc.minus(3.2, 2.1); // 예) a값 3 ,b값 2 /출력값 1.1
}
}
이렇게 사용할 수가 있습니다. 다만 여기서 중요한 점은 기능이 겹치는게 많습니다.
즉, 정수를 plus하냐 minus하냐 차이일 뿐 기능은 같기 때문에
하나의 메서드를 통해 많은 기능을 집어넣는 것을 오버로딩이라고 하는 것 이죠.
자 여기서 생성자에 대해 설명 해보겠습니다.
public class Calc {
int x,y;
Calc(){
x = 3;
y = 2;
}
void plus(){
System.out.println(x + y);
}
void minus(){
System.out.println(x - y);
}
}
생성자의 기본 구조 입니다. 이렇게 하면 파라미터 값을 넣을 필요 없이 알아서 기능을 수행 해줄 수 있는 것이죠.
그리고 아래의 내용처럼 메인 메서드에는 그저 불러오기만 하면 됩니다.
public class App {
public static void main(String[] args) throws Exception {
Calc calc = new Calc();
calc.plus();
calc.minus();
}
}
결론적으로 말하면 객체 생성과 동시에 데이터 값을 불러올 수 있다 라는 말입니다.
this란? 외부에서 불러오는 파라미터 값을 내부의 변수명과 같게 불러오고 싶을 때 사용할 수 있습니다.
void plus(int x, int y){
this.x = x;
this.y = y;
int k = x + y;
System.out.println(k);
}
이런 식으로 int a와 int b가 아닌int x, int y로 받아서 this를 활용해 변수명을 최적화 할 수 있는 것이죠.
오버라이딩 : 슈퍼 클래스를 상속받은 서브 클래스에서 슈퍼 클래스의 메서드를 다시 정의하는 것
오버로딩 : 하나의 클래스 내에서 동일한 이름의 메서드를 파라미터, 리턴 타입 등을 다르게 하여 여러 개 정의하는 것