728x90

이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.

그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.

그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(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

+ Recent posts