본문 바로가기
Study/중앙정보처리학원과정

9일차. 생성자와 기본생성자(Default Constructor)

by 얏옹이 2022. 11. 4.
반응형

 

Class는 무조건 생성자를 1개 이상 보유하고 있어야합니다.

 

그동안 우리가 따로 생성자를 생성해주지 않았지만, 사용자가 별도로 선언한 생성자가 없다면,

 

시스템에서는 컴파일 단계에서 자동으로 매개변수값이 없는 생성자를 자동으로 생성해줍니다.

 

이렇게 매개변수값이 없는 생성자를 우리는 기본생성자(Defalut Constructor) 라고 칭합니다.

 

 

기본생성자의 문법은 기본적으로 Class명과 동일하게 적어주는게 원칙입니다.

 

Soccer라는 클래스에서 기본 생성자를 선언해주려면

 

Soccer() {

}

 

이런식으로 작성하는게 기본 생성자 문법입니다.

 

그리고 호출은 메인메소드가 있는 클래스에서 Soccer sc = new Soccer(); 이렇게 선언해주면

객체가 생성되고 필드안에 값이 지정되있다면 sc 변수가 해당객체를 참조하게되는거죠.

 

하지만 필드안에 값이 지정 안되있고 전역변수만 설정이 되어있다면 전역변수는 선언만 해주고 초기화를 해주지않으면

타입에 따라 자동초기화 됩니다.

 

 

여기서 타입에 따른 자동초기화는

정수형 = 0

실수형 = 0.0

Char = '  ' 공백

클래스 = Null

배열 = Null

로 자동으로 초기화 됩니다. 자주 쓰는 String 도 클래스이기때문에 Null로 자동초기화 됩니다.

 

 

 

그리고 기본생성자 외에 클래스 객체 선언과 동시에 field에 있는 값을 선언해주는 방법도 있습니다.

 

Soccer(String s1, String s2) {

    전역변수 = s1;

    전역변수 = s2;

}

 

이런식으로 선언을 해주고 생성자를 통해 매개값을 받아 선언과 동시에 전역변수에 값을 할당해줄수도 있습니다.

 

예를들어 Soccer라는 클래스를 메인메서드에서 선언해줄때는

 

Soccer sc = new Soccer(); 라고 선언해주면 이건 기본 생성자를 이용해서 선언하는것이고

Soccer 클래스 안에 전역변수들이 선언되어있다면 타입에 따라 자동초기화 된다고 설명드렸었는데

 

Soccer sc = new Soccer("아무개","의사");

라고 선언해주면

 

기본생성자가 아닌 매개변수 타입과 갯수에 맞는 생성자가 호출되어 생성자 안에서 설정된 코드에 따라

 

전역변수에 S1과 S2에 매개체인 "아무개"와 "의사" 가 값할당이 됩니다. 클래스 선언과 전역변수에 값할당을 동시에 할수 있는것이죠.

 

 

 

이렇게 Human 클래스에 전역변수를 설정해주고 값을 지정해주지 않았습니다.

 

 

 

 

 

따라서 타입에 맞게 자동초기화가 되면 옆에 주석처리 된 값들이 먼저 들어가게 됩니다. 이런식으로 말이죠.

 

 

이건 기본 생성자를 통해 선언해서 직접 변수에 값 할당을 해줘야하는 방식이고

 

이번엔 생성자를 통해 클래스 선언과 값 할당을 직접 해보겠습니다.

 

 

이렇게 매개변수가 있는 생성자를 하나 클래스 안에서 생성했습니다. 그리고 메인메소드 안에서 선언해보겠습니다.

 

 

 

 이렇게 선언해주었습니다.(데프트님 롤드컵 결승전 화이팅입니다...............!!!)

 

메인메소드에 call 메소드는 제가 출력을 위해서 따로 출력부분만 따로 모아놓은 메소드입니다.

 

저렇게 각 타입과 순서에 맞게 클래스 선언과 동시에 값을 넘겨주면

 

 

 

따로 값 할당이 없더라도 바로 출력해보면 선언과 동시에 값이 들어가서 Console에 정상적으로 잘 출력 되는것을 볼수 있습니다. 

 

이렇게 기본생성자와 매개변수가 있는 생성자를 이용하여 좀더 코드를 간소화 하고 클린 코딩을 할수 있습니다.

 

그리고 지금까지 말씀드린 방법도 같은 생성자 명이지만 매개변수값이 달라서 Overloding 처리 되는겁니다.

 

 

이건 방금 메인메소드 안에서 

 

hu2.call(h2); 라고 호출해준 호출 전용 메소드를 만들어서 호출해본겁니다.

 

메인메소드에 보면 Human hu2.... 라고 시작하며 클래스 선언을 해주면서 참조변수를 생성해줬습니다.

 

여기서 생성한 참조변수 hu2는 클래스의 주소를 담고 있습니다.

 

그 주소를 hu2.call 메소드를 호출하면서 () 괄호안에 주소가 담겨있는 h2 참조변수를 매개체로 전달해준겁니다.

 

그럼 해당 메소드인 call에서 넘겨받아 h라는 변수에 Human 클래스의 객체들이 담기게 됩니다.

 

그걸 다시 지역변수인 name, job, age, 같은 변수들에 객체안의 값을 설정해주고

 

해당 값을 출력하도록 Println 메소드를 실행하도록 메소드를 구성한겁니다.

 

 

 

 

반응형