1일 1개념정리 24.08.09.금 ~
큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.
무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#25. 생성자
생성자를 왜 쓸까? 생성자라는 개념은 왜 있는 것인가 ?? 생성자에 대해 알아봅시다. 사실 Java말고도 Spring에서 어노테이션으로 생성자 관리를 잘 해줘야하므로, 알아두면 요긴하게 쓴다.
1. 쉬운 초기화 & 직관적이다
생성자를 사용하면 객체를 생성하면서 동시에 필드 값을 초기화할 수 있다. 예를 들어 필드가 3개인 경우, 생성자에서는 한 줄로 객체를 생성하며 모든 필드를 초기화할 수 있다. 사실 아래 코드는 1줄이고 Person 클래스 정보도 모르지만, 김씨에다가 22살, 키가 170.1 이라고 유추할 수 있지 않는가? 바로 그것이다.
// 객체 생성 시 필드 초기화
Person person = new Person("Kim", 22, 170.1);
2. 객체의 유효성 보장 & 에러 방지
유효성이란 뭐냐면, 생성자를 씀으로써 필수적인 값을 강제로 설정하게 되므로 객체가 항상 유효한 상태로 생성될 수 있다는 의미이다. 예를 들어 Person 객체를 생성할 때 이름, 나이, 키가 반드시 필요하다면 생성자는 이를 강제하여 필드의 누락을 방지할 수 있다. 이를 통해 의도치않은 버그도 방지할 수 있다.
public class Person {
private String name;
private int age;
private double height;
// 필수 필드만 설정하는 생성자
public Person(String name, int age, double height) {
this.name = name;
this.age = age;
this.height = height;
}
}
Person person = new Person("Kim", 22, 170.1); // 3개 필드 모두 초기화된 유효한 객체
3. 생성자 오버로딩
생성자 오버로딩을 통해 다양한 방법으로 객체를 생성할 수 있다. 예를 들어 아래 코드처럼 2개의 필드만 받는 생성자와 모든 필드를 받는 생성자를 각각 정의할 수 있다. 이를 통해 개발자는 객체를 생성할 때 좀 더 유연하게 생성할 수 있게 된다.
public class Person {
private String name;
private int age;
private double height;
// 필수 필드만 초기화하는 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 모든 필드를 초기화하는 생성자
public Person(String name, int age, double height) {
this.name = name;
this.age = age;
this.height = height;
}
}
4. 불변성 (Immutable)
객체를 불변으로 만들기 위해서는 생성자를 사용하여 초기화하는 것이 중요하다. 생성자를 통해 객체의 모든 필드를 초기화하고, 이후 외부에서 필드를 변경할 수 없도록 setter 메소드 자체를 제공하지 않을 수 있다. 또는 final 키워드를 사용하여 필드를 선언함으로써 객체의 불변성을 보장할 수도 있다.
public class ImmutablePerson {
private final String name;
private final int age;
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
// 필드를 변경하지 못하도록 의도할 것이라 setter 메소드가 없음
}
5. 의존성 주입 (Dependency Injection)과 생성자 주입
의존성 주입에서 생성자 주입(Constructor Injection)은 객체의 의존성을 주입하는 가장 일반적이고 권장되는 방법이다.
이를 통해 객체가 생성될 때 필요한 의존성을 명확하게 지정할 수 있고 객체의 일관성을 보장할 수 있다. 생성자 주입은 특히 스프링에서 권장되는 방식이다.
public class Service {
private final Repository repository;
// 의존성 주입을 통한 생성자
public Service(Repository repository) {
this.repository = repository;
}
}
'1일 1개념정리 (24년 8월~) > Java' 카테고리의 다른 글
1일1개 (38) - Java 메모리 구조 (0) | 2024.09.20 |
---|---|
1일1개 (37) - 참조타입, 기본타입 (0) | 2024.09.19 |
1일1개 (21) - 불변객체란 ? (0) | 2024.08.30 |
1일1개 (20) - ==와 equals()의 차이 (0) | 2024.08.29 |
1일1개 (19) - static (0) | 2024.08.28 |