Java : 생성자, this, this()

커비·2024년 11월 14일
0

Java

목록 보기
42/55

생성자

객체가 생성될 때 호출되며 객체를 초기화하는 역할을 수행함

생성자 선언과 호출

public Car(){} // 선언
...
Car car = new Car(); // 호출
  • 생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일함
  • new 연산자에 의해 객체가 생성되면서 Car(); 생성자가 호출됨

기본 생성자

선언할 때 괄호() 안에 아무것도 넣지 않은 생성자를 의미함

  • 모든 클래스는 반드시 생성자가 하나 이상 존재
  • 만약 클래스에 생성자를 하나도 선언하지 않았다면 컴파일러는 기본 생성자를 바이트 코드 파일에 자동으로 추가 시켜줌. 이럴 때에는 기본 생성자 생략이 가능함.
public class Car {
	// 생성자 선언
	public Car(String model){}
    //생성자가 한개 이상 선언되었기 때문에 기본 생성자를 추가하지 않음
}
  • 반대로 단 하나라도 생성자가 선언되어있다면 컴파일러는 기본 생성자를 추가하지 않음
public class Car {
	// 컴파일러가 추가시켜줌
	public Car(){}
}


class Car {
	// 컴파일러가 추가시켜줌
	car(){}
}
  • 컴파일러에 의해 생성되는 기본 생성자는 해당 클래스의 접근제어자(public, ...)를 따른다

필드 초기화

생성자는 객체를 초기화하는 역할을 수행함

  • 객체를 만들 때 인스턴스마다 다른 값을 가져야 한다면 생성자를 통해서 필드를 초기화할 수 있음
    : 예를 들어 만들어지는 자동차 마다 모델, 색상, 가격이 다르다면 생성자를 사용하여 필드의 값을 초기화하는 것이 좋음
  • 반대로 인스턴스 마다 동일한 데이터를 가지는 필드는 초기값을 대입하는 것이 좋음
    : 예를 들어 자동차가 만들어질 때마다 기어의 상태를 'P'로 고정해야 한다면 초기값을 직접 대입하는 것이 좋음

🚨 여기서 잠깐! 주의할 점!

  • 생성자를 통해 필드값을 초기화하고 기본 생성자를 작성하지 않았는데 기본 생성자를 호출한다면?
public Car (String modelName, String colorName, double priceValue){
	model = modelName;
    color = colorName;
    price = priceValue;
}

...

// 오류 발생
Car car = new Car();


-한개 이상의 생성자가 존재하기 때문에 컴파일러가 자동으로 기본 생성자를 추가해주지 않기 때문에 기본 생성자가 존재하지 않아 오류가 발생함


오버로딩

: 똑같은 메서드 이름이지만 매개변수의 종류와 타입에 따라 완전히 다른 역할을 하게 하는 것
: (= 메서드의 이름을 낭비하지 않도록 하는 것)

  • 생성자를 통해 필드를 초기화할 때 오버로딩을 적용할 수 있다.
  • 예를 들어 우리가 자동차를 생성할 때 모델, 색상, 가격이 다른 자동차를 여러대 생성할 수도 있고 색상만 자동차를 여러 대 생성할 수도 있기 때문에 오버로딩을 사용하면 다른 효율적으로 처리할 수 있다.

🚨 여기서 잠깐! 주의할 점!

오버로딩 : 똑같은 메서드 이름이지만 매개변수의 종류와 타입에 따라 완전히 다른 역할을 하게 하는 것 (= 메서드의 이름을 낭비하지 않도록 하는 것)

public Car(String modelName, String colorName, double priceValue)
public Car(String colorName, String modelName, double priceValue)
  • modelName과 colorName 매개변수의 위치가 다르기 떄문에 가능할 것 처럼 보이지만
  • String, String, double : 매개변수의 개수, 타입, 순서가 동일하기 때문에 중복이 불가능

오버로딩 실습

  • Car.java

  • Main.java

실행결과


this와 this()

: Java에서는 인스턴스 자기 자신을 표현하는 키워드

  • 객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용될 수 있음
  • 객체 내부 멤버에 접근할 때 this 키워드가 필수는 아니지만 상황에 따라 필수가 될 수 있음
public Car(String model, String color, double price){
	model = model;
    color = color;
    price = price;
}
  • 만약 이처럼 생성자를 선언하는데 매개변수명과 객체의 필드명이 동일할 경우 오류가 발생하지는 않지만, 생성자 블록 내부에서 해당 변수들은 객체의 필드가 아닌 가장 가까운 매개변수명을 가리키게 됨으로 자기 자신에게 값을 대입하는 상황이 되어버림
  • 이때에는 this키워드로 해결 가능
public Car(String model, String color, double price){
	this.model = model;
    this.color = color;
    this.price = price;
}
  • this 키워드를 통해 변수명에 해당하는 객체의 필드에 접근하여 받아온 매개변수의 매개값을 객체의 필드에 대입하여 저장할 수 있음
Car returnInstance(){
	return this;
}

  • 또한 this는 인스턴스 자신을 뜻하기 때문에 객체의 메서드에서 리턴타입이 인스턴스 자신의 클래스 타입이라면 this를 사용하여 인스턴스 자신의 주소를 반환할 수도 있음

this()

: 인스턴스 자신의 생성자를 호출하는 키워드

  • 객체 내부 생성자 및 메서드에서 해당 객체의 생성자를 호출하기 위해 사용될 수 있음
  • 생성자를 통해 객체의 필드를 초기화할 때 중복되는 코드를 줄여줄 수 있음

< 매개변수 1개 >

public Car(String model){
	this.model = model;
    this.color = "Blue";
    this.price = 50000000;
}

< 매개변수 2개 >

public Car(String model, String color){
	this.model = model;
    this.color = "Blue";
    this.price = 50000000;
}

< 매개변수 3개 >

public Car(String model, String color, double price){
	this.model = model;
    this.color = "Blue";
    this.price = 50000000;
}
  • 이렇게 생성자를 선언하게되면 코드의 중복이 발생함
  • 이 때, this() 키워드를 통해 코드의 중복을 제거할 수 있음
public Car(String model){
	this(model, "Blue", 50000000);
}

public Car(String model, String color){
	this(model, color, 100000000);
}

public Car(String model, String color, double price){
	this.model = model;
    this.color = color;
    this.price = price;
}

🚨 여기서 잠깐! 주의할 점!

  • this()키워드를 사용해서 다른 생성자를 호출할 때는 반드시 해당 생성자의 첫 줄에 작성되어야 함
public Car(String model){
	System.out.println("model = " + model);
    this(model, "Blue", 50000000)
}
  • 이처럼 this() 키워드로 다른 생성자 호출 이전에 코드가 존재하면 오류가 발생함

this() 실행 결과

profile
전공은 컴퓨터공학, 복수전공은 해킹보안학, 직장은 방학(파워 구직중)

0개의 댓글