220707 TIL 생성자란?? 모르는게 너무 많아..

오늘은 생성자에 대해서 공부를 했다. 생성자를 공부하게 된 계기는 지금 ToDoList 만들기 과제가 한창인데 내가 만든 todolist코드에 대해 트레이너님이 리뷰 해주신 내용 중 생성자에 대해서 더 공부하는 게 좋을 것 같다는 리뷰가 있어서 생성자를 알고 사용하기 위해 오늘 알아봤다. (사실 코드 리뷰 올라온 거는 시간이 꽤 지났는데 아프다는 핑계로 미루고 있었습니다.. 죄송합니다..)

 

생성자를 공부하다 부가적인 개념들이 더 나와서 의존성 주입, this에 대해서도 짤막하게 정리해봤다.

 

 

생성자

일반적으로 클래스를 가지고 객체를 생성하면, 이 객체의 모든 인스턴스 변수는 아직 초기화되지 않은 상태인데 인스턴스 변수를 별도로 초기화하지 않으면 자동으로 초기값으로 초기화가 된다.

 

생성자는 인스턴스가 생성될 때 호출되는 “인스턴스 초기화 메서드"이다. (인스턴스 초기화: 인스턴스 변수들을 초기화하는 것)

즉 객체의 생성과 동시에 인스턴스 변수의 값을 원하는 값으로 초기화할 수 있다.

생성자의 구조

클래스이름(타입 변수명) {
	// 인스턴스 생성 시 수행될 코드
}

생성자를 설명하기 위해 내가 만들던 ToDoList 코드를 가져왔다.

여기서 4번째 라인의 ToDoList를 생성자(constructor)라고 한다. ToDoList라는 클래스가 생성이 될 때 자동으로 클래스와 똑같은 이름을 가지고 있는 생성자가 실행되도록 약속되어있다. 그리고 이 생성자가 어떤 메서드 보다도 먼저 실행되도록 약속이 되어있다.

클래스와 똑같은 이름을 가진 메서드를 정의하면 그 메서드의 내용은 어떤 메서드 보다 먼저 실행이 돼서 객체가 가장 먼저 해야 할 일

즉, 초기화 작업을 하도록 할 수 있다. → 인스턴스 초기화 메서드

 

생성자 사용의 좋은 점

생성자를 사용하지 않으면 객체를 생성하고 다시 변수를 초기화하는 과정을 거쳐야 한다.

public class Experiment {
  private String name;
  private int age;

  public static void main(String[] args) {
    Experiment experiment = new Experiment();
    experiment.name = "seungjun";
    experiment.age = 24;
    System.out.println(experiment.name);
    System.out.println(experiment.age);
  }
}

 

하지만 생성자를 사용하면 객체를 생성과 동시에 변수를 초기화해줄 수 있어 코드가 더 간결해졌다.

public class Experiment {
  private String name;
  private int age;

  public Experiment(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public static void main(String[] args) {
    Experiment experiment = new Experiment("seungjun", 24);
    System.out.println(experiment.name);
    System.out.println(experiment.age);
  }
}

생성자의 구조는 메서드와 차이가 거의 없다. 생성자는 리턴 값이 없다는 게 특이점인데 메서드도 void를 작성해서 리턴 값 없이 메서드를 사용할 수 있지만 클래스는 리턴 값이 없어도 void를 사용하지 않는다.

생성자의 특징

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 없다.

 

의존성 주입

DI(Dependency Injection) 의존성 주입이란 어떤 객체가 다른 객체를 사용해야 할 때 필요한 객체를 외부에서 생성하여 그 객체를 받아서 사용한다. DI방법은 생성자를 이용하거나 setter메서드를 이용하는 방식이 있다.

public class Experiment {
  private Ramen ramen;

  public Experiment(Ramen ramen) {
    this.ramen = ramen;
  }
}

이처럼 Ramen이라는 클래스를 new 해서 생성하지 않고도 주입하여 사용하여 객체 간의 결합도를 줄일 수 있다.

 

이것도 지금 만들고 있는 ToDoList 코드인데 여기서 보면 TaskRepository는 외부에서 생성된 클래스 파일인데 createToDoListButton메서드에서 사용하기 위해 이 메서드에 주입하고 있는 것을 볼 수 있다.

 

의존성 주입의 좋은 점

  • 코드의 재활용성이 높아진다
  • 의존성이 줄어든다
  • 가독성이 높아진다

 

this

this는 인스턴스 자신을 가리키는 의미이다.

가끔 클래스에서 매개변수와 멤버 변수들의 이름이 같아서 헷갈릴 때가 있는데 이때 this를 사용하면 구분하기 편하다

public class Experiment {
  private Ramen ramen;

  public Experiment(Ramen ramen) {
    this.ramen = ramen;
  }
}

이 예시에서도 ramen이라는 변수가 멤버 변수, 매개변수로 이름이 같아 헷갈리는데, this.ramen은 클래스 필드에 선언된 변수 ramen이고 ramen은 매개변수 ramen이다.

예시 코드의 의미는 필드에 선언된 변수 ramen의 값을 매개변수로 받아온 ramen의 값으로 재할당하는 것이다

 

 

요 며칠 몸이 너무 안 좋아서 공부하는 시간도 원래 하던 시간보다 많이 줄었는데 공부하는 순간에도 집중도 잘 안돼서 뭔가 뒤처지는듯한 느낌이다. todolist도 나 혼자 목요일이나 돼서야 겨우 완성시켰다. 머리로는 이거 오늘 하고 자야 돼 인식은 하고 있는데 매번 몸이 따라주지 않는다. 안 그래도 이월된 지금 더 열심히 해도 모자랄 판에 이월되기 전 보다 공부를 못하고 있으니.... 계속 걱정이 된다.

우선은 빨리 몸 낫고 뒤처지지 않게 따라가기만이라도 해보자!!