메소드 및 데이터 멤버에서 Java의 객체는 생성될 때 초기화된다는 점을 언급했습니다. 초기화하는 동안 개체의 데이터 멤버에 초기 값이 할당됩니다. 명시적으로 초기화할 수 있습니다. 데이터 멤버에 초기값을 할당하지 않으면 데이터 멤버는 해당 유형에 따라 기본 초기값을 채택합니다.
명시적 초기화를 위해서는 프로그램을 작성할 때 초기값을 결정해야 하는데, 이는 때때로 불편할 수 있습니다. 생성자를 사용하여 객체를 초기화할 수 있습니다. 생성자는 데이터 멤버를 초기화하고 특정 작업을 지정할 수 있습니다. 이러한 작업은 객체가 생성될 때 자동으로 수행됩니다.
생성자 정의
생성자는 메서드입니다. 일반적인 메소드와 마찬가지로 클래스에서 생성자를 정의합니다. 생성자는 다음과 같은 기본 특성을 갖습니다.
1. 생성자의 이름은 클래스의 이름과 동일합니다.
2. 생성자에는 반환 값이 없습니다.
Human 클래스의 생성자를 정의합니다.
public class Test{ public static void main(String[] args) { Human aPerson = new System.out.println(aPerson.getHeight()) }}class Human{ /** * 생성자 */ Human (int h) { this.height = h; System.out.println("나는 태어났습니다") } /** * 접근자 */ int getHeight() { return this.height; 정수 높이;}
위 프로그램은 복사된 코드를 다음과 같이 인쇄합니다.
나는 태어났다
160
생성자는 일반 메서드와 마찬가지로 매개변수 목록을 받을 수 있습니다. 여기서 생성자 Human()은 정수를 매개변수로 받습니다. 메서드 본문에서는 정수 매개변수를 데이터 멤버 높이에 할당합니다. 생성자는 객체가 생성될 때 두 가지 작업을 수행합니다.
생성자는 일반 메서드와 마찬가지로 매개변수 목록을 받을 수 있습니다. 여기서 생성자 Human()은 정수를 매개변수로 받습니다. 메서드 본문에서는 정수 매개변수를 데이터 멤버 높이에 할당합니다. 생성자는 객체가 생성될 때 두 가지 작업을 수행합니다.
1. 데이터 멤버의 초기값을 제공합니다. this.height = h;
2. 특정 초기 작업을 수행합니다. System.out.println("I'm Born");
이러한 방식으로 명시적 초기화만큼 제약을 받지 않고 생성자를 호출할 때 초기 값을 유연하게 설정할 수 있습니다.
생성자는 어떻게 호출됩니까? 클래스를 만들 때 우리는 모두 new Human()을 사용합니다. 실제로 우리는 Human 클래스의 생성자를 호출하고 있습니다. 이 메소드를 정의하지 않으면 Java는 new를 사용할 때 호출될 빈 생성자를 제공합니다. 그러나 생성자를 정의하면 Java는 객체를 생성할 때 정의된 생성자를 호출합니다. 호출 시 매개변수 160을 제공합니다. 또한 최종 실행 결과에서 객체의 높이가 실제로 160으로 초기화되었음을 확인할 수 있습니다.
초기화 방법 우선순위
메서드와 데이터 멤버에서 명시적인 초기 값을 제공하면 데이터 멤버가 기본 초기 값 대신 명시적인 초기 값을 사용한다는 것을 알 수 있습니다. 그러나 명시적인 초기 값을 제공하고 생성자에서 동일한 데이터 멤버를 초기화하는 경우 최종 초기 값은 생성자에 의해 결정됩니다. 예를 들어 다음 예는 다음과 같습니다.
public class Test{ public static void main(String[] args) { Human aPerson = new System.out.println(aPerson.getHeight()) }}class Human{ /** * 생성자 */ Human (int h) { this.height = h; } /** * 접근자 */ int getHeight() { return this.height } // 명시적 초기화}
실행 결과는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
160
객체의 최종 초기화 값은 생성 메서드의 값과 일치합니다. 그러므로:
빌드 방법 > 명시적 초기화 > 기본 초기화
(실제로 소위 우선순위는 초기화 시 실행 순서와 관련이 있는데, 이에 대해서는 나중에 자세히 알아보도록 하겠습니다.)
메소드 오버로딩
클래스는 둘 이상의 생성자를 정의할 수 있습니다. 예를 들면 다음과 같습니다.
public class Test{ public static void main(String[] args) { Human neZha = new Human(150, "shit"); System.out.println(neZha.getHeight()); class Human{ /** * 생성자 1 */ Human(int h) { this.height = h; System.out.println("나는 태어났습니다") } /** * 생성자 2 */ Human(int h, String s) { this.height = h; System.out.println("Ne Zha: 저는 태어났습니다, " + s) } /** * 접근자 */ int getHeight() { return this.height; ;}
실행 결과:
다음과 같이 코드 코드를 복사합니다.
Ne Zha: 내가 태어났어, 젠장
150
위에는 두 개의 생성자가 정의되어 있으며 둘 다 Human이라는 이름을 갖습니다. 두 생성자는 서로 다른 매개변수 목록을 갖습니다.
new를 사용하여 객체를 생성할 때 Java는 제공된 매개변수를 기반으로 빌드할 생성자를 결정합니다. 예를 들어, neZha를 빌드할 때 정수 150과 두 번째 빌드 메소드의 매개변수 목록에 해당하는 문자열 "shit"이라는 두 개의 매개변수를 제공하므로 Java는 두 번째 빌드 메소드를 호출합니다.
Java에서는 메소드 이름과 매개변수 목록을 기반으로 호출할 메소드를 결정합니다. 이를 메소드 오버로딩이라고 합니다. 빌드 메서드는 오버로드될 수 있으며 아래의 Breath() 메서드와 같은 일반 메서드도 오버로드될 수 있습니다.
public class Test{ public static void main(String[] args) { Human aPerson = new Human() aPerson.breath(10) }}class Human{ /** * Breath() 1 */ void Breath() { System.out.println("hu...hu...") } /** *breath() 2 */ voidbreath(int rep) { int i for(i = 0; i < rep; i++ ) { System.out.println("lu...lu...") } } int height;}
실행 결과:
다음과 같이 코드 코드를 복사합니다.
루...루...
루...루...
루...루...
루...루...
루...루...
루...루...
루...루...
루...루...
루... 루...
루...루...
보시다시피, 호출 중에 매개변수(정수 10)가 제공되므로 매개변수 목록이 일치하는 두 번째 Breath() 메서드가 호출됩니다.
요약
생성자 특성: 클래스와 동일한 이름, 반환 값 없음
생성자 목적 : 초기화, 초기 연산 메소드 오버로딩 : 메소드 이름 + 매개변수 목록 -> 실제로 호출되는 메소드