728x90
반응형
생성자 (Constructor)

 

class Animal{
	String name;
	
	void setName(String name) {
		this.name = name;
	}
}

class Dog extends Animal{
	void sleep() {
		System.out.println(this.name+" zzz");
	}
}

class HouseDog extends Dog{
	void sleep() {
		System.out.println(this.name+" zzz in house");
	}
	
	void sleep(int hour) {
		System.out.println(this.name + " zzz in house for " + hour + " hours");
	}
}

public class TestClass{
	public static void main(String []args) {
	
		HouseDog houseDog = new HouseDog();
//		houseDog.setName("happy");	
//		houseDog.sleep();			
//		houseDog.sleep(3);			
		
		System.out.println(houseDog.name);	// null
		
	}	
}

 

dog 객체의 name 변수에 아무런 값도 설정되어 있지 않기 때문에 null 이 출력된다.

 

이렇듯 HouseDog 클래스는 코딩하기에 따라 멤버변수 name에 값을 설정할 수도 있고 설정 안할 수도 있다.

그렇다면 name 이라는 멤버변수에 값을 무조건 설정해야만 객체가 생성될 수 있도록 강제하는 방법은?

 

생성자(Constructor)를 이용하면 된다.

 

HouseDog 클래스 가장 상단에 다음과 같은 메서드를 추가한다.

...
class HouseDog extends Dog{
	HouseDog(String name){
		this.setName(name);
	}
	
	void sleep() {
		System.out.println(this.name+" zzz in house");
	}
	
	void sleep(int hour) {
		System.out.println(this.name + " zzz in house for " + hour + " hours");
	}
}
...

 

위 메서드처럼 메서드명이 클래스명과 동일하고 return 자료형을 정의하지 않는 메서드를 생성자(Constructor)라고 한다.

 

  • 생성자의 규칙
    1. 클래스명메서드명동일하다.
    2. 리턴타입을 정의하지 않는다. (void도 사용하지 않는다)

생성자는 객체가 생성될 때 호출된다.

즉, 생성자는 다음과 같이 new 키워드가 사용될 때 호출된다.

// new 클래스명(입력인수, ...);
HouseDog houseDog = new HouseDog("Jake");

 

생성자는 메서드와 마찬가지로 다양한 입력을 받을 수 있다.

우리가 HouseDog 클래스에 만든 생성자는 문자열을 필요로 하는 생성자이다.

따라서 new 키워드로 객체를 만들 때 문자열을 전달해야만 한다.

 


디폴트 (default) 생성자

 

이번에는 디폴트 생성자에 대해 알아보자.

 

class Dog extends Animal{
	void sleep() {
		System.out.println(this.name+" zzz");
	}
}

그리고 다음 코드를 확인해 보자.

class Dog extends Animal{
	// 생성자 구현 (입력항목x: default Constructor)
	Dog(){
		
	}
	
	void sleep() {
		System.out.println(this.name+" zzz");
	}
}

 

두 코드의 차이점은 생성자 구현의 유무이다.

또한 생성자의 입력 항목이 없으며 생성자 내부에 아무 내용이 없는 위와 같은 생성자를 default 생성자라고 한다.

 

위와 같이 디폴트 생성자를 구현하면 new Dog()로 Dog 클래스의 객체가 만들어 질때 위에 구현한 디폴트 생성자가 실행 될 것이다. 만약 클래스에 생성자가 하나도 없다면 컴파일러는 자동으로 위와 같은 디폴트 생성자를 추가한다.

하지만 사용자가 작성한 생성자가 하나라도 구현되어 있다면 컴파일러는 디폴트 생성자를 추가하지 않는다.

 

이러한 이유로 위에서 살펴본 HouseDog 클래스에 name으로 입력으로 받는 생성자를 만든 후에

new HouseDog() 는 사용할 수 없다. 왜냐하면 HouseDog 클래스에 이미 생성자를 만들었기 때문에

컴파일러는 디폴트 생성자를 자동으로 추가하지 않기 때문이다.

만약 new HouseDog() 도 가능하게 하려면 디폴트 생성자를 수동으로 추가해야 한다.

 


생성자 오버로딩 (Constructor Overloading)

 

메서드에 오버로딩이 있는 것과 마찬가지로 생성자에도 오버로딩이 있다.

하나의 클래스에 여러개의 입력항목이 다른 (parameter가 다른) 생성자를 만들 수 있다.

 

class HouseDog extends Dog{
	HouseDog(String name){
		this.setName(name);
	}
	
	HouseDog(int type){
		if (type == 1) {
			this.setName("bulldog");
		} else if (type == 2) {
			this.setName("yorkshire");
		}
	}

 

위의 HouseDog 클래스는 두 개의 생성자가 있다.

하나는 String 자료형을 입력으로 받는 생성자이고

하나는 Int 자료형을 입력으로 받는 생성자이다.

두 생성자의 차이는 입력 항목 (parameter) 이다.

이렇게 입력항목이 다른 생성자를 여러 개 만들 수 있는데 이런 것을 생성자 오버로딩이라고 한다.

728x90
반응형

'Language > Java' 카테고리의 다른 글

Java - Polymorphism  (0) 2023.03.27
Java - Interface  (0) 2023.03.26
Java - Inheritance  (0) 2023.03.26
Java - Call by value  (0) 2023.03.25
Java - Class & Method  (0) 2023.03.25

+ Recent posts