지구정복
[JAVA] 생성자 본문
ㅁ생성자
ㅇ생성자란
new연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당
객체초기화란 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것
new 연산자에 의해 생성자가 성공적으로 실행되면 힙 영역에 객체가 생성되고 객체의 주소를 리턴
ㅇ기본 생성자
모든 클래스는 생성자가 무조건 존재, 생성자를 하나 이상 가질 수 있다.
클래스 설계시 생성자를 명시하지 않아도 기본 생성자가 생성된다. 기본 생성자는 아래와 같다.
public class Car {
//기본생성자 -> 자동으로 생성
public Car() { }
}
ㅇ생성자 선언
생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일하다.
필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용 전에 필요한 준비를 한다.
객체 생성시 매개변수는
new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 한다.
아래는 매개변수를 받기 위한 생성자 선언 방법이다.
public class Car {
//매개변수를 받기위한 생성자 선언
public Car(String model, String color, int maxSpeed) { }
}
public static void main(String[] args) {
//객체 생성시 매개변수를 입력해서 호출
Car mycar = new Car("그랜저", "검정", 300);
}
ㅇ필드 초기화
클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다.
만약 필드값을 다르게 하고 싶다면 두 가지 방법이 있다.
첫 번째는 클래스에서 필드를 선언할 때 초기값 주는 방법
두 번째는 생성자에서 초기값을 주는 방법
만약 클래스를 설계할 때 초기값이 정해져 있으면 첫 번째 방법으로 설정하면 된다.
만약 클래스를 설계할 때 초기값을 모르고 객체 생성 시점에 외부에서 제공되는 값들로 초기화해야 된다면
두 번째 방법으로 설정하면 된다.
public class Korean {
//필드, nation은 미리 초기화한다.
String nation = "대한민국";
String name;
String ssn;
String phone;
//생성자, 초기값을 알 수 없으니 객체 생성시 매개값을 이용해서 필드를 초기화한다.
public Korean(String name, String ssn, int phone) {
this.name = name;
this.ssn = ssn;
this.phone = phone;
}
}
위 코드에서 this. 는 객체 자기 자신을 가리키는 명령어. 이를 사용하는 이유는
필드로 사용될 매개변수의 이름은 필드와 동일하게 사용하는 것이 좋다.
하지만 name = name 으로 사용하면 오류가 발생하므로
this.name = name; 으로 사용해야 한다.
이 문장의 뜻은 "Korean객체의 필드 name 은 매개변수 name 값으로 초기화한다." 와 같다.
ㅇ생성자 오버로딩
위의 코드에서 클래스 설계시 필드의 초기값을 알 수 없어서 매개값을 이용해서 필드를 초기화하는 방법으로 생성자를
정의했다고 가정하자.
name과 ssn 값을 모두 알면 좋겠지만 둘 중에 하나만 알 수도 있고 둘 다 모르는 경우로 객체를 생성하는 경우도 있을 수 있다.
따라서 매개변수가 제공되는 여러가지 경우의 수에 따른 생성자가 필요하게 된다.
이를 위해 자바는 다양한 방법으로 객체를 생성할 수 있도록 하는 생성자 오버로딩을 제공한다.
예시는 아래 코드와 같다.
public class Korean {
Korean() {}
Korean(String name) {}
Korean(String ssn) {}
Korean(String phone) {}
Korean(String name, String ssn) {}
등등
}
ㅇ다른 생성자 호출
만약 생성자 오버로딩을 하는데 매개변수의 값이 많아서 오버로딩해야할 생성자 수가 너무 많은 경우나
생성자 내용이 비슷해서 계속적으로 중복되는 생성자가 있을 수 있다.
이럴 때에는 this() 명령어를 이용해서 미리 정의된 다른 생성자를 가져다가 사용할 수 있다.
이때 주의할 점은 this() 명령어는 반드시 생성자 첫 줄에 작성해야 한다.
만약 아래 코드와 같이 중복되는 코드가 있다고 가정하자.
Korean(String name) {
this.name = name;
this.ssn = "000101-1234567";
this.phone = "010-1111-1111";
}
Korean(String name, String ssn) {
this.name = name;
this.ssn = ssn;
this.phone = "010-1111-1111";
}
Korean(String name, String ssn, String phone) {
this.name = name;
this.ssn = ssn;
this.phone = phone;
}
이제 중복되는 코드를 this() 를 사용해서 아래코드처럼 바꾼다.
//공통실행 생성자
Korean(String name, String ssn, String phone) {
this.name = name;
this.ssn = ssn;
this.phone = phone;
}
Korean(String name) {
this(name, "000101-1234567", "010-1111-1111");
}
Korean(String name, String ssn) {
this(name, ssn, "010-1111-1111");
}
[참조]혼자공부하는자바 -신용권
'데이터 엔지니어링 정복 > JAVA & JSP' 카테고리의 다른 글
[JAVA] 인스턴스 멤버와 정적멤버 (0) | 2020.10.27 |
---|---|
[JAVA] 메소드 (0) | 2020.10.26 |
[JAVA] 필드 (0) | 2020.10.26 |
[JAVA] 객체와 클래스 (0) | 2020.10.26 |
[Java] JVM과 메모리 사용 영역 (0) | 2020.10.23 |