📝느낀 점
"객체 생성시, 초기화 시 필요한 메서드이다." 정도만 알고 있었지.
존재 이유가 무엇인지, 내가 알고 있는 것이 확실한건지, 중요한 포인트를 잊고 있는것이 아닌가?
하는 생각이 들어 이번 기회에 정리하게 되었다. 확실한건 내가 생성자를 만들지 않아도 굳이 왜, 컴파일러가
자동으로 생성자를 생성해 주는지에 대해 깊이 생각해보지 못했다는 것이다. 이 답변에 대한 이유는
내가 생각하기에, 상속 관계에 대한 호환성이라고 생각한다. "상위 - 하위" 상속관계인 클래스가 있다면,
하위 클래스에서 상위 클래스인 생성자 즉, 초기화시 사용해야 될 부분이 있을수도 있기에 컴파일러는
이런 부분에 있어서 프로그램이 종료 되지 않도록 미리 방지 시켜주는 것이라고 알게 되었다.
생성자
생성자는 클래스와 같은 이름의 메소드로, 인스턴스가 생성될 때 호출되는 메소드이다.
명시적으로 생성자를 만들지 않아도 자동적으로 기본 생성자를 추가하여 컴파일한다.
생성자는 파라미터를 다르게하여 오버로딩할 수 있다.
생성자의 특징
- 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.
- 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
- 하나의 클래스가 여러 개의 생성자를 가질 수 있습니다.
- 즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능합니다
왜, 생성자를 만들어야 하나요?
생성자는 자바 클래스의 객체를 생성하기 위해서 존재한다.
- 객체 초기화
- 생성자는 클래스의 객체를 초기화하는 역할을 한다.
- 필드를 초기화하고 객체의 상태를 설정하는 데 사용된다.
- 생성자를 통해 객체에 필요한 데이터나 매개변수를 전달할 수 있다.
- 객체 유효성 검사
- 생성자 내에서 입력된 값들을 유효성 검사하고, 잘못된 값이 들어오는 것을 방지할 수 있다.
- 클래스의 불변성 유지
- 불변 클래스의 경우, 생성자를 통해 객체를 한 번 초기화하면 그 상태를 변경할 수 없도록 만들 수 있다.
메소드 오버로딩의 조건
- 메소드의 이름이 같아야 한다.
- 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 한다.
메소드 오버로딩의 장점
메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있다.
또한, 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있다.
오버로딩의 대표적인 예시
메소드 오버로딩의 대표적인 예로는 println() 메소드를 들 수 있다.
println() 메소드는 전달받는 매개변수의 타입에 따라, 다양한 원형 중에서 적절한 원형을 호출하게 된다.
println(boolean x)
println(char x)
println(double x)
println(float x)
println(int x)
println(long x)
왜, 컴파일러는 기본 생성자를 자동으로 생성해 주나요?
기본 생성자 부재
클래스가 어떤 생성자도 명시적으로 정의하지 않은 경우, 컴파일러는 기본 생성자를 자동으로 생성한다.
이렇게 되면 클래스의 인스턴스를 생성할 때 문제가 발생하지 않도록 합니다.
상속과 호환성
클래스가 다른 클래스를 상속하거나 인터페이스를 구현할 때, 하위 클래스에서 상위 클래스의 생성자를 호출해야
하는 경우가 있다. 기본 생성자가 없으면 하위 클래스에서 문제가 발생할 수 있으므로 컴파일러는 기본 생성자를
제공하여 상속과 호환성을 유지한다.
사용자 편의성
클래스를 사용하는 개발자가 명시적으로 생성자를 정의하지 않아도, 객체를 간편하게 생성할 수 있도록 도와준다
Reference
'Java' 카테고리의 다른 글
char타입은 정수인가요? (0) | 2023.11.06 |
---|---|
String 객체를 생성하는 방법과 내부 동작 원리 (String Pool) (0) | 2023.11.06 |
DTO를 만들어 두면 무슨 장점이 있나요? (0) | 2023.11.06 |
상속 정의 / 상속이 갖는 단점들은 무엇인가요? (0) | 2023.11.06 |
인터페이스는 상수 필드만 선언이 가능한 이유는? (0) | 2023.11.06 |