Goal : 생성자는 무엇인지 알아보고 메서드와 차이를 알아본다.
Constructor 생성자란 ?
생성자(영어: constructor, 혹은 약자로 ctor)는 객체 지향 프로그래밍에서 객체의 초기화를 담당하는 서브루틴을 가리킨다. 생성자는 객체가 처음 생성될 때 호출되어 멤버 변수를 초기화하고, 필요에 따라 자원을 할당하기도 한다. 객체의 생성 시에 호출되기 때문에 생성자라는 이름이 붙었다.
생성자는 대체로 멤버 함수와 같은 모양을 하고 있지만, 값을 반환하지 않는다는 점에서 엄밀한 의미의 함수는 아니다.
A constructor is a member function of a class that is called for initializing objects when we create an object of that class. It is a special type of method that instantiates a newly created object and just after the memory allocation of this object takes place, the constructor is called.
The name of the constructor is the same name as that of the class and its primary job is to initialize the object with a legal initial value for the class. It is not necessary for Java coders to write a constructor for a class.
생성자란 우리가 클래스의 객체를 생성할 때 객체를 초기화하는 멤버함수다. 새롭게 생성된 객체를 인스턴스화하고, 이 오브젝트에 대한 메모리 할당이 이루어지고 난 후 생성자가 호출된다.
생성자는 클래스의 이름과 정확히 일치하며, 객체에 초기값을 세팅해주는 역할을 한다.
아래의 코드를 살펴보자.
MotorBike Class
public class MotorBike {
//state
private int speed;
MotorBike(int speed) {
this.speed = speed;
}
void setSpeed(int speed) {
this.speed = speed;
}
int getSpeed() {
return this.speed;
}
public void start() {
System.out.println("start this.speed :::::: "+this.speed);
System.out.println("start speed :::::: "+ speed);
}
}
MotorBikeRunner Class (메인함수를 가지고 있는 클래스)
public class MotorBikeRunner {
public static void main(String[] args) {
MotorBike ace = new MotorBike(100);
ace.start();
ace.setSpeed(300);
int aceSpeed = ace.getSpeed();
aceSpeed += 100;
ace.setSpeed(aceSpeed);
System.out.println("ace.getSpeed():::::::::" +ace.getSpeed());
}
}
생성자 MotorBike(int speed) {
this.speed = speed;
}
를 만들어주면 되는데 이 때 메소드와 다른 점은, getSpeed()가 return을 해주는 것과 달리 return을 해주지 않아도 된다.
그리고 MotorBikeRunner 클래스에서 객체를 생성할 때, 객체에 바로 초기값을 세팅하는 것이다.
** void는 원래 return을 하지 않음.
결과
start this.speed :::::: 100
start speed :::::: 100
ace.getSpeed():::::::::400
------------------------------------------------------
생성자를 통해 최초 세팅된 초기 값이 100
이후 setter를 통해 300으로 재정의
다시 getter를 통해 현재의 속도를 가져오고, 100을 더함
최종 속도는 ? 300+100이므로 400
생성자 구분
- 기본 생성자
- 파라미터가 있는 생성자
기본 생성자
기본 생성자란 파라미터가 없는 생성자이다. 우리가 생성자를 만들지 않으면, 자바 컴파일러가 자동으로 기본생성자를 만들어준다. 기본 생성자는 소스나 자바 파일에 나타나지 않고, 컴파일이 진행되는 동안 컴파일러가 자동으로 자바코드에 넣는다. 자바파일에서는 찾을 수 없고 bytecode나 .class파일에서 찾을 수 있다.
컴파일러는 멤버변수의 초기값으로 기본생성자의 값을 초기화한다.
package com.techvidvan.constructors;
class TechVidvan
{
int number;
String name;
TechVidvan()
{
System.out.println("Default Constructor called");
}
}
public class DefaultConstructor
{
public static void main(String[] args)
{
TechVidvan object = new TechVidvan();
System.out.println(object.name);
System.out.println(object.number);
}
}
결과
Default Constructor called
null
0
파라미터가 있는 생성자
package com.techvidvan.constructors;
class TechVidvan
{
String name;
int id;
//Creating a parameterized constructor
TechVidvan(String name, int id)
{
this.name = name;
this.id = id;
}
}
public class ParamaterizedConstructor
{
public static void main (String[] args)
{
TechVidvan object = new TechVidvan("Raj", 16);
System.out.println("Name: " + object.name );
System.out.println("id: " + object.id);
TechVidvan object1 = new TechVidvan1("Shivani", 24);
System.out.println("Name: " + object1.name );
System.out.println("id: " + object1.id);
}
}
결과
Name: Raj
id: 16
Name: Shivani
id: 24
오버로딩
생성자 오버로딩은 다른 종류의 파라미터 리스트를 가지도록 한다. 이는 생성자가 각자의 다른 파라미터로 다른 일을 수행할 수 있도록 하는 것이다.
package com.techvidvan.constructors;
class TechVidvan
{
TechVidvan(String name)
{
System.out.println("Constructor with one parameter: String: ");
System.out.println("Name: " +name);
}
TechVidvan(String name, int age)
{
System.out.println("Constructor with two parameters: String and Integer: ");
System.out.println("Name: " +name);
System.out.println("Age: " +age);
}
TechVidvan(long id)
{
System.out.println("Constructor with one parameter: Long: ");
System.out.println("id: " +id);
}
}
public class ConstructorOverloading
{
public static void main(String[] args)
{
TechVidvan ObjectName = new TechVidvan("Sameer");
TechVidvan ObjectName1 = new TechVidvan("Neeraj", 25);
TechVidvan ObjectName2 = new TechVidvan(235784567);
}
}
- 파라미터가 다른 세가지의 생성자
- TechVidan(String name)
- TechVidan(String name, int age)
- TechVidan(long id)
결과
Constructor with one parameter: String:
Name: Sameer
Constructor with two parameters: String and Integer:
Name: Neeraj
Age: 25
Constructor with one parameter: Long:
id: 235784567
생성자와 메소드의 비교
생성자 (constructor) | 메소드 (method) |
return 없음 | return 있음 |
클래스 이름과 같아야함 | 클래스 이름과 달라야함 |
암묵적으로 생성자 호출 | 명시적으로 메소드를 호출 |
우리가 생성하지 않으면 컴파일러가 자동 생성 | 컴파일러가 자동으로 생성해주지 않는다 |
오버라이딩x, 오버로딩 o | 오버라이딩 |
정리
- 생성자의 이름은 클래스의 이름과 동일하다
- 생성자는 return type이 없다. void도 없음.
- 생성자를 final, abstract, synchronized로 선언할 수 없다.
- 오버라이딩은 할 수 없지만 오버로딩은 할 수 있다
- 우리가 생성해주지 않으면 컴파일러가 자동으로 생성해준다
- 모든 클래스는 생성자를 가지고 있으며, 추상클래스도 생성자를 가지고 있다
- 인터페이스는 생성자를 가질 수 없다.
생성자를 정리하며 또 내가 얼마나 생각없이 스프링이 알아서 자동완성 해주는 것에 의존하여 코딩했는지 알 수 있었다. 이쯤 되면 나는 자바를 하는게 아니고 그냥 스프링이 떠먹여 주는 밥 먹는거 아니었나..자괴감들어.. 실무에서 보던 것들, 구현되어 있는 것 들을 당연시하게 여기지 않고 좀 더 자세히 살펴보고 정말 oop를 지향하고 있는지 살펴보아야겠다.
참고 : https://techvidvan.com/tutorials/java-constructor/ 그리고
@ The teacher Mr. Ranga 강의를 참조하고 있습니다
'JAVA > 객체지향의 원리' 카테고리의 다른 글
[OOP] interface / 인터페이스 (0) | 2022.09.07 |
---|---|
[OOP] abstract / 추상화 (0) | 2022.09.05 |
[OOP] Inheritance / 상속 (0) | 2022.08.19 |
[OOP] Composition / 구성 (0) | 2022.08.15 |
[OOP] Encapsulation / 캡슐화 (0) | 2022.07.31 |