이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.
그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.
그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(ctrl+f 나 cmd+f)로 찾아보도록하자.
우리는 객체를 배웠다. 특정 객체에서 똑같은 메소드(멤버 함수)가 존재할 수 있을까?
존재할 수 있다. 단 조건이 몇개 필요하다.
이렇게 이미 있는 함수를 중복(over)선언(load)하는 것을 overloading이라 부른다.
자바에서는 일반 메소드 뿐만 아니라 생성자 역시 오버로딩을 하는 것이 가능하다.
메소드 오버로딩
public class Calculator {
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
int mul(int a, int b) {
return a * b;
}
int div(int a, int b) {
return a / b;
}
}
위와 클래스와 메소드가 있다고 하자.
해당 클래스 Calculator는 계산을 도와주는 클래스이다.
그러면 해당 클래스를 한번 사용해보자.
public class Main {
public static void main(String[] args) {
Calculator cal = new Calculator();
int a = 6;
int b = 3;
System.out.println(cal.add(a, b));
System.out.println(cal.sub(a, b));
System.out.println(cal.mul(a, b));
System.out.println(cal.div(a, b));
}
}
이 코드는 아무 특별한거 없는 코드이다.
그러면 조금 코드를 바꿔보자.
public class Main {
public static void main(String[] args) {
Calculator cal = new Calculator();
float a = 6;
int b = 3;
System.out.println(cal.add(a, b));
System.out.println(cal.sub(a, b));
System.out.println(cal.mul(a, b));
System.out.println(cal.div(a, b));
}
}
이 코드가 작동할까? 해보면 알겠지만 당연히 작동하지 않는다.
왜냐하면 모든 메소드의 파라메터가 (int,int)로 되어있는데 여기에서는 (float,int)를 넣었기 때문이다.
그러면 해결하려면 어떻게 해야할까??
이 경우 아래같은 방식으로 해결할 수 있다.
public class Calculator {
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
int mul(int a, int b) {
return a * b;
}
int div(int a, int b) {
return a / b;
}
float add(float a, int b) {
return a + b;
}
float sub(float a, int b) {
return a - b;
}
float mul(float a, int b) {
return a * b;
}
float div(float a, int b) {
return a / b;
}
}
float과 int형을 받는 메소드를 중복(over)정의 해주면된다. 이를 오버로딩이라고한다.
메소드의 이름이 같지만 부르는데 문제는 딱히 없다. 왜냐하면 파라메터의 종류,갯수까지 확인하기 때문이다.
public class Main {
public static void main(String[] args) {
Calculator cal = new Calculator();
int a = 6;
System.out.println(cal.add(a));
System.out.println(cal.sub(a));
System.out.println(cal.mul(a));
System.out.println(cal.div(a));
}
}
이런 경우는 어떻까? 파라메터 갯수마저 달라지는 것이다. 이 코드를 기존 메소드를 수정하지 않고 사용할 수 있가?
public class Calculator {
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
int mul(int a, int b) {
return a * b;
}
int div(int a, int b) {
return a / b;
}
int add(int a) {
return a + a;
}
int sub(int a) {
return a - a;
}
int mul(int a) {
return a * a;
}
int div(int a) {
return a / a;
}
}
그 역시 가능하다. 같은 이름이지만 파라메터 갯수로 확인할 수 있기 때문이다.
오버로딩규칙
1.함수의 이름이 같아야한다.
2.파라메터의 갯수가 같다면 파라메터의 자료형이 달라야한다.
3,파라메터의 갯수가 달라야한다.
조금 더 파고들면 규칙들이 더 있지만 아직은 이것만 알아도 상관없다.
생성자 오버로딩
public class Pokemon {
String name;
int hp;
String skill1;
String skill2;
String skill3;
String skill4;
Pokemon() {
name = "캐터피";
hp = 7;
skill1 = "실뿜기";
}
Pokemon(String n, int h, String s) {
name = n;
hp = h;
skill1 = s;
}
String status() {
return "포켓몬의 이름은 " + name + ", 체력은 " + hp + "입니다.";
}
}
저번시간에 생성자를 오버로딩을 한번 하는 예제를 보여줬다.
이런식으로 생성자 오버로딩을 사용할 수 있다.
규칙은 일반적인 메소드 오버로딩과 똑같다.
디폴트 생성자
저번시간에 했던 이 코드들을 보자.
public class Pokemon {
String name;
int hp;
String skill1;
String skill2;
String skill3;
String skill4;
Pokemon(String n, int h, String s) {
name = n;
hp = h;
skill1 = s;
}
String status() {
return "포켓몬의 이름은 " + name + ", 체력은 " + hp + "입니다.";
}
}
이 코드의 예시를 보자. 이 코드에서는 파라메터가 3개인 생성자만 존재한다.
그러면 아래의 메인함수를 실행할 수 있을까?
public class Main {
public static void main(String[] args) {
Pokemon p1 = new Pokemon("피카츄", 50, "백만볼트");
Pokemon p2 = new Pokemon("꼬부기", 25, "물대포");
Pokemon p3 = new Pokemon();
System.out.println(p1.status());
System.out.println(p2.status());
System.out.println(p3.status());
}
}
일반적으로 생각하면 이 코드가 실행되야한다. 왜냐하면 우리는 생성자가 하나도 없던 경우에도,
파라메터가 없는 생성자의 경우에는 실행이 됬기 떄문이다.
이를 디폴트 생성자라고 한다. 디폴트 생성자는 파라메터가 단 하나도 없고 아무 기능도 없는 생성자를 의미한다.
그러나 위 코드가 실행되지 않는 이유는 디폴트 생성자가 소멸됬기 때문이다.
왜냐하면 생성자를 한개라도 사용자가 명시적으로 정의해주면 디폴트 생성자가 소멸하기 때문이다.
이 경우에 파라메터가 0개인 생성자를 명시적으로 선언해 주어야한다.
'Programming > Java' 카테고리의 다른 글
[Java-13]package와 import (0) | 2017.10.21 |
---|---|
[Java-12]static (0) | 2017.10.05 |
[Java-10]생성자와 this (0) | 2017.10.01 |
[Java-09]객체와 클래스 (0) | 2017.09.30 |
[Java-08]배열 (0) | 2017.09.30 |