Java - 8. Constructor

Mingi Shin·2023년 10월 30일
0

java

목록 보기
8/10
post-thumbnail

현재 ConsConcept 객체에 a와 b 필드가 있다. getData()는 호출 시에 a와 b의 필드를 정하고 있어 new로 인스턴스화 후에 getData()를 호출하고 있다.

생성자는 2가지 프로세스를 1개로 할 수 있게 한다.


생성자 예시

생성자는 new를 사용해 객체를 인스턴스화 할 때, 무언가를 특정하도록 한다. 생성자는 객체를 인스턴스화 하는 시점에 호출되며 어떤 class에 생성자를 지정하기 위해서는 class의 이름과 같은 이름을 쓴다. 또한 생성자는 어떠한 것도 반환하지는 않기에 생성자 헤더에 리턴 타입을 쓰지도 않는다.

public class ConsConcept{
  int a, b;
  ConsConcept(){
    a=1;
    b=1;
  }
  public static void main(String[] args){
    ConsConcept consConcept = new ConsConcept();
  }
}

생성자 사용 이유

그렇다면 생성자는 왜 사용하는 것일까?

보통의 객체의 필드는 private으로 지정하는 경우가 많다. 따라서, setter 메서드를 사용해 객체의 필드 정보를 변경하거나 해야 하는데, setter의 경우 객체 정보의 빈번한 변경을 유발할 수가 있다. 어떤 DB의 엔티티를 나타내는 객체가 있다고 했을 때, 직접적인 접근으로 데이터를 update한다면 엔티티 무결성이 깨질 우려가 있어 setter의 사용은 지양된다.

OOP 관점에서 생성자의 의미는 생성자가 어떤 객체의 생성과 동시에 유효함을 보장하는 역할을 하는 데에 있다. 만약 사람이라는 클래스에 나이와 키, 몸무게 등의 정수형 필드가 있다고 했을 때, 인스턴스화가 된 시점에서는 나이, 키, 몸무게가 모두 0이다. real world에 존재할 수 없는 데이터를 갖고 있으므로 생성자를 사용해 객체의 인스턴스화와 동시에 필드를 유효한 정보로 넣는 것이다.


생성자 타입

생성자의 type은 Default, Parameterized 2가지가 있다.

Default constructor

디폴트 생성자는 파라미터가 없는 생성자다. 위의 예시 코드처럼 ConsConcept()가 디폴트 생성자다. 또한, 생성자가 명시되어있지 않다면 자바 컴파일러에서 디폴트 생성자를 자동으로 생성한다.

즉, 자바의 모든 클래스는 생성자를 갖고 있다.

Parameterized constructor

파라미터 생성자는 당연히 파라미터가 있는 생성자다.

public class MyClass {
  int x;
  
  public MyClass(int y) {
    this.x = y;
  }
  
  public static void main(String[] args) {
    MyClass myObj = new MyClass(5);
    System.out.println(myObj.x);
  }
}

파라미터 생성자를 이용해 객체 인스턴스 시에 초기값을 설정한다.


Constructor Overloading

같은 클래스에 2개 이상의 생성자를 갖는 것이다.

class Student{
  int id;
  String name;
  int age;
  
  //creating two argument constructor
  Student(int i,String n){
    this.id = i;
    this.name = n;
  }
  //creating three arg constructor
  Student(int i,String n,int a){
    this.id = i;
    this.name = n;
    this.age=a;
  }
}

1번째의 생성자는 id와 name 필드에 대한 파라미터를 받고 2번째 생성자는 모든 argments에 대한 파라미터를 받는다.

생성자 오버로딩은 또 왜 쓰이는 걸까?

파라미터를 가진 생성자를 만들게 된다면 자바 컴파일러는 디폴트 생성자를 제공하지 않는다. 따라서 new Student(); 로 객체를 인스턴스하게 되면 디폴트 생성자가 없기 때문에 에러가 발생한다.

class Student{
  int id;
  String name;
  int age;
  
  Student(){
    this(18012248, "Mingi Shin", 27);
  }

  Student(int i,String n,int a){
    this.id = i;
    this.name = n;
    this.age=a;
  }
}

위와 같이 디폴트 생성자를 만들어 에러를 피한다. 위의 디폴트 생성자는 파라미터 생성자를 따르고 있고 인자로 18012248, mingi shin, 27을 전달하는 것을 의미한다.


참고
- 생성자 사용 이유
https://www.inflearn.com/questions/277163/%EC%83%9D%EC%84%B1%EC%9E%90%EB%A5%BC-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EB%A8%BC%EA%B0%80%EC%9A%94

profile
@abcganada123 / git:ABCganada

0개의 댓글

관련 채용 정보