생성자
모든 클래스에는 하나 이상의 생성자가 있어야 한다.
사용자가 생성자를 생성하지 않는다면 매개변수가 없는 생성자가 자동으로 만들어진다.
클래스이름() {}
위와 같은 형태로 자동으로 생성되는데 보이지만 않을 뿐 항상 클래스가 있는한 항상 존재한다.
이와 같은 형태를 기본 생성자 라고 부른다.
생성자의 선언
사실 지금까지 클래스의 인스턴스 변수를 생성하기 위해 초기화를 했었는데 그때마다
기본 생성자를 호출함으로써 인스턴스 변수를 메모리에 할당한 것이었다.
HangHae a = new HangHae();
위의 코드를 통해 인스턴스 변수를 생성하고 메모리를 할당하는데 new뒤에 HangHae()가
바로 기본 생성자를 호출한다는 말이고 기본생성자는 이미 클래스를 생성했을때부터 자동으로
생성되어 있으므로 그 호출을 받고 클래스에서 인스턴스 변수를 생성해
메모리를 할당받는다.
new는 클래스를 메모리에 올려주세요 라고 요청하는 것이라고 생각하면 된다.
생성자의 사용
class HangHae {
String name;
int number;
public HangHae(String name1, int number1) { // 두개의 매개변수를 받는다
name = name1; // 받아온 매개변수를 인스턴스 변수에 넣어준다
number = number1;// 받아온 매개변수를 인스턴스 변수에 넣어준다
}
}
public class practice7 {
public static void main(String[] args) {
HangHae a1 = new HangHae("철수", 10);
// HangHae 인스턴스를 생성함과 동시에 매개변수를 넘겨준다.
System.out.println(a1.name);
System.out.println(a1.number);
}
}
//---------- 결과 ----------
//철수
//10
this
HangHae 생성자의 매개변수를 클래스의 인스턴스 변수와 이름이 겹쳐지지 않기 위해 임의로
1이라는 숫자를 붙여서 매개변수를 받아왔지만
이름을 동일하게 설정을 하려면 this를 붙여줌으로써 인스턴스 변수와 매개변수를 구분한다.
class HangHae {
String name;
int number;
public HangHae(String name, int number) { // 두개의 매개변수를 받는다
this.name = name; // 받아온 매개변수를 인스턴스 변수에 넣어준다
this.number = number;// 받아온 매개변수를 인스턴스 변수에 넣어준다
//this는 클래스의 인스턴스 변수를 가르킨다.
}
}
public class practice7 {
public static void main(String[] args) {
HangHae a1 = new HangHae("철수", 10);
// HangHae 인스턴스를 생성함과 동시에 매개변수를 넘겨준다.
System.out.println(a1.name);
System.out.println(a1.number);
}
}
//---------- 결과 ----------
//철수
//10
여기서 만약 this를
name = this.name;
number = this.number;
이와 같은 형태로 구성을 한다면
위의 코드는 철수와 10이 아닌 null 과 0 을 출력 할 것이다.
name(생성자의 매개변수)이라는 매개변수를 가져와 인스턴스 변수의 name을 초기화
한다는 뜻이기 때문에
순서가 반대가 된다면 초기화 하지않은 상태의 인스턴스 변수를 매개변수에 넣는다는
말이 되므로 null과 0을 출력하게 된다.
생성자를 왜 써야 하는가
인스턴스를 생성함과 동시에 매개변수를 줌으로써 인스턴스 변수를 초기화하였다.
그러면 의문이 들 수 있다.
그냥 인스턴스를 생성하고 따로 인스턴스 변수를 초기화하면 되는거 아닌가?
생성자를 굳이 사용해야하는 이유는 무엇이지? 단지 생성과 동시에 매개변수를 넘겨줘서??
라는 고민이 들 수 있다.
class HangHae {
String name;
int number;
// public HangHae() {}
}
public class practice7 {
public static void main(String[] args) {
HangHae a2 = new HangHae(); // HangHae 인스턴스 생성
a2.name = "영희"; // HangHae class의 name 인스턴스 변수 초기화
a2.number = 10; // HangHae class의 number 인스턴스 변수 초기화
System.out.println(a2.name);
System.out.println(a2.number);
}
}
//---------- 결과 ----------
//영희
//10
위의 코드를 보면 생성자는 매개변수가 없기에 기본 생성자가 되었지만
각각 의 인스턴스 변수를 초기화해줘야하는 불편함이 있다.
이러한 불편함이 만약에 100명의 정보를 넣어야 한다면 불편함은 배가 될 것이고
또한 인스턴스 변수를 초기화하는 도중 빠트리는 경우가 생길 수도 있기 때문에
생성해야할 인스턴스가 많을 경우엔 생성자에 매개변수를 받을 수 있게끔 한다.
'web > JAVA & Spring' 카테고리의 다른 글
[OOP] 추상클래스와 상속의 차이 (0) | 2022.11.12 |
---|---|
[OOP] 상속 (0) | 2022.11.12 |
[OOP] 메서드 오버로딩(overloading) (0) | 2022.11.12 |
[OOP] 메소드의 종류와 메소드 선언 (0) | 2022.11.11 |
[OOP] 선언 위치에 따른 변수의 종류 (0) | 2022.11.11 |