이제 자바에 대해 정리해 보려고 합니다. 자바의 문법은 거의 C언어와 같기에 자바가 가지는 특징인 객체 위주로 정리하겠습니다.
오늘은 자바의 생성자에 대해 알아보겠습니다.
생성자 ( Constructor )
생성자
: 객체가 생성될 때 호출되는 메소드, 객체를 초기화해줌.
선언 | 설명 |
public 클래스명() { } |
디폴트 생성자 주의) - 생성자 이름은 소속된 클래스명과 같아야 함. - 메소드와 다르게 리턴 타입과 리턴 값이 없음. - 디폴트 생성자는 굳이 선언하지 않아도 자바 컴파일러가 생성해줌. |
public 클래스명() { 수행코드; } |
생성자 |
public 클래스명(파라미터, 파라미터,...) { 수행코드; } |
생성자 주의) - 파라미터가 존재하는 생성자 선언 시, 자바 컴파일러에서 자동으로 디폴트 생성자를 만들어 주지 않음. |
호출 | 설명 |
클래스명 변수명 = new 클래스명() | 객체 할당 시 생성자 앞에 new를 붙여서 호출함. |
클래스명 변수명 = new 클래스명(파라미터, 파라미터,...) |
기본적인 생성자의 형태와 호출 방법에 대해 알아보았습니다.
참고로 나중에 오버로딩에 대해 배우면 알게 되겠지만, 이런 생성자는 여러개 선언 가능합니다.
활용하기
먼저 디폴트 생성자에 대해 알아보겠습니다.
class CakeStatus {
public int radious, height = 10;
}
public class Cake {
public static void main(String[] args) {
CakeStatus ex = new CakeStatus();
System.out.println(ex.height);
}
}
테스트를 위해 변수는 public으로 접근 제한자를 설정하였습니다.
위의 코드를 보면 우리가 객체를 초기화 할때 사용하는 생성자를 따로 선언하지 않았습니다.
하지만 보는 것과 같이 객체가 잘 생성되어 ex 객체의 height 라는 값이 잘 출력되는 모습입니다.
이는 컴파일러가 디폴트로 생성자를 만들어 주었기에 객체가 오류없이 생성된 것입니다.
그러면 이번에는 파라미터가 있는 생성자를 만들어보겠습니다.
class CakeStatus {
public int radious, height = 10;
public CakeStatus(int radious, int height) {
this.radious = radious;
this.height = height;
}
}
public class Cake {
public static void main(String[] args) {
CakeStatus ex = new CakeStatus(5, 20);
System.out.println(ex.radious);
System.out.println(ex.height);
}
}
위 코드를 보면 생성자에 5랑 20을 넣어 객체의 멤버에 각각 값을 할당해주어 초기화 해주는 모습입니다.
(tip. this는 객체 자신을 가리키는 레퍼런스 변수 입니다.)
그러면 실행해 보겠습니다.
위와 같이 성공적으로 객체의 radious와 height 값이 각각 5와 20으로 초기화 되어진 것을 확인 할 수 있었습니다.
주의
보통 디폴트 생성자 때문에 헷갈리는 경우가 많습니다.
아까 앞서 설명해 드렸지만 디폴트 생성자는 다른 생성자가 있다면 선언되지 않습니다.
class CakeStatus {
public int radious, height = 10;
public CakeStatus(int radious, int height) {
this.radious = radious;
this.height = height;
}
}
public class Cake {
public static void main(String[] args) {
CakeStatus ex = new CakeStatus();
System.out.println(ex.height);
}
}
이렇게 위에 코드처럼 생성자가 있는 상태로 디폴트 생성자를 호출하게 된다면, 다음과 같은 오류가 발생하게 됩니다.
오류 메세지 |
java: constructor CakeStatus in class CakeStatus cannot be applied to given types; required: int,int found: no arguments reason: actual and formal argument lists differ in length |
int 형 두개를 파라미터로 넣어줘야 한다면서 오류를 발생시키고 있습니다.
그렇기에 이런 경우에는 파라미터를 넣어주거나, 아니면 다음과 같이 새로 생성자를 만들어 줘야합니다.
class CakeStatus {
public int radious, height = 10;
public CakeStatus() {
}
public CakeStatus(int radious, int height) {
this.radious = radious;
this.height = height;
}
}
public class Cake {
public static void main(String[] args) {
CakeStatus ex = new CakeStatus();
System.out.println(ex.height);
}
}
그럼 이제 실행해보겠습니다.
이번에는 오류 없이 10이 잘 출력되는 모습입니다.
참고로 CakeStatus가 같은 이름으로 두개가 선언 되었는데 오류가 안나는 이유는, 메소드 오버로딩이기 때문입니다.
생성자에 대해 알아보았습니다. 자바를 하면서 정말 많이 쓰이기 때문에 잘 알아두시면 좋을 것 같습니다.
다음에는 메소드 오버로딩과 오버라이딩에 대해 알아보겠습니다.
댓글