생성자 (Constructor)
객체 생성의 역할을 하는 클래스의 구성요소
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드라고 할 수 있다
new 를 사용해 객체 생성할 때 호출되는 것
인스턴스 생성을 담당하는 건 new이며 생성자는 인스턴스 변수들을 초기화하는데 사용되는 메소드다
생성자의 이름은 반드시 클래스 이름과 같아야하는데,
만약 그렇지 않으면 그 메소드는 더이상 생성자로서의 기능을 수행할 수 없다
또한 생성자는 리턴 타입이 없다
없는데도 메소드에서 리턴 값이 없을 때 사용하는 void를 사용하지 않는다
무언가를 리턴하지 않음 을 의미하는 void 와는 다르게 생성자는 그냥 리턴 타입 자체가 없기 때문이다
클래스명(매개변수) { // 생성자 기본 구조
...생략...
}
클래스명과 같은 이름의 생성자명을 작성하고 리턴 타입이 없기 때문에 리턴 타입엔 아무 것도 적지 않는다
매개변수는 있어도 없어도 상관없다
이 생성자 역시 메소드 처럼 오버로딩이 가능하기 때문에
한 클래스 내 여러 생성자가 존재할 수 있다
기본 생성자와 매개변수가 있는 생성자
생성자의 존재를 모른채 new 를 사용해서 객체를 만들었지만 (생성자를 호출하여)
모든 클래스에는 반드시 1개 이상의 생성자가 있어야 한다
그런데 여태까진 따로 만들지 않아도 정상적으로 인스턴스를 만들 수 있었는데
그 이유는, 생성자가 클래스 안에 포함되어 있지 않았을 땐
자바 컴파일러가 기본 생성자를 자동으로 추가해줬기 때문이다
기본생성자는 매개변수가 없는 생성자를 의미한다
매개변수가 있는 생성자는 메소드처럼 매개변수를 통해 호출 시 해당 값을 받아 인스턴스를 초기화 하는데 사용된다
인스턴스를 계속 만들어야 하는 경우,
인스턴스 마다 각각 다른 값을 가지고 초기화 할 수 있어서 유용하다고 볼 수 있다
public class Com_const {
public static void main(String[] args) {
Comconst comconst = new Comconst(
"AMD Ryzen 3", "Windows 10", "gtx 1060 ti");
System.out.println(
"내 컴퓨터는 " + comconst.getCPUName() + " 라는 CPU를 사용하고 "
+ "운영체제는 " + comconst.getOsName() + ", " + comconst.getVgaName()
+ " 이라는 그래픽 카드를 장착하고 있다");
}
}
class Comconst{
public String CPUName;
public String os;
public String vga;
public Comconst(String CPUName, String os, String vga){
this.CPUName = CPUName;
this.os = os;
this.vga = vga;
// 인스턴스 변수로 CPUName, os, vga 가 선언되어 있고
// 생성자 매개변수로도 똑같은 이름으로 선언되어 있다
// 이러면 구분하기 어려워지기 때문에 구분하는 용도로 this를 써서 구분한다
// 그런거 없이 os = os 이래버리면 둘 다 지역변수로 간주된다
// this는 인스턴스 자신을 가리키고 참조변수를 통해 인스턴스 멤버에 접근할 수 있었던 것 처럼
// this를 통해 인스턴스 자신의 변수에 접근할 수 있는 것
// 참고로 static 메소드에서는 this를 사용할 수 없다
// static 메소드에는 참조할 인스턴스가 없기 때문이다
}
public Comconst(String CPUName){
this("default CPU", "default OS", "default VGA");
}
public String getCPUName(){
return CPUName;
}
public String getOsName(){
return os;
}
public String getVgaName(){
return vga;
}
}
Comconst 인스턴스를 생성할 때 매개변수가 있는 생성자를 사용하게 되면
인스턴스를 만든 후 인스턴스 필드 값을 일일이 설정해줄 필요없이
생성과 동시에 원하는 값으로 설정해줄 수 있기 때문에 편리하다
코드 내용에 주석을 보면 흐름을 이해할 수 있다
this() , this
this() 는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우
Comconst 클래스의 생성자를 호출하는건 this(), 그 효과는 Comconst() 생성자를 호출하는 것과 동일
하지만 주의 사항이 있는데
1. 생성자의 내부에서만 사용가능
2. 생성자 첫 줄에 위치
그리고 계속 실수하면서 깨달은 것
* 생성자 내에서 자기 자신을 호출하면 에러가 난다
Recursive constructor invocation
this 는 인스턴스 변수와 생성자 매개변수가 이름이 같게 정의될 때 구분하기 위함으로 쓰이는데
지역변수로 간주되는걸 방지하는 행위다
원래 모든 메소드에는 자신이 포함된 클래스의 객체를 가리키는 this 라는 참조변수가 있는데
일반적으로 컴파일러가 this. 을 추가해주기 때문에 생략하는 경우가 대부분이다
this는 인스턴스 자신을 가리키고, 참조변수를 통해 인스턴스 멤버에 접근할 수 있었던 것 처럼
this 를 통해 인스턴스 자신의 변수에 접근할 수 있는 것이다
this. 은 위 코드를 다시 보면 이해하기 수월하다
'Java' 카테고리의 다른 글
[Java OOP 심화] 캡슐화 (Encapsulation) (0) | 2022.05.25 |
---|---|
[Java OOP 심화] 상속( Inheritance) (0) | 2022.05.25 |
[Java OOP 기초] 필드와 메소드 (0) | 2022.05.25 |
[Java OOP 기초] 클래스와 객체 (0) | 2022.05.25 |
[Java OOP 기초] 객체 지향 프로그래밍 (0) | 2022.05.25 |
댓글