본문 바로가기

객체 지향 프로그래밍 - 클래스

생성자 선언과 호출

기본 생성자

  • 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가


    출처, 이것이 자바다


생성자 선언

  • 객체를 다양하게 초기화하기 위해 생성자를 직접 선언할 수 있음


    출처, 이것이 자바다


  • 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일
  • 매개변수의 타입은 매개값의 종류에 맞게 작성
package ch06.sec07.exam01;

/*
 * 생성자 : 힙영역의 생성된 기억장소의 필드에 기본값을 저장목적.
 * 클래스에 기본생성자가 존재하지 않으면, 컴파일과정에서 자동으로 생성해준다.
 * 생성자를 수동으로 정의를 하면, 컴파일과정에서 기본생성자는 생성하지 않는다. 
 */
public class Car {

    String model;
    String color;
    int maxSpeed;

    //생성자 선언
    //Car() {}

    Car(String model, String color, int maxSpeed) {

    }

    //일반메소드
    public int aaa() {
        return 0;
    }
}

ackage ch06.sec07.exam01;

public class CarExample {

    public static void main(String[] args) {
        Car myCar = new Car("그랜져", "검정", 250);

        //기본생성자 호출 못함 Car클래스에 수동으로 다른 생성자가 존재하면 기본생성자 생성되지않기때문
        //Car myCar = new Car(); 




    }

}

필드 초기화

  • 객체마다 동일한 값을 갖고 있다면 필드 선언 시 초기값을 대입하는 것이 좋고, 객체마다 다른 값을 가져야 한다면 생성자에서 필드를 초기화하는 것이 좋음


    출처, 이것이 자바다


package ch06.sec07.exam02;

public class Korean {

    //필드선언
    String nation = "대한민국";
    String name;
    //String gender = "남자";
    String ssn;

    //생성자 선언 : 컴파일과정에서 기본생성자는 자동생성 안됨
    public Korean(String n, String s) {
        name = n;
        ssn = s;
    }
}

package ch06.sec07.exam02;

public class KoreanExample {

    public static void main(String[] args) {
        //생성자를 이용하여 힙영역의 필드에서 값을 초기화.
        Korean k1 = new Korean("홍길동", "123456-1234567");

        //필드를 접근하는 형태
//        k1.name = "홍길동";
//        k1.ssn = "123456-1234567";

        System.out.println("k1.nation: " + k1.nation);
        System.out.println("k1.name: " + k1.name);
        System.out.println("k1.ssn: " + k1.ssn);
        System.out.println();

        Korean k2 = new Korean("김자바", "234567-2345678"); 
        System.out.println("k2.nation: " + k2.nation);
        System.out.println("k2.name: " + k2.name);
        System.out.println("k2.ssn: " + k2.ssn);
        System.out.println();

        k2.name = "김스프링";
        System.out.println("k2.nation: " + k2.nation);
        System.out.println("k2.name: " + k2.name);
        System.out.println("k2.ssn: " + k2.ssn);

    }

}

package ch06.sec07.exam03;

public class Korean {

    //필드선언
    String nation = "대한민국";
    String name; 
//    String gender = "남자";
    String ssn; 

    //생성자 선언 : 컴파일과정에서 기본생성자는 자동생성 안됨
    public Korean(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
    }
}

생성자 오버로딩

  • 매개변수를 달리하는 생성자를 여러 개 선언하는 것


    출처, 이것이 자바다


  • 매개변수의 타입, 개수, 선언된 순서가 똑같을 경우 매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아님
  • 생성자가 오버로딩되어 있을 경우, new 연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 따라 실행될 생성자가 결정
package ch06.sec07.exam04;

public class Car {
    //필드선언
    String company = "현대자동차";
    String model; //null
    String color; //null
    int maxSpeed; //0

    //생성자 : 힙영역에 생성된 필드의 초기값 할당.

    //생성자 선언
    Car() {} //기본 생성자

    //model필드에 값을 대입하는 생성자
    Car(String model) {
        this.model = model;
    }
    //생성자 오버로딩 : 생성자를 선언시 매개변수의 타입과 개수, 순서가 같은 것은 만들수 없다.
//    Car(String color) {
//        this.color = color;
//    }

    Car(String model, String color) {
        this.model = model;
        this.color = color;
    }

    Car(String model, String color, int maxSpeed) {
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

package ch06.sec07.exam04;

public class CarExample {

    public static void main(String[] args) {

        //객체생성시 필드에 기본값을 생성자를 통하여 사용하는 방법.

        //객체선언및 생성
        Car car1 = new Car();
        System.out.println("car1.company: "  + car1.company);
        System.out.println();

        Car car2 = new Car("자가용");
        System.out.println("car2.company: " + car2.company);
        System.out.println("car2.model: " + car2.model);
        System.out.println();

        //car3 "자가용", "빨강"
        Car car3 = new Car("자가용", "빨강");
        System.out.println("car3.company: " + car3.company);
        System.out.println("car3.model: " + car3.model);
        System.out.println("car3.color: " + car3.color);
        System.out.println();

        //car4 "택시", "검정", 200
        Car car4 = new Car("택시", "검정", 200);
        System.out.println("car4.company: " + car4.company);
        System.out.println("car4.model: " + car4.model);
        System.out.println("car4.color: " + car4.color);
        System.out.println("car4.maxSpeed: " + car4.maxSpeed);
        System.out.println();

    }

}

다른 생성자 호출

  • 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있음
  • 이 경우 공통 코드를 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 this (...)를 사용해 공통 코드를 가진 생성자를 호출


    출처, 이것이 자바다


package ch06.sec07.exam05;

public class Car {
    //필드선언
    String company = "현대자동차";
    String model; //null
    String color; //null
    int maxSpeed; //0

    //생성자 : 힙영역에 생성된 필드의 초기값 할당.
    //다른 생성자 호출 : this(매개변수와 개수와 타입은 일치)

    //생성자 선언
    Car() {} //기본 생성자

    //model필드에 값을 대입하는 생성자
    Car(String model) {
//        this.model = model;
        this(model, null, 0);
    }

    Car(String model, String color) {
//        this.model = model;
//        this.color = color;
        this(model, color, 0);
    }

    Car(String model, String color, int maxSpeed) {
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

package ch06.sec07.exam05;

public class CarExample {

    public static void main(String[] args) {

        //객체생성시 필드에 기본값을 생성자를 통하여 사용하는 방법.

        //객체선언및 생성
        Car car1 = new Car();
        System.out.println("car1.company: "  + car1.company);
        System.out.println();

        Car car2 = new Car("자가용");
        System.out.println("car2.company: " + car2.company);
        System.out.println("car2.model: " + car2.model);
        System.out.println();

        //car3 "자가용", "빨강"
        Car car3 = new Car("자가용", "빨강");
        System.out.println("car3.company: " + car3.company);
        System.out.println("car3.model: " + car3.model);
        System.out.println("car3.color: " + car3.color);
        System.out.println();

        //car4 "택시", "검정", 200
        Car car4 = new Car("택시", "검정", 200);
        System.out.println("car4.company: " + car4.company);
        System.out.println("car4.model: " + car4.model);
        System.out.println("car4.color: " + car4.color);
        System.out.println("car4.maxSpeed: " + car4.maxSpeed);
        System.out.println();

    }

}