백엔드/JAVA_이론공부

JAVA_생성자

반 불혹 2022. 9. 18. 20:54

생성자

생성자는 클래스에서 객체를 찍어내주는 요소이다.

인스턴스(클래스에서 찍어낸 변수, 메서드)를 초기화 하는 메서드 이다.

우리가 코딩을 할 때 변수 앞에 new를 넣어서 새로운 변수를 만들어 내곤 했는데, 사실 이 new을 사용해서 객체를 생성할 때 "호출되는 것이 생성자" 이다. (new가 생성자라는 말이 아니다, new를 작동시킬때 같이 오는게 생성자다!)

new 는 인스턴스 생성을 담당하고,

생성자는 인스턴스 변수들을 초기화 한다.

생성자는 메서드와 비슷한 구조를 가지고 있으나, 두 가지 차이점이 존재한다.

  1. 생성자의 이름른 반드시 클래스의 이름과 같아야 한다. 

  2. 생성자는 리턴타입이 없다. (리턴타입 자체가 없음)

작성 예시

클래스명(매개변수) { // 생성자 기본 구조
//생성자 내의 내용
}

쉽게 말하면 생성자는 객체를 찍어낼 때 같이 나오는 녀석인데, 이녀석은 인스턴스 변수를 초기화 하는 것이다.

"초기화" 라는 말이 적절 한게, 이 상생자는 객체가 생성될때 처음에 튀어나오는 놈이므로, 마치 "일단 한번 실행되는 메소드"와 비슷하게 움직인다. 

객체를 하나 만들게 되면 생성자의 내용이 실행된다 이거다.(변수를 정해진 값으로 세팅하든, println함수로 출력을 내든, 객체가 생성되는 순간 이 동작을 한다. 만약 println("응애!")을 생성자의 내용으로 써놓으면, 객체가 생성될 때 출력으로 응애! 가 나온다. (객체 탄생))

생성자도 메서드 처럼 오버로딩이 가능하기 때문에 객체를 생성할 때 넣어준 변수에 따라 다르게 생성 가능하다.

오버로딩 예시

public class sengsungEX {
    public static void main(String[] args) {
        Sengsung sengsung1 = new Sengsung();
        Sengsung sengsung2 = new Sengsung("chicken");
        Sengsung sengsung3 = new Sengsung(5,10);
    }
}

class Sengsung {
    Sengsung() { // (1) 생성자 오버로딩
        System.out.println("1번 생성자");
    }

    Sengsung(String str) { // (2)
        System.out.println("2번 생성자");
    }

    Sengsung(int a, int b) { // (3)
        System.out.println("3번 생성자");
    }
}
//출력
1번 생성자
2번 생성자
3번 생성자

위의 코드에서 아무 변수를 넣지 않은 sensung1을 생성 할 때, 오버로딩 된 생성자 중 변수가 들어있지 않은 메서드를 실행하게 되어 생성자 안의 System.out.println("1번 생성자"); 를 실행하게 된다. (1번 생성자 출력)

아래의 sensung2 , sensung3 생성자도 마찬가지로, 생성 할 때 넣은 변수에 따라 오버라이딩 된 생성자를 실행한다.

 

기본 생성자

기본 생성자는 매개변수 없이 생성되는 생성자를 의미한다.

위의 코드를 예시로 들면, 오버로딩된 1번 생성자와 같다. 

작성예시

클래스명(){} //기본 생성자

chicken(){} // 예시) chicken 클래스의 기본 생성자

"기본" 생성자라고 했는데, 객체를 시용하기 위해서는 항상 있어야 하는것 아닌가? 라고 생각할 수 있는데, 클래스 내에 생성자를 선언 안한 상태로 컴파일 하면, 컴파일러가 알아서 잘 만들어 주기 때문에 상관없다.

 

매개변수가 있는 생성자

매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출된다. 

이 때, 생성되는 인스턴스 변수는 매개변수로 초기화가 된다. 

오버로딩 예시의 sensung2, sensung3 생성자가 배개변수가 있는 생성자이며, 해당 매개변수 (str, a, b)를 이용한 변수가 있다면 객체를 선언할 때 넣은 (chicken, 5, 10)가 초기값으로 주어지게 된다.

작성예시

    클래스명(매개변수){} //기본 생성자

    chicken(int A, int B){
        System.out.println("치킨%d 마리의 가격은 %d이다.", A, B);
    } // 예시) chicken 클래스의 기본 생성자
//출력
치킨A 마리의 가격은 B이다.

위의 코드처럼, 매개변수를 넣어 해당 생성자에서의 변수를 초기화 한다. (A, B는 int현이지만 예를들기 위해 그냥 A, B로 썻다.)

 

'백엔드 > JAVA_이론공부' 카테고리의 다른 글

JAVA_내부 클래스  (0) 2022.09.18
JAVA_this(), this  (0) 2022.09.18
JAVA_메서드 오버로딩(overloading)  (1) 2022.09.04
JAVA_필드와 메서드  (0) 2022.09.04
JAVA_클래스와 객체  (0) 2022.09.04