생성자
- 생성자는 특수한 형태의 메소드로, 객체 생성시에 객체를 초기화하는데 사용된다.
객체 생성
- 1단계: 메모리 할당
- new 키워드를 사용하여 Heap 영역에 메모리 할당
- 2단계: 생성자를 사용하여 객체 초기화
- 클래스 이름과 괄호를 사용 ```java public class Test { String text;
public Test(String text) { this.text = text; } } class Main{
public static void main(String[] args) { Test test = new Test(“test”); } } ```
위와 같이 new로 선언하고 생성자가 있을경우 필요한 값을 넣어 초기화가 가능하다.
기본 생성자 사용
- 클래스에 생성자에 작성하지 않으면 기본 생성자가 생성됨
- public 접근 제한
- 클래스와 이름이 같음
- return 타입이 없음 - void가 아님
- 파라미터가 없음공격 가능 여부
- 모든 필드는 기본 값으로 초기화
생성자 오버라이딩
- 많은 경우 기본 생성자는 객체 초기화에 적당하지 않음
- 상속되는 기본 생성자 대신 객체만의 기본 생성자를 정의
생성자 오버로딩
- 생성자는 메소드이므로, 오버로딩 할 수 있음
- 같은 범위, 같은 이름, 다른 파라미터를 사용하여 정의
- 객체가 다른 방법으로 초기화 되는 것을 허용
- 주의
- 생성자를 정의하면, 컴파일러는 기본 생성자를 정의하지 않음
초기자 목록
- 오버로드 된 생성자는 같은 코드를 포함할 가능성이 높음
- 생성자를 서로 호출하도록 리팩토링
- this 키워드를 사용하여 초기화 목록을 호출
1
2
3
4
5
6
7
8
9
10
11
12
class Test{
private String text;
public Test(){
this.init("test");
}
public Test(String text){
this.init(text);
}
private void init(String text){
this.text = text;
}
}
위와 같이 init 메서드를 만들어 중복 코드를 줄일수 있다.
상수 선언
- 상수는 컴파일시 초기화 됨
- final 키워드를 사용하여 선언
1
final double pi = 3.14;
위와 같이 선언하면 된다.
private 생성자
- private 생성자는 직접 생성을 원하지 않는 객체 생성을 막아 줌
- 인스턴스 메소드 호출를 먹는 경우의 클래스
- Static 메소드의 호출만을 위한 클래스
- 공유 객체를 위한 데이터를 저장하는 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Test {
public static void main(String[] args) {
Singleton s = Singleton.getSingleton();
Singleton s1 = new Singleton();//error
}
}
class Singleton{
static Singleton singleton;
private Singleton(){}
private Singleton(String s){}
public static Singleton getSingleton(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
생성자를 private 선언시 s1과 같이 객체 생성을 막을 수 있다.
Static 생성자
- static 생성자는 객체 인스턴스가 생성되기 전에 동작됨
- static 필드를 초기화 함
- Java는 static 생성자를 지원하지 않음