카테고리 없음

[Java] 생성자 & 오버로딩(Overloading)

kimphoby 2023. 3. 3. 15:53

생성자 (Constructure)

: 인스턴스 초기화 메서드. 

 

여기서 주의할 것은 생성자는 단지 메서드에 불과하다는 것이다. 생성자를 사용한다고 해서 바로 힙메모리에 값을 초기화 할 수 있는 것이 아니라, new 연산자에 의해 공간이 할당된 후, 생성자 메서드에서 값을 반환해 저장하는 것이다. 즉, 연산자 new가 인스턴스를 생성하는 것이고, 생성자가 인스턴스를 생성하는 것이 아니다. 

 

** 생성자의 이름은 클래스의 이름과 같아야 한다.

 

난 지금까지 생성자를 따로 정의하지 않았는데 어떻게 실행시킬 수 있었을까? 그 이유는 따로 정의하지 않은 경우, default constructor, 기본 생성자가 자동으로 제공되기 때문이다. 이 기본 생성자는 매개변수로 값을 따로 받지 않기 때문에 우리가 메인함수에서 t1.tableNumber  = 1 ; 이런식으로 따로 초기화해주어야 했다. 이제 매개변수가 있는 생성자를 알아보자. 

 

매개변수가 있는 생성자

 

tableSales t1 = new tableSales(1,2,"Nick") ;

코드 한줄로 세개의 변수를 초기화했다. 

tableSales(int tn, int nop, String name){
    tableNumber = tn ;
    numOfPersons = nop;
    nameOfReservation = name;
}
생성자에서 매개변수를 통해 각 세개의 변수값을 받아 초기화를 해주었기 떄문이다.
 

생성자 내부에서 생성자 호출하기

 this()

tableSales(int tn, int nop, String name){
    tableNumber = tn ;
    numOfPersons = nop;
    nameOfReservation = name;
}
tableSales(int tn){
    this(tn,4,"Yoon");
}
아래의 생성자는 매개변수가 1개이다. 하지만 다른 생성자를 이용해 줌으로써 1개의 변수만 입력받고 나머지 두 변수는 값을 지정할 수 있었다. 동일한 클래스 내의 생성자들은 유기적으로 연결되어있다고 볼 수 있다.
* 주의할 점은 반드시 첫줄에서만 호출해야한다. 

this

public class tableSales {
    // 멤버 변수
    int tableNumber ;
    int numOfPersons ;
    String nameOfReservation ;

 

tableSales(int tableNumber, int numOfPersons, String nameOfReservation){
    this.tableNumber =tableNumber  ;
    this.numOfPersons = numOfPersons;
    this.nameOfReservation = nameOfReservation;
}

생성자의 매개변수와 클래스의 인스턴스 변수 명이 같은 경우 이 둘을 구별해주기위해 앞에 this를 붙인다. 

this.tableNumber ==> 인스턴스 변수 

tableNumber  ==> 생성자의 매개변수 (지역 변수)

로 구분할 수 있는 것이다. 

메서드 오버로딩(Overloading) _ 메서드명을 과적하다. 

같은 이름의 메서드를 여러번 정의해도 될까?
결론은 가능하다. 

그러나 메서드는 구별될 수 있어야 한다. 그 구별은 바로 '매개변수의 갯수 or 타입'로 가능해진다. 

메서드의 이름이 같아도, 매개변수의 갯수 혹은 변수 타입(type)이 다르다면 다른 메서드로 인정될 수 있는 것이다. 

"메서드 명이 같지만, 매개변수가 다르다면 그것들은 다른 메서드이다."

 

- 오버로딩의 조건

1. 메서드 명이 같다. 
2. 매개변수의 갯수나 타입이 다르다. 

 

- 오버로딩 사용 이유, 장점

메서드가 단지 이름만으로 구별된다면, println  출력 함수는 StringPrintln, IntPrinln, DoublePrintln 등으로 각기 다른 이름으로 선언된어야 할 것이다. 근본적으로는 같은 기능(func)을 하지만, 받아들이는 변수가 다른 경우에 활용도가 높은 것이다. 

public class overloading {
    int add(int a, int b) {return a+b;};
    String add( String a, String b){return a+b;};
    long add(int[] arr){
        long res = 0;
        for(int i=0; i<arr.length; i++){
            res += arr[i];
        }
        return res;
    };
}