본문 바로가기

언어 기초/JAVA

[자바의정석 | Chapter 06 객체지향 프로그래밍1] 생성자

1. 학습목표

생성자에 대해 이해할 수 있다.

2.필요 개념 문장정리

생성자

  • 생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다. 인스턴스초기화란 인스턴스변수들을 초기화하는 것을 뜻한다.
  • 생성자 역시 메서드처럼 클래스 내에 선언되며 구조도 메서드와 유사하지만 리턴값이 없다는 점이 다르다.
    1.생성자의 이름은 클래스의 이름과 같아야한다.
    2.생성자는 리턴값이 없다.

출처 - 자바의정석

  • 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
  • 생성자는 단순히 인스턴스변수들의 초기화에 사용되는 메서드일 뿐이다.

card c = new Card();

  1. 연산자 new에 의해서 메모리에 Card클래스의 인스턴스가 생성된다.
  2. 생성자 Card()가 호출되어 수행된다.
  3. 연산자 new의 결과로 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
  • 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어야 한다.
  • 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 기본생성자 때문이다.
  • 컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 클래스내에 생성자가 하나도 없을때 뿐이다.
  • 매개변수가 있는 생성자를 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 초기화를 할 수 있다.
  • 클래스를 작성할 때 다양한 생성자를 제공함으로써 인스턴스 생성 후에 별도로 초기화를 하지 않도록 한다.

 

this(),this 

  • 생성자간에 호출은 생성자의 이름으로 클래스 대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 3. 코드작성

class Car {
	String color;
    String gearType;
    int door;
    
    Car() {
    	this("white", "auto", 4);
    }
    
    Car(String color){
    	this("color", "auto", 4);
    }
    
    Car(String color, String gearType, int door) {
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

class CarTest2 {
 	public static void main (String[] args) {
 		Car c1 = new Car();
        Car c2 = new Car("blue");
        
        System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType + ", door=" + c1.door);
        System.out.println("c1의 color=" + c2.color + ", gearType=" + c2.gearType + ", door=" + c2.door);
        }
}

실행결과
c1의 color=white, gearType=auto, door=4
c2의 color=blue, gearType=auto, door=4

출처 - 자바의 정석

  • 생성자의 매개변수로 선언된 변수 이름이 인스턴스변수와 같을 경우에는 인스턴스변수 앞에 this를 사용하면 된다.
  • this는 인스턴스 자신을 가리키며 인스턴스변수에 접근할 수 있다.
  • static메서드에서는 인스턴스를 생성하지 않고도 호출될 수 있으므로 this는 사용할 수 없다.
    this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어있다. 모든 인스턴스메더스에 지역변수로 숨겨진 채로 존재
    this(), this(매개변수) 생성자, 같은 클래스의 다른생성자를 호출할 때 사용한다.

4. 마무리

this의 쓰임에 대해 이해할 수 있었다. 하지만 개발과정에서 구체적으로 어떻게 사용되는 더 공부해야할 것 같다.