☕JAVA/🔎 공부 [JAVA]

[JAVA] 생성자 / this / 생성자 오버로딩

디카페인라떼 2022. 8. 10. 12:27

생성자

모든 클래스는 인스턴스화 될때 생성자를 사용한다.

생성자의 특징

  • 생성자는 리턴타입이 없다.
  • 생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일할 때 자동으로 만들어진다.
  • 매개변수가 없는 생성자를 기본생성자라고 한다.
  • 생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 자동으로 만들어지지 않는다.

생성자의 역할

  • 생성자가 하는 일은 객체가 될 때 필드를 초기화 하는 역할을 수행한다.
  • 자동차가 객체가 될때 반드시 이름을 가지도록 하려면,Car클래스를 다음과 같이 만들어야 한다.
    public class Car{
        String name;
        int number;

        public Car(String n){//생성자
            name = n;//필드에 선언된 name을 초기화
        }
    }
  • 위의 Car 클래스를 이용하여 Car 인스턴스를 생성하는 방법
    public class CarExam2{
        public static void main(String args[]){

            Car c1 = new Car("소방차");
            Car c2 = new Car("구급차");
            //Car c3 = new Car(); // 컴파일 오류가 발생합니다.

            System.out.println(c1.name);

            System.out.println(c2.name);
        }
    }
  • Car클래스는 기본 생성자를 가지지 않는다. 그래서 기본생성자로 Car 객체를 생성할 수 없다.
  • 생성자 public 클래스명 (매개변수 목록){생성자블록}

    // Car c1 = new Car();//기본생성자를 만듦->오류
    //생성자를 사용자가 추가하면 기본생성자는 만들어지지않음. 더이상 기본생성자 사용 불가

<생성자 오버로딩>

매소드와 마찬가지로 매개변수의 수와 타입이 다르다면 여러개의 생성자를 선언할 수 있다.

public class Car {
	//타입 필드명
	String name;
	int number;
	
    //생성자 이름은 같지만 매개변수의 수와 타입이 다 다름
	public Car (String name) {
		this.name = name;//(생성자)car 라는 객체가 생성되며 name이 초기화
//this.: 객체 자신을 참조하는 키워드.내 구성요소,내 것 //내 필드에 있는 name 이라는 뜻
//클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출할 수 있다		
	}
	
	public Car() {
		//기본생성자를 따로 정의해주면됨
//		this.name = "이름없음";
//		this.number = 0;
//		this() : 나의 생성자 호출,타입을 보고 알맞는 생성자 호출
		this("이름없음",0);
	}
	
	public Car(String name, int number) {//생성자
		this.name = name;
		this.number = number;
		
		
	}
	
}
public class CarExam3 {

	public static void main(String[] args) {
		Car c1 = new Car("소방차");
		Car c2 = new Car();//기본생성자 생성 후 컴파일 오류 사라짐
		Car c3 = new Car("구급차",119);
	}

}

<this>

: 객체 자신을 참조하는 키워드

public class Car {
	//타입 필드명
	String name;
	int number;
	
	
	public Car (String name ) {
		this.name = name;//car 라는 객체가 생성되며 name이 초기화
//this.: 객체 자신을 참조하는 키워드.내 구성요소,내 것 //내 필드에 있는 name 이라는 뜻
//클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출할 수 있다
	}
	
}

<this()>

  • 기본생성자를 호출하였을 때 name을 "이름없음" , 숫자를 0으로 초기화 하기
    public Car(){
        this.name = "이름없음";
        this.number = 0;
    }
  • 위처럼 작성했을 경우 코드의 중복이 일어난다.
  • 자신이 가지고 있는 다른 생성자를 이용할 수 있다.
    public Car(){
        this("이름없음", 0);
    }
  • this괄호 열고로 시작하면 자신의 생성자를 호출하는 것이다.
  • 자기 자신의 생성자를 호출함으로써 비슷한 코드가 중복되서 나오는 것을 방지할 수 있다.

 

 

 

[참고]생성자와 setter - 생성자와 setter 역할은 비슷하지만 호출 시점이 다르다.

-생성자는 객체 생성  필드 초기화 역할을 수행 - 객체 생성    번만 호출된다.

-setter 객체 생성 이후에 호출이 가능 - 필드 초기화가 아니라 기존값 덮어쓰기객체 생성 이후라면 원하는 때에 언제라도 호출할  있다.