클래스는 초기화를 위하여 생성자(constructor)라는 특별한 코드 블록을 가질 수 있다. 즉, 생성자는 클래스가 new 표현식에 의해 인스턴스화되어 객체를 생성할 때 객체의 레퍼런스를 생성하기 전에 객체의 초기화를 위해 사용되는 코드의 블록이다.
따라서, 생성자는 자바 클래스의 멤버가 아니며, 멤버가 아니므로 상속되지 않는다. 따라서, 오버라이딩의 대상이 될 수도 없다. 또한, 일반적인 메소드 호출방법으로 호출할 수 없다.
생성자는 클래스의 생성시에 단 한번만 호출되며, 객체의 초기화를 담당하게 된다. 일반 메소드와는 달리 필요할 때마다 호출될 수 없다. 이러한 생성자는 new 표현식으로 객체를 생성할 때 주어진 파라미터에 따라 일치하는 생성자가 실행된다.
생성자가 여러 개일 때, 다른 생성자를 호출할 수가 있다. 이때 사용되는 특별한 코드가 this 이다. 객체가 자기 자신을 참조할 때 사용하는 this는 생성자를 호출하기 위한 특별한 형태인 this()를 통하여 클래스 내의 다른 생성자를 호출할 수 있게 된다.
<this와 super의 구분>
그러나, this()를 통한 생성자의 호출은 오직 생성자에서만 가능하고, 생성자의 맨 첫 줄에서 단 한번만 호출이 가능하다. this()는 파라미터가 없는 생성자를 호출하는 형태이고, int 형의 파라미터를 두개 가지고 있는 생성자를 호출하려면 this(12,10)처럼 적합한 파라미터 리스트로 호출한다.
동일한 개념과 방법으로 부모 클래스의 생성자를 호출하는 방법은 super() 이다. super는 상속에서 부모 객체를 참조할 수 있도록 해준다. 그러나 super의 특수한 형태인 super()는 부모 클래스의 생성자를 호출할 수 있도록 해준다. 단, this()와 마찬가지로 생성자는 메소드가 아니므로, super() 역시 생성자 내에서만 호출 가능하며, 생성자의 맨 첫 줄에서 단 한번만 사용가능하다. super(10,20) 처럼 생성자의 시그너쳐에 따라 파라미터를 적용할 수 있다.
class Carr {
String color; // 색상
String gearType; // 변속기 종류
int door;
Carr() {
this("white", "auto", 4); // 같은 클래스 내의 다른 생성자인 Carr(String color, String gearType, int door)을 부르기위해 생성자 this 사용.
}
Carr(String color) {
this(color, "auto", 4);
}
Carr(String color, String gearType, int door) {
this.color = color; // 클래스 color는 클래스 color 안에 있는 설계도인 생성자 car(String color-1)에서 새롭게 지정된 color-1라는 매개변수의 값과 합체된것. , color-1은 설계도 안에서 노는 값. 즉 지역변수일 뿐이다. 객체라는 실체가 없다.
this.gearType = gearType;
this.door = door;
}
}
public class EEx25_1018 {
public static void main(String[] args) {
Carr c1 = new Carr();
Carr c2 = new Carr("blue");
System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door );
System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door );
}
}
클래스는 생성자의 묶음 단위.
Car c1 = new Car() 여기서 new Car() 이라는 객체는 Car클래스 내의 기본 생성자임.(물론 지금처럼 값을 지정해줄수도 있다.)매개변수는 Car 클래스라는 큰 설계도가, 생성자를 통해 객체와 연결될 수 있도록 하는 변수이며 지역변수이다.(p.298 그림 및 설명 참고.)
클래스는 생성자와 인스턴스 변수 메서드의 묶음체이다.
생성자끼리는 서로 연결가능하다(this()) 즉, 하나의 생성자가 인스턴스변수와 연결되면 다른 생성자들도 다 인스턴스변수와 연결되는 것이다.
사실상, 매개변수로 다른 메서드에서 다른 클래스를 있는 것도 가능하고, 다른 객체에서 값을 가져오는 까지 가능하다.
값만 들고 오는 것이 기본형 참조변수./ 값을 주소값으로 연결해서 들고올수도 있고 수정까지 가능한 것이 참조형 매개변수이다.
'📟java' 카테고리의 다른 글
JAVA 2달차 점검 (1) | 2022.10.20 |
---|---|
Unresolved compilation problem (0) | 2022.10.17 |
프로그래밍 수정 method <init>()V not found (0) | 2022.10.11 |