[Java-OOP5] 생성자(Constructor)

이용준·2022년 10월 31일
0

Java

목록 보기
17/29

1.생성자

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

class Dog extendxs 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.printlnt(this.name+" zzz in house for "+hour+" hours");
  }
}

public class Sample{ //*수정할 부분
  public static void main(String[] args){
    HouseDog houseDog = new HouseDog();
    houseDog.setName('jane');
    houseDog.sleep();
    houseDog.sleep(3);
  }
}  

위 예제에서 main 메소드를 다음과 같이 수정후 실행해보자.

public class Sample{
  public static void main(String[] args){
    HouseDog dog = new HouseDog();
    System.out.println(dog.name); // null 출력
  }
}  

dog 객체의 name 변수에 값이 없으므로 null이 출력된다.
이처럼 HouseDog 클래스에 name(객체변수)값을 설정하거나 설정하지 않을 수 있다. 그렇다면 name이라는 객체변수에 값을 반드시 입력해야 객체가 생성될 수 있도록 강제하는 방법은 없을까?
이 경우 생성자 를 이용하면 된다.

  • 예) HouseDog클래스 상단에 아래 메소드를 추가해보자
class HouseDog extends Dog{  
  HouseDog(String name){ // 생성자
    this.setName(name);
  }
  (...)

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

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

생성자는 객체가 생성될 때 호출된다.(즉, 생성자는 new 키워드가 사용될 때 호출된다.)

new 클래스명(인자);

위에서 생성자를 추가한 메소드를 반영해 수정해보자.

public class Sampl{
  public static void main(String[] args){
    HouseDog dog = new HouseDog("jane");// 생성자로 인해 공백 불가
    System.out.println(dog.name);
  }
}  
    

1-2.디폴트(default) 생성자

먼저 아래 두가지 코드를 보자.

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

2) 디폴트 생성자
class Dog extends Animal{
  Dog(){
  }
  
  void sleep(){
    System.out.println(this.name+" zzz");
  }
}  

2의 디폴트 생성자를 구현하면 new Dog()로 Dog 클래스의 객체가 만들어 질 때 위에 구현한 디폴트 생성자가 실행될 것이다.
만약 클래스에 생성자가 없다면 컴파일러는 자동으로 디폴트 생성자를 추가한다. 그러나 기작성된 생성자가 있는 경우 컴파일러는 디폴트 생성자를 추가하지 않는다.

1-3. 생성자 오버로딩

하나의 클래스에 여러개의 인자가 다른 생성자를 만들 수 있다.

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{
  HouseDog(String name){  //String name, 인자 1
    this.setName(name);
  }
  
  houseDog(int type) {  //int type, 인자2
    if(type==1){
      this.setName("puddle");
    }else if(type==2){
      this.setName("`bullodg");
    }
  }
  
(...)
public class Sample{
  public static void main(String[] args){
    HouseDog puddle = new HouseDog("Tom"); // Tom 출력
    HouseDog bulldog = new HouseDog(1); // bulldog 출력
(...)  

위처럼 입력 인자에 따라 생성자를 여러 개 만드는 것을 생성자 오버로딩이라 한다.

profile
뚝딱뚝딱

0개의 댓글