본문으로 바로가기

객체지향 3부 - 오버로딩, 생성자

category 코딩/Java 2016. 9. 11. 09:00





메서드 오버로딩(method overloading)


자바 오버로딩(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
RSS구독 링크추가 트위터 이메일 구독