인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
인스턴스 변수 초기화 작업에 주로 사용되며, 인스턴스 생성시에 할 작업을 위해서도 사용된다.
- 생성자의 이름은 클래스 이름과 같다.
- 생성자는 리턴 값이 없다.
생성자도 메서드이기 때문에 오버로딩이 가능하다
public class Member {
private int id;
private String username;
public Member(int id) {
this.id = id;
}
public Member(String username) {
this.username = username;
}
public int getId() {
return id;
}
public String getUsername() {
return username;
}
}
public class Main {
public static void main(String[] args) {
Member member1 = new Member(1);
System.out.println("member1.getId() = " + member1.getId());
System.out.println("member1.getUsername() = " + member1.getUsername());
Member member2 = new Member("Cho");
System.out.println("member2.getId() = " + member2.getId());
System.out.println("member2.getUsername() = " + member2.getUsername());
}
}
//member1.getId() = 1
//member1.getUsername() = null
//member2.getId() = 0
//member2.getUsername() = Cho
new 연산자가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는게 아니다.
- 연산자가 new에 의해서 메모리(heap)에 Member클래스의 인스턴스가 생성된다.
- 생성자 Member()가 호출되어 수행된다
- 연산자 new의 결과로, 생성된 Member인스턴스의 주소가 반환되어 참조변수 member에 저장된다.
생성자를 정의하지 않고도 인스턴스를 생성할 수 있는데 이는 기본생성자가 있기 때문이다.
클래스에 생성자가 하나도 정의되지 않은 경우 컴파일 시 자동적으로 기본 생성자를 추가하여 컴파일 한다.
public class Member {
private int id;
private String username;
public Member() {}
}
this()
생성자 간에도 서로 호출이 가능하고 두 가지 조건을 만족해야 한다.
생성자의 이름으로 this를 사용
한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출 가능
public Member(int id) {
this(id, "Cho");
}
public Member(int id, String username) {
this.id = id;
this.username = username;
}
this는 참조변수로 인스턴스 자신을 가리킨다 this키워드로 인스턴스 변수에 접근할 수 있다.
static 메서드에서는 this를 사용할 수 없다
public Member(int i, String un) {
id=i;
username=un;
}
public Member(int id, String username) {
this.id = id;
this.username = username;
}
this 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다
this(), this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
현재 인스턴스와 동일한 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다.
public Member(Member member) {
this.id = member.getId();
this.username = member.getUsername();
}
public class Main {
public static void main(String[] args) {
Member member1 = new Member(1,"Cho");
System.out.println("member1.getId() = " + member1.getId());
System.out.println("member1.getUsername() = " + member1.getUsername());
Member member2 = new Member(member1);
System.out.println("member2.getId() = " + member2.getId());
System.out.println("member2.getUsername() = " + member2.getUsername());
System.out.println();
member2.setUsername("Kim");
System.out.println("member1.getId() = " + member1.getId());
System.out.println("member1.getUsername() = " + member1.getUsername());
System.out.println("member2.getId() = " + member2.getId());
System.out.println("member2.getUsername() = " + member2.getUsername());
}
}
//member1.getId() = 1
//member1.getUsername() = Cho
//member2.getId() = 1
//member2.getUsername() = Cho
//member1.getId() = 1
//member1.getUsername() = Cho
//member2.getId() = 1
//member2.getUsername() = Kim
이렇게 복사된 인스턴스는 독립적인 메모리 공간에 존재하는 별도의 인스턴스이므로 서로 영향을 받지 않는다
static void print(){
System.out.println(this.id);
System.out.println(this.username);
}
public class Member {
private int id;
private String username;
private int[] list;
public Member(Member member) {
this.id = member.getId();
this.username = member.getUsername();
this.list=member.getList();
}
public Member(int id, String username, int[] list) {
this.id = id;
this.username = username;
this.list = list;
}
}