생성자 (Constructor)
“ 인스턴스가 생성될 때 인스턴스를 초기화 하는 메소드 “
클래스 구성요소 중 하나로 클래스를 생성하는 역할
생성자가 인스턴스를 만드는 명령어는 아님
new 키워드가 클래스의 인스턴스를 만들때 사용됨
클래스 이름(){
}
🌟 생성자도 오버로딩이 가능함
메소드와 다른점
1. 리턴을 하지 않는다
2. 생성자 이름은 반드시 클래스 이름과 동일해야 한다
➡️ 클래스명과 다르면 일반 메소드가 된다
생성자가 왜 필요한가?
➡️ 클래스를 처음 만들 때 멤버 변수나 상수를 초기화해서 여러개의 객체를 생성할 때 시간을 단축!
기본 생성자 / 매개변수가 있는 생성자
기본 생성자(default constructor)
➤ 모든 클래스 내부에는 생성자가 반드시 1개 이상 있어야 함
➤ 생성자가 없는 클래스는 프로그램 실행할 때 컴파일러가 자동으로 기본 생성자 생성
→ 생성자를 작성한 경우에는 디폴트 생성자 제공하지 않음
➤ 기본 생성자 직접 작성해도됨 ‘클래스() {}’
➤ 매개변수와 구현코드가 없음
매개변수가 있는 생성자
➤ 매개변수를 통해서 생성과 동시에 속성 값을 같이 넣어줄 수 있다.
➤ 기본 생성자로 만들고 ‘객체이름.변수’로 속성값 하나하나 지정해주는 것 보다 훨씬 편리함
this
▶️ this는 생성된 인스턴스 스스로를 가르키는 예약어
▶️ this는 쓰임새가 총 3가지 있음
1. 자신의 인스턴스 변수를 가르키는 this
인스턴스 변수와 지역변수 이름을 같게 하면 혼동됨
휴대폰을 예시로 들어서 클래스를 작성해보았다.
public class Phone {
// 필드
private String company;
private static int serialNum = 10000;
private String modelName;
private int modelNum;
// 생성자
Phone(String company, String modelName){
// 잘못된 예시
company = company;
modelName = modelName;
modelNum = Phone.serialNum;
Phone.serialNum += 1000;
}
// 메소드
public String getCompany() {
return company;
}
public String getModelName() {
return modelName;
}
public int getModelNum() {
return modelNum;
}
}
Phone의 생성자를 보면 지역 변수와 인스턴스 변수 이름이 같다.
이런식으로 작성하면 컴파일러는 양쪽 다 지역변수로 생각한다.
main 클래스를 만들고 출력해보자
public class PhoneTest {
public static void main(String[] args) {
Phone iPhone11Max = new Phone("Apple", "iPhone11Max");
System.out.println(iPhone11Max.getModelName() + "의 정보");
System.out.println("제조사 : " + iPhone11Max.getCompany());
System.out.println("모델넘버 : " + iPhone11Max.getModelNum()); }
}
<실행 결과>
null의 정보
제조사 : null
모델넘버 : 10000
실행 결과를 보면 지역 변수명과 인스턴스 변수명이 같은 변수는 인스턴스의 변수에 제대로 값이 저장이 안되서 null로 뜨는 것을 확인할 수 있다.
자바에서는 일반적으로 인스턴스 변수와 생성자의 지역변수 명을 똑같이 작성하는데
이럴때 인스턴스 변수와 지역변수를 컴파일러가 구분할 수 있게 'this.변수명' 을 사용한다.
이때 사용하는 this는 자신의 인스턴스를 가르킨다.
지역 변수가 아닌 인스턴스 내에 있는 해당 변수를 사용하는 것이다.
클래스의 생성자 부분을 이렇게 고치고 실행해보자
Phone(String company, String modelName) {
this.company = company;
this.modelName = modelName;
this.modelNum = Phone.serialNum;
Phone.serialNum += 1000;
}
<실행 결과>
iPhone11Max의 정보
제조사 : Apple
모델넘버 : 10000
this를 사용해서 구분해주면 지역변수가 인스턴스 변수에 올바르게 대입된 것을 확인할 수 있다.
2. 생성자에서 다른 생성자를 호출하는 this()
this()는 객체 내부에서 같은 객체 내부의 생성자를 호출하는 메소드이다.
반드시 생성자 내부에만 사용하고 생성자의 첫 줄에 위치해야한다.
생성자가 여러개 있으면 원하는 생성자의 매개변수에 맞춰서 괄호()안에 넣어주면 된다.
예시)
public class ThisExample {
int num;
String name;
public ThisExample() {
this(1, "None");
}
public ThisExample(int num, String name) {
this.num = num;
this.name = name;
}
}
this(1, "None") 은 ThisExample(int num, String name) 생성자를 호출
num 변수에 1을, name변수에 "None"을 대입시킨다.
public class ThisTest {
public static void main(String[] args) {
ThisExample example1 = new ThisExample();
ThisExample example2 = new ThisExample(10, "김철수");
System.out.println(example1.name + ", " + example1.num);
System.out.println(example2.name + ", " + example2.num);
}
}
<실행 결과>
None, 1
김철수, 10
3. 자신의 주소를 가르키는 this
객체 내부에서 this 는 인스턴스의 주소를 가르키는 역할도 한다.
주소를 리턴하는 경우는 잘 사용하지 않는다.
ThisExample 클래스에 주소를 리턴하는 메소드를 작성해 보았다.
ThisExample address() {
return this;
}
public static void main(String[] args) {
ThisExample example3 = new ThisExample();
System.out.println(example3.address());
System.out.println(example3);
}
객체를 그대로 출력해도 주소값을 얻을 수 있다.
<실행결과>
constructor.ThisExample@6ad5c04e
constructor.ThisExample@6ad5c04e
실행해보면 인스턴스가 저장된 주소가 출력된다.
주소 앞에 constructor은 패키지 이름이고 ThisExample은 클래스 이름이다.
읽어주셔서 감사합니다 ❤️
'TIL(Today I Learned)' 카테고리의 다른 글
5/13 (금) 자바 다형성 (0) | 2022.05.13 |
---|---|
5/12 (목) 자바 상속(Inheritance) (0) | 2022.05.12 |
5/10 (화) 객체지향 프로그래밍 기초 (0) | 2022.05.11 |
5/9 (월) 자바 배열 / 계산기 만들기 (0) | 2022.05.09 |
5/6 (금) 자바 제어문 (0) | 2022.05.07 |