티스토리 뷰

생성자

  • 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
  • 인스턴스 생성 시 수행할 작업(iv 초기화)에 사용
더보기

인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’

  • 생성자는 iv 초기화 메서드 ⭐️
  • 객체는 'iv집합'
  • 생성자를 만드는 이유 : iv 초기화를 편리하게 하기 위해

 

인스턴스 생성 시 수행할 작업(iv 초기화)에 사용

  • 인스턴스 생성 시 수행할 작업은 { } 안에 작성해준다.

 

생성자 조건

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 없다.(void 안 붙임)
  3. 모든 클래스는 반드시 한 개 이상의 생성자를 가져야 한다.
더보기

1. 생성자의 이름은 클래스의 이름과 같아야 한다.

2. 생성자는 리턴 값이 없다.(void 안 붙임)

3. 모든 클래스는 반드시 한 개 이상의 생성자를 가져야 한다.

  • 기본 생성자

기본 생성자

Card c = new Card();
            // ↑ Card() : 생성자 호출(기본 생성자)
  1. 객 체 생성 시 Card() 이 부분이 알고보기 생성자 호출 코드였다.
  2. 생성자가 있어야 호출을 할 텐데, 우리는 생성자를 만들어준 적이 없다.
  3. Card()는 기본 생성자라 하는 것인데, 생성자가 하나도 없을 때 컴파일러가 자동으로 추가해준다.

 

기본 생성자

  • 매개변수가 없는 생성자
  • 생성자가 하나도 없을 때만, 컴파일러가 자동 추가
더보기

매개변수가 없는 생성자

클래스이름() {}    // 기본 생성자

Point() {}        // Point클래스의 기본 생성자

 

생성자가 하나도 없을 때만, 컴파일러가 자동 추가

  • 클래스를 작성할 때, 기본 생성자를 꼭 만들어야 한다. ⭐

 

예제6-11

더보기

The constructor ch06.Data_2() is undefined

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
The constructor ch06.Data_2() is undefined

at ch06.Ex6_11.main(ch06.Ex6_11.java:16)

 

해석 : 기본 생성자가 정의되지 않았기 때문에 에러가 발생했다.

 

  • Data_1클래스는 생성자가 하나도 없기 때문에, 컴파일러가 기본 생성자를 자동 추가하지만,
  • Date_2클래스는 '매개변수 있는 생성자'가 정의되어있기 때문에 기본 생성자가 자동 추가되지 않는다.
  • 따라서, 클래스를 작성할 때, 기본 생성자를 꼭 만들어야 한다. ⭐

 

매개변수가 있는 생성자

  • 매개변수가 있는 생성자를 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 iv를 초기화할 수 있다.
더보기

매개변수가 있는 생성자를 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 iv를 초기화할 수 있다.

  • 인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야 한다.
  • 1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  • 2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
Car c = new Car("white", "Auto", 4);
/*
     1. 참조변수 선언(Car c)
     2. 객체 생성(new)
     3. 객체 초기화(생성자 호출, Car("white", "Auto", 4))
     4. 참조변수와 객체 연결(=)
*/
class Car {
    String color;
    String gearType;
    int door;
    
    Car() {}    // 기본생성자
    Car(String c, String g, int d) {    // 매개변수가 있는 생성자
    	color = c;
        gearType = g;
        door = d;
    }
}
위의 양쪽 코드 모두 같은 내용이지만, 오른쪽의 코드가 더 간결하고 직관적이다. 이처럼 클래스를 작성할 때 다양한 생성자를 제공함으로써 인스턴스 생성 후에 별도로 초기화를 하지 않아도 되도록 하는 것이 바람직하다.

 

예제6-12

 

생성자 this()

  • 생성자에서 같은 클래스의 다른 생성자 호출할 때 사용
  • 다른 생성자를 호출 시 첫 줄에서만 호출 가능
  • 코드의 중복을 제거하기 위해 사용
더보기

생성자에서 다른 생성자 호출할 때 사용

class Car {
    String color;    // 색상
    String gearType; // 변속기 종류 - auto(자동), manual(수동)
    int door;        // 문의 개수
	
    Car() {
        this("white", "auto", 4); // Car(String color, String gearType, int door)호출
    }

    Car(String color) {
        this(color, "auto", 4);
    }

    Car(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

 

다른 생성자를 호출 시 첫 줄에서만 호출 가능

코드의 중복을 제거하기 위해 사용

 

예제6-13

 

참조변수 - this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서만 this 사용 가능
  • 지역변수(lv)와 인스턴스변수(iv)를 구별할 때 this 사용
더보기

인스턴스 자신을 가리키는 참조변수

  • 인스턴스의 주소가 저장되어 있다.
  • 모든 인스턴스메서드(생성자 포함)에 지역변수로 숨겨진 채 존재한다.
  • 같은 클래스 내에서 생략 가능

 

인스턴스 메서드(생성자 포함)에서만 this 사용 가능

  • static메서드에서 사용 불가

 

지역변수(lv)와 인스턴스변수(iv)를 구별할 때 this 사용

  • this.변수명 == iv

 

 참조변수 this와 생성자 this()

  • this인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
  • this(), this(매개변수) 생성자. 같은 클래스의 다른 생성자를 호출할 때 사용한다.

| 참고 | this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것이다. this는 '참조변수'이고, this()는 '생성자'이다.

 


참조변수 super

  • 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수
  • 조상 멤버와 자신 멤버를 구별할 때 사용( this : 멤버변수와 지역변수 구별할 때 사용)
  • 인스턴스 메서드(또는 생성자)내에만 존재( this : static 메서드에서 사용 불가)

 

예제7-2

더보기

변수 이름이 x로 동일하지만, this.x와 super.x로 조상 멤버와 자신 멤버를 구별할 수 있다.

Ex7_2 실습하기 - Child클래스 구조

 

예제7-3

더보기

this.x와 super.x가 같은 변수를 가리키는 경우

 

super() - 조상의 생성자

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화(생성자, 초기화 블럭 제외)
  • 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. ⭐⭐⭐
    그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
더보기

조상의 멤버는 조상의 생성자를 호출해서 초기화

  • 생성자, 초기화 블럭 상속 X

 

생성자의 첫 줄에 반드시 생성자를 호출해야 한다. ⭐⭐⭐

 

예제PointTest

더보기
class Point4 {
	int x;
	int y;

	Point4(int x, int y) {
		this.x = x;    // 컴파일 후 - Object();  // 모든 생성자는 첫 줄에 다른 생성자를 호출해야 한다.
		this.y = y;
	}

	String getLocation() {
		return "x : " + x + ", y : " + y;
	}
}
public class PointTest {

	public static void main(String[] args) {
		Point4_3D p3 = new Point4_3D(1, 2, 3);
		System.out.println(p3.getLocation());
	}

}

1. 조상의 생성자 super() 작성 안 할 경우

class Point4_3D extends Point4 {
	int z;

	Point4_3D(int x, int y, int z) {

		this.x = x;
		this.y = y;
		this.z = z;
	}  // Implicit super constructor Point4() is undefined. Must explicitly invoke another constructor

	String getLocation() {
		return "x : " + x + ", y : " + y + ", z : " + z;
	}  // 오버라이딩
}

결과

Implicit super constructor Point4() is undefined. Must explicitly invoke another constructor


2. 조상의 생성자 super() 작성 할 경우

class Point4_3D extends Point4 {
	int z;

	Point4_3D(int x, int y, int z) {
		super(x, y);
		this.z = z;
	}

	String getLocation() {
		return "x : " + x + ", y : " + y + ", z : " + z;
	}  // 오버라이딩
}

결과

x : 1, y : 2, z : 3

 

🍪

📄 - 객체지향개념 암기노트 바로가기

'Java의 정석_기초편' 카테고리의 다른 글

상속(Inheritance)  (0) 2022.10.13
변수의 초기화  (0) 2022.10.13
오버로딩(overloading)과 오버라이딩(overriding)  (0) 2022.10.12
변수와 메서드  (0) 2022.10.11
클래스와 객체  (0) 2022.10.10
댓글
공지사항