메서드 오버로딩(method overloading)
[예제 1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | public class OverloadingTest { public static void main (String[] args) { MyMath3 mm3 = new MyMath3(); System.out.println("mm3.add(3,3) 결과 : "+mm3.add(3,3)); System.out.println("mm3.add(3L,3) 결과 : "+mm3.add(3L,3)); System.out.println("mm3.add(3,3L) 결과 : "+mm3.add(3,3L)); System.out.println("mm3.add(3L,3L) 결과 : "+mm3.add(3L,3L)); int[] a = {100,200,300}; System.out.println("mm3.add(a) 결과 : "+mm3.add(a)); } } class MyMath3 { int add(int a, int b) { return a+b; } long add(int a, long b) { return a+b; } long add(long a, int b) { return a+b; } long add(long a, long b) { return a+b; } int add(int a[]) { int result = 0; for(int i=0;i<a.length;i++) result +=a[i]; return result; } } | cs |
[실행결과]
생성자(constructor)
<생성자란>
인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드' 이다. 주로 인스턴스 변수의 초기화 작업에 사용되며, 인스턴스 생성 시 실행되어야 할 작업을 위해서도 사용된다.
<생성자의 조건>
1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴값이 없다. (단, return; 은 사용가능, break; 와 유사하다고 볼 수 있다.)
<생성자의 정의>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 클래스 이름( 타입 변수명, 타입 변수명...) { // 수행코드, 초기화 코드... } class Card { Card() // 매개변수 없는 생성자 { // 내용.... } Card(int number) // 매개변수 있는 생성자 { // 내용.... } } | cs |
<기본 생성자>
모든 클래스에는 반드시 하나 이상의 생성자가 정의되 있어야 한다. 그러나 생성자를 따로 정의하지 않아도 문제가 없었다. 이유는 컴파일러가 알아서 생성하는 기본 생성자 때문이다.
소스파일에 생성자가 따로 정의되어 있지 않다면 컴파일시 클래스이름() { } 의 형태로 기본생성자가 추가된다.
[예제 2]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class ConstrustorTest { public static void main (String[] args) { Data_01 d1 = new Data_01(); Data_02 d2 = new Data_02(); // 매개변수가 있는 생성자 존재하므로 // 값을 넣지 않으면 에러 // 클래스내에 생성자가 있 자동으로 기본 생성자가 추가되지 않음 } } class Data_01 { int value; } class Data_02 { int value; Data_02(int x) { value = x; } } | cs |
[실행결과]
위의 예제를 실행하면 에러가 난다. Data_02 클래스에 임의로 생성자를 정의해 두었는데 이렇게 생성자가 1개라도 정의되어 있다면 기본생성자는 자동으로 추가되지 않는다.
이를 해결하려면 기본생성자를 직접 정의해 놓거나 아니면 Date_02 인스턴스 생성시 값을 넣어주면 된다. (Date_02(2) 이런식으로)
<매개변수가 있는 생성자>
생성자도 메서드 처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다.
[예제 3]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public class CarTest { public static void main (String[] args) { Car c1 = new Car(); c1.color = "White"; c1.gearType = "auto"; c1.door = 4; Car c2 = new Car("White","auto", 4 ); System.out.println("c1 = "+c1.color+", "+c1.gearType+", "+c1.door); System.out.println("c2 = "+c2.color+", "+c2.gearType+", "+c2.door); } } class Car { String color; // 색상 String gearType; // 변속기 종류 int door; // 문의 개수 Car() {} // 매개변수 있는 생성자 Car(String c, String g, int d) { color = c; gearType = g; door = d; } } | cs |
[실행결과]
위의 예제에서 매개변수가 있는생성자를 이용하지 않을 경우 c1.color = "White"; 처럼 하나하나 변수를 초기화 시켜야 한다. 매개변수가 있는 생성자를 이용하면 인스턴스 생성시 바로 변수의 초기화 작업을 할 수 있다.
<생성자에서 다른 생성자 호출 - this(), this>
생성자 간에도 서로 호출이 가능하나 2개의 조건을 만족해야 한다.
1. 생성자의 이름으로 클래스이름 대신 this르 사용한다.
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
[예제 4]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | public class CarTest2 { public static void main (String[] args) { Car1 c1 = new Car1(); Car1 c2 = new Car1("Blue"); // c1 => Car1() 생성자 호출 // c2 => Car1(String color) 생성자 호출 System.out.println("c1 = "+c1.color+", "+c1.gearType+", "+c1.door); System.out.println("c2 = "+c2.color+", "+c2.gearType+", "+c2.door); } } class Car1 { String color; // 색상 String gearType; // 변속기 종류 int door; // 문의 개수 Car1() { this("White","auto", 4); // Car1(String c, String g, int d) 호출 } Car1(String color) { this(color,"auto", 4); } Car1(String c, String g, int d) { this.color = c; // 여기서 this는 맴버변수 this.gearType = g; this.door = d; } } | cs |
[실행결과]
this는 참조변수로 인스턴스 자신을 가르킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는것처럼, this로 인스턴스 변수에 접근할 수 있는 것이다. 단 this를 사용할 수 있는 것은 인스턴스멤버 뿐이다.
<this와 this()의 차이>
- this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
- this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
'코딩 > Java' 카테고리의 다른 글
자바 - 상속 (0) | 2016.09.13 |
---|---|
자바 - 접근제어자 (3) | 2016.09.12 |
객체지향 2부 - 변수, 메서드 (0) | 2016.09.10 |
객체지향 1부 - 특징, 클래스와 객체 (0) | 2016.09.07 |
자바 오버로딩(Overloading) (0) | 2016.09.06 |