5.1 생성자(constructor)
생성자란?
- 인스턴스가 생성될 때마다 호출된다.- 인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용
- 몇가지 조건을 제외하고는 메서드와 같다.
- 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
같은 설계도로 만들어진 같은 차인데 색이 다르다고 보면됨.
5.2 생성자의 조건
- 생성자의 이름은 클래스의 이름과 같아야 한다.- 생성자는 리턴값이 없다. (void를 써버리면 메서드가 되어버림)
class Tv
{
String color="black";
Tv()//생성자
{
System.out.println("생성자에서 출력");
//생성자에서 먼저 출력이 이루어진다.
color = "red";
//처음에 black으로 설정해주었지만, 생성자 호출로 red로 변경
}
}
class Main
{
public static void main(String[] args)
{
Tv t = new Tv();
//new Tv()에서 생성자 Tv()를 호출한것임!!
//생성자를 호출을 했을때 비로써 객체 생성된것임!!
System.out.println(t.color);
}
}
5.3 기본생성자(default constructor)
기본생성자란?
- 매개변수가 없는 생성자 (생성자도 오버로딩가능)- 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.
- 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.
- card(){} << 컴파일러에 의해 만들어진 예, 매개변수도 없고, 내용도 없음.
즉, 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
5.4 매개변수가 있는 생성자
class Tv
{
String color;
Tv(String c)
{
color=c;
}
}
class Main
{
public static void main(String[] args)
{
//Tv t = new Tv(); //error 매개변수가 없다..
//생성자가 하나도 없었다면 컴파일러가 만들어 주었겠지만
//위는 String을 받는 생성자가 있기때문에 에러
Tv t1 = new Tv("blue");
Tv t2 = new Tv("red");
System.out.println(t1.color);
System.out.println(t2.color);
}
}
생성자를 여러가 둘수도 있다.(오버로딩 가능)
class Tv
{
String color;
Tv()
{
color="black";
}
Tv(String c)
{
color=c;
}
}
5.5 생성자에서 다른 생성자 호출하기 - this()
this - 같은 클래스의 다른 생성자를 호출할 때 사용.
즉, 생성자에서 자신의 다른 생성자를 호출할때 this를 사용한다.그리고 다른 생성자 호출은 생성자의 첫 문자에서만 가능(왜 이렇게 했는지는 모르겠음 ㅜㅜ)
this를 활용하여 코드의 재사용성을 높임.
class Tv
{
String color;
Tv()
{
this("black");
}
Tv(String c)
{
color=c;
}
}
this 사용시 주의 사항
항상 생성자의 첫줄에서 사용해야 한다.
class Tv
{
String color;
Tv()
{
System.out.println("test");
this("black");
//this가 첫줄이 아니라는 에러 발생
}
Tv(String c)
{
color=c;
}
}
5.6 참조변수 this
this
- 인스턴스 자신을 가리키는 참조 변수- 인스턴스의 주소가 저장되어 있음
- 모든 인스턴스 메서드에 지역 변수로 숨겨진 채로 존재
즉, this는 생성자에서 인스턴스 변수접근에서만 사용한다.
//클래스 변수와 지역변수와의 구분
class Main
{
static int x = 100;
public static void main(String[] args)
{
int x = 200;
System.out.println(Main .x);
System.out.println(x);
}
}
//인스턴스변수와 지역변수와의 구분
// 이때 this를 사용하는것!!!
class Tv
{
String color;
Tv()
{
this("black");
}
Tv(String color)
{
this.color=color;
//이름이 중복되는경우 this사용
//지역변수 color와 인스턴스변수 color
}
}
class Main
{
int x = 100;
public static void main(String[] args)
{
int x = 200;
System.out.println(x);
System.out.println(this.x);
}
}
생성자 예제
생성자를 이용한 문서이름 만드는 프로그램
class Document
{
static int count = 0;
String name;
Document()
{
this("noname" + ++count);
}
Document(String name)
{
this.name = name;
System.out.println("문서 " + this.name + "가 생성되었습니다.");
}
}
class DocumentTest
{
public static void main(String[] args)
{
Document d1 = new Document();
Document d2 = new Document("java.txt");
Document d3 = new Document("asdf.pdf");
Document d4 = new Document();
}
}
5.7 생성자를 이용한 인스턴스의 복사
- 인스턴스간의 차이는 인스턴스변수의 값 뿐 나머지는 동일하다.- 생성자에서 참조변수를 매개변수로 받아서 인스턴스변수들의 값을 복사한다.
- 똑같은 속성값을 갖는 독립적인 인스턴스가 하나 더 만들어진다.
class Car
{
String color;
String gearType;
int door;
Car()
{
this("white","auto",4);
}
Car(Car c)//Car 타입을 받는 생성자
{
color = c.color; //입력받은 c(주소)의 color 값을 대입(복사)
gearType = c.gearType;//입력받은 c(주소)의 gearType 값을 대입(복사)
door = c.door;//입력받은 c(주소)의 door 값을 대입(복사)
}
Car(String color, String gearType, int door)
{
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class CarTest2
{
public static void main(String[] args)
{
Car c1 = new Car();
Car c2 = new Car(c1); //c1의 복사본 c2를 생성한다.
System.out.println(c1.color +" "+ c1.gearType +" "+ c1.door);
System.out.println(c2.color +" "+ c2.gearType +" "+ c2.door);
c1.door = 100; //c1의 인스턴스 변수 door의 값을 변경한다.
System.out.println("c1.door 100으로 수정");
System.out.println(c1.color +" "+ c1.gearType +" "+ c1.door);
System.out.println(c2.color +" "+ c2.gearType +" "+ c2.door);
//c2의 door은 변경되지 않는다.
}
}