페이지

2015. 1. 9.

[JAVA] Day5.생성자(constructor)


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은 변경되지 않는다.
    }
}