[Java] 생성자 & 오버로딩(Overloading)
생성자 (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");
}
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;
};
}