생성자란?
: 객체가 생성될 때(인스턴스화) 최초로 실행되는 메소드를 의미한다.
생성자의 특징
- 생성자 이름은 클래스명과 동일해야 한다.
- 반환타입을 가져선 안된다.
- 생성자의 접근지정자로는 주로 public속성을 가진다.
생성자의 역할
- ★맴버 변수를 초기화 하는일을 한다.
- 생성자를 정의하지 않았을 경우 컴파일러는 default(기본)생성자를 제공한다.
- 인자 생성자를 하나라도 정의했다면, 그 때는 컴파일러가 default(기본)생성자를 제공하지 않는다.
- 생성자를 다양하게 오버로딩 함으로써 다양한 초기값을 부여할 수 있다.
생성자의 형식은 아래와 같다.
클래스명()
▲클래스명과 그 뒤에 소괄호를 열고 닫아주면 생성자가 된다.
1) 기본생성자 미 사용
▲ Saram이라는 클래스를 만들고 해당 클래스 안에 초기화용 메소드와 출력용 메소드를 각각 만들었다. 위 방법처럼 초기화용 메소드를 직접 만들어서 인자를 매개변수로 받아 값을 초기화 할 수도 있다.
▲ Saram이라는 클래스를 활용하여 출력하려고한다. 현재 Saram클래스의 맴버변수들은 기본값으로 초기화 되어있는 상태이다. name과 lastJumin은 String 형이므로 null로 자동초기화 되어있다. 이 상태에서 사용할 수 있는 값으로 초기화 하지않고 출력메소드를 호출한다면 NullPoninterException이 발생하는 것이다.
따라서 필히 초기화를 해주고 사용하자.
▲ 초기화 후에는 잘 출력이 된다.
2) 기본생성자 사용 시
▲ 매개변수가 없는 생성자를 기본생성자(default)생성자라고 하고, 매개변수가 하나라도 있다면 인자생성자라고 한다.
기본생성자 하나와 매개변수 1개짜리 인자생성자와 2개짜리 그리고 출력용 메소드를 맴버로 포함한 Saram2클래스를 만들었다.
이제 메인메소드에서 각가의 생성자들을 호출해보자
▲ 생성자가 없었던 Saram클래스는 initialize 메소들을 사용하지 않으면 인스턴화시 기본조기화값으로 초기화 되어있기때문에 NullPointerException 오류가 발생했다. 즉 생성자가 없으면 필히 초기화 메소드를 사용해주어야 하는 것이다.
하지만 생성자가 있는 클래스는 생성자를 이용하여 인스턴스화 하면 맴버변수가 기본생성자의 경우에는 기본생성자 안에 있는 변수값으로 초기화가 되고, 인자생성자의 경우에는 받는 인자값과 기본생성자 안에 있는 변수값으로 초기화가 된다.
즉, 따로 메소드를 사용해서 초기화를 할 필요없이 초기화기능을 갖추었다는 것이다.
출력결과는 다음과 같다.
▲위의 결과들 보면 우리가 각각의 생성자를 print하기 전에 먼저 생성자 안에 있는 메세지가 출력된 것을 볼 수 있다. 즉, 우리가 메인메소드 상에서 new 생성자(); 를 하는 순간 생성자가 속한 클래스로 들어가서 실행된다는 것 즉, 맴버변수를 초기화시킨다는 것이다.
이번에는 생성자의 역할에서 2번째, 3번째 그리고 4번째에 대해서 알아보자
▲ 메인메소드에서 인스턴스화를 할 때 생성자를 사용한다. 이때 자동으로 주석처리된 public Constructor가 우리가 따로 코드로 만들지 않아도 생성된다. 왜냐하면 기본생성자(defalut 생성자)는 기본적으로 자바에서 제공해주기 때문이다.
▲ 이번에는 우리가 기본생성자를 직접 만들어보았다. 이후 메인메소드에서 인스턴스화만 하여도 해당 기본생성자가 실행되는 효과가 있다. 위 코드를 실행하면 아래와 같이 나온다.
▲ 우리가 따로 메인메소드에서 호출한적 없이 인스턴스화시 생성자 사용만 했을 뿐인데 생성자메소드에 진입이된다.
이번에는 인자생성자를 생성해보자
▲ 기존에 만들었던 기본생성자를 없는 것처럼 주석처리하고 문자열을 인자로 받는 인자생성자를 만들었다.
메인메소드에 new Constructor부분에 빨간줄이 생긴것을 볼 수 있다. 바로 아래와 같은 에러가 생겼기 때문이다.
▲ "생성자 Constructor()는 정의되지 않았다." 분명 우리가 기본생성자를 만들지 않고 단순 인스턴스화만 해도 에러가 없었는데 인자생성자를 만들고 난 후 갑자기 기본생성자가 없어진 것처럼 되었다.
바로 인자생성자 때문이다. 인자생성자를 만들면 기본적으로 자바에서 제공하던 기본생성자는 더이상 제공하지 않게 되어 있는 것이다.
이를 해결방법은 2가지를 제시할 수 있을 것이다.
첫번째로 기본생성자 메소드도 만들어 주는 것.
▲ 기본생성자 메소드를 만들어주면 에러가 없어진다.
두번째로 인자를 주는 것.
▲ 메인메소드에 있는 생성자에 인자를 주면 더 이상 기본생성자가 아닌 인자생성자가 되기 때문에 에러가 없어진다.
'Java' 카테고리의 다른 글
[Java]싱글톤 디자인(Single Tone Design) (0) | 2022.03.14 |
---|---|
[Java]this() - 자기 자신의 기본생성자 (0) | 2022.03.14 |
[Java]Over loading(중복 정의) (0) | 2022.03.11 |
[Java]this (0) | 2022.03.11 |
[Java]캡슐화(Encapsulation) - 진짜 캡슐화 (0) | 2022.03.11 |