Java언어 스터디 Chapter6-3(생성자)

최재하·2022년 11월 24일
0

생성자란?

생성자는 new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
객체 초기화란 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것 입니다. 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없습니다.


기본 생성자

모든 클래스는 하나 이상의 생성자가 존재합니다. 클래스 내부에 생성자 선언을 하지 않았다면 컴파일러는 기본 생성자를 바이트 코드에 자동으로 추가합니다.

public class Car{
   // public Car(){} 자동추가
}

위 코드에서 Car클래스에 생성자를 생략했지만 주석처리된 부분처럼 기본 생성자가 자동으로 생성됩니다. 그렇기 때문에 클래스에 생성자를 선언하지 않아도 아래 코드처럼 new 연산자 뒤에 기본생성자를 호출해서 객체를 만들 수 있습니다.

Car myCar = new Car();

❗️ 클래스에 명시적으로 선언한 생성자가 한개라도 있으면 컴파일러는 기본생성자를 만들어주지 않습니다.


생성자 선언

생성자를 명시적으로 선언하려면 다음과 같은 형태로 선언한다.

클래스( 매게변수선언, 매게변수선언, ...){
	//객체의 초기화 코드.
}

생성자는 메소드와 비슷하지만 리턴타입이 없고 클래스 이름과 동일하다. 생성자블록 내부에는 객체의 초기화 코드가 작성됩니다. 필드 초기값을 저장하거나 메소드를 호출하여 객체 사용전에 필요한 준비를 합니다

public class Car{
	//생성자
   Car(String color, int cc){
   
   }
}
public class CarExample{
	Car myCar = new car("검정", 3000);
  //Car myCar = new Car(); <--기본생성자호출x 
}

위 예시에서 Car클래스에 생성자 선언을 했으므로 기본생성자로 객체를 호출해서 객체를 생성할 수 없고 Car(String color, int cc)를 호출해서 객체를 생성해줘야 합니다.


필드 초기화

클래스로부터 객체가 생성되면 필드는 기본 초기값으로 자동 설정됩니다.
다른 값으로 초기화를 하고 싶다면 두 가지 방법이 있습니다.

1 . 필드를 선언할 때 초기값을 주는 방법.

  • 필드를 선언할 때 초기값을 주게 된다면 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 가지게 됩니다.
    public class Korean{
    	String nation = "대한민국";
        String name;
        String ssn;
    }
    	Korean k1 = new Korean();
     	Korean k2 = new Korean();
    위 예제에서 Korean클래스에 nation필드를 선언 해주면서 "대한민국"으로 초기값을 잡아줬습니다. Korean클래스로부터 k1, k2 객체를 생성하면 두객체의 nation필드에는 모두 "대한민국"이 저장되어 있습니다.

2 . 생성자에서 초기값을 주는 방법

  • 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 한다면 생성자 안에서 초기화 해야합니다. 위 Korean예제에서 name(이름), ssn(주민번호)필드값은 클래스를 작성할 때 초기값을 줄수 없고 객체 생성 시점에 따라 다양한 값을 가질수 있다.
    따라서 생성자의 매개값으로 이 값들을 받아 생성자 안에서 초기화 해주어야 합니다.
    public class Korean{
       //필드
       String nation = "대한민국";
       String name;
       String ssn;
       //생성자
       public class Korean{
       		name = n;
            ssn = s;
       }
    }
    	Kor k1 new =Korean("김감자", "011225-1234567");
       	Kor k2 new =Korean("박감자", "011225-1234567");
    위 코드에서 name은 매개변수 n으로 ssn은 매개변수 s로 전달 됩니다.
    이 값들은 각각 name, ssn필드의 초기값으로 사용할 수 있습니다.


    필드와 매개변수의 이름이 동일할 때, 매개변수가 사용 우선순위가 높아 생성자 내부에서 해당 필드에 접근할 수 없습니다. 해결방법은 아래코드와 같이 필드앞에 this를 붙혀주면 됩니다.
    public static Korean(String name, String ssn){
    	   //필드   //매개변수
       	this.name = name;
       	this.ssn = ssn;
    }

생성자 오버로딩

자바에서는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공합니다.
생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 의미합니다.

//예시
Car() {...}
Car(String model) {...}
Car(String model, String color) {...}
Car(String model, String color, int maxSpeed) {...}

주의할 점은 매개변수의 타입,개수,선언된 순서가 같을 경우 매개변수 이름만 바꾸는것은 안된다.

Car(String model, String color) {...}
Car(String color, String model) {...}//오버로딩이아니다.

생성자가 오버로딩되어 있으면 new연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 의해 호출되는 생성자가 결정된다.

Car car1 = new Car();                  //car()기본생성자호출.
Car car2 = new Car("그랜저");           //Car(String model)호출
Car car2 = new Car("그랜저, "흰색");     //Car(String model, String color)호출
Car car2 = new Car("그랜저, "흰색", 300);//Car(String model, String color, int maxSpeed)호출

다른 생성자 호출: this()

생성자간의 오버로딩이 많아질수록 중복된 코드가 발생할 수 있습니다.
매개 변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자에서 이런 현상을 많이 볼 수 있습니다. 이 경우에는 필드 초기화 내용은 한 생성자에만 집중하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선이 가능하다.

다른 생성자를 호출할 때에는 this()코드를 사용합니다.

  • this()는 자신의 다른 생성자를 호출하는 코드로 생성자의 첫 줄에서만 허용됩니다.
  • this()의 매개값은 호출되는 생성자의 매개 변수에 맞게 제공해야 합니다.
  • this()다음에는 추가적인 실행문들이 올 수 있다. 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문을 실행합니다.

0개의 댓글