생성자(Constructor)

  객체를 생성할 때 new 키워드와 함께 호출한다.

  객체생성 외에는 호출할 수 없으며 인스턴스를 초기화 하는 코드가 구현된다.

  반환값이 없고 상속되지 않으며 생성자는 클래스 이름과 항상 동일해야 한다.

  클래스에는 반드시 생성자가 존재해야 하고 인스턴스 변수의 초기화가 목적이다.

 

 

기본생성자(default Constructor)

  하나의 클래스에는 반드시 생성자가 존재해야 한다고 했다.

  생성자를 구현하지 않으면 컴파일러가 생성자를 만들어주는데 이게 기본 생성자다.

  기본생성자는 매개변수가 없고 구현부가 없으며 만약 클래스에 다른 생성자가 있는 경우

  기본생성자는 제공되지 않는다.

//Customer Class
public class Customer {
  
  int customerId;
  String customerName;
  int price;
  
  /*public Customer(int id, String name) {
     이 생성자를 만들면 컴파일러가 기본생성자를
     만들어주지 않는다.
  }*/
  
  void show(){
    System.out.println(customerId + ", " + customerName + ", " + price);
  }
}

//CustomerTest Class
public class CustomerTest {
  
  public static void main(String[] args) {
    Customer customer = new Customer();
    
    customer.show();
    
    customer.customerId = 123;
    customer.customerName = "A";
    customer.price = 10000;
    
    customer.show();
  }
}

  위 처럼 생성자를 별도로 생성하지 않은 경우는 컴파일 할 때 컴파일러가 알아서 제공해준다.

  실행하게 되면 

  0, null, 0

  123, A, 10000

  이렇게 출력된다. Customer 클래스에서 생성자를 따로 만들지 않았지만 컴파일러가 기본생성자를 만들어서

  처리해줌으로써 정상적으로 처리할 수 있는 것이다.

  단, 매개변수를 받는 생성자를 하나라도 만든다면 컴파일러가 기본생성자를 제공하지 않는다.

  그래서 매개변수를 받는 생성자를 만들었는데 기본생성자도 필요하다면 직접 만들어줘야 한다.

 

//Customer Class
public class Customer {
  
  int customerId;
  String customerName;
  int price;
  
  public Customer() { //기본생성자
  
  }
  
  public Customer(int id, String name) {
    customerId = id;
    customerName = name;
    price = 10000;
  }
  
  public Customer(int id, String name, int p) {
    customerId = id;
    customerName = name;
    price = p;
  }
  
  public Customer(int id) {
    customerId = id;
    customerName = "ABC";
    price = 5000;
  }
  
  void show(){
    System.out.println(customerId + ", " + customerName + ", " + price);
  }
  
}


//MainClass
public class CustomerTest {
  
  public static void main(String[] args) {
    
    Customer customer = new Customer(); //default constructor
    
    customer.show();
    
    customer.price = 10000;
    customer.customerId = 123;
    customer.customerName = "A";
    
    customer.show();
    
    Customer customer1 = new Customer(234, "B"); //id, name 받는 constructor
    
    customer1.show();
    
    Customer customer2 = new Customer(345, "C", 20000); //id, name, price 받는 constructor
    
    customer2.show();
    
    Customer customer3 = new Customer(456); //id 받는 constuctor
    
    customer3.show();
  }
}

  결과값은

  0, null, 0
  123, A, 10000
  234, B, 10000
  345, C, 20000
  456, ABC, 5000

  이렇게 출력된다.

  main클래스를 봤을때 제일 첫 customer는 기본생성자를 호출한것이다.

  그리고 바로 show를 호출해서 아무 값이 들어가지 않은 상태인것을 확인한것이고 

  .price, customerId, customerName으로 값을 넘겨주고 show로 다시 출력해본것이다.

  그래서 처음에는 아무값도 들어가있지 않으니까 0, null, 0이 출력되지만 값을 넘겨주고 나서는

  123, A, 10000 이 출력된다.

 

  customer1은 생성자 중에서 id와 name을 매개변수로 받는 생성자에 연결된다.

  new Customer(234, "B")로 값이 바로 넘어가는 형태다.

  id와 name은 넘겨줬고 price는 생성자에 따로 넣어줬기 때문에 바로 show를 하면 알아서 출력된다.

 

  이렇게 생성자가 여러개 존재할 수 있는데 이렇게 여러개 존재하는 것을 오버로딩이라고 한다.

  단, 생성자는 클래스와 이름이 동일해야 하기 때문에 매개변수가 다 달라야 한다.

'JAVA' 카테고리의 다른 글

싱글톤 패턴(Singleton Pattern)  (0) 2021.02.01
인터페이스(Interface)  (0) 2021.01.31
다형성(polymophism)  (0) 2021.01.29
상속(inheritance)  (0) 2021.01.28
캡슐화(Encapsulation)  (0) 2021.01.27

+ Recent posts