(JAVA) 생성자, 생성자 오버로딩, this, this()

InAnarchy·2022년 10월 20일
0

JAVA

목록 보기
10/18
post-thumbnail

Table of Contents

  • 생성자
  • 매개변수가 있는 생성자
  • 필드 초기화
  • 참조변수 this
  • 생성자 오버로딩
  • 다른 생성자 호출:this()

생성자

  • 생성자는 인스턴스가 생성될 때 마다 호출되는 "인스턴스 초기화 메서드"이다.
  • 메서드 내에 선언되며 리턴값이 없다.
  • 모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있다.
class Card {
     ...
    Card() {  // 매개변수가 없는 생성자.
        // 인스턴스 초기화 작업
    }
    Card(String kind, int number) { // 매개변수가 있는 생성자
        // 인스턴스 초기화 작업
    }

클래스를 설계할 때 생성자를 생략하면 기본 생성자가 생성된다. 즉

public class Car{
}

와 같이 생성자를 선언하지 않아도

public class Car{
	pulic Car(){}
}

처럼 기본 생성자 Car()가 생성된다.

우리가 명시적으로 생성자를 선언하려면 다음과 같은 형태로 작성한다.

클래스(매개변수 선언..){
	//객체의 초기화 코드
}

그런데 생성자가 하나라도 존재하는 경우에는 기본 생성자가 삽입되지 않는다.


위 코드에서는 컴파일 에러가 발생한다.
Data_2 클래스의 인스턴스를 생성할 때 생성자 Data_2(int x)를 사용하거나 Data_2클래스에 생성자 Data_2()를 추가로 정의하면 된다.

매개변수가 있는 생성자

매개변수는 생략해도 되고 여러개를 선언해도 된다. 매개변수는 new 연산자로 생성자를 호출할 때 외부 값을 생성자 내부로 전달하는 역할을 한다.

Car mycar = new Car("그랜저","블랙",300);

과 같이 Car생성자를 호출하려면 다음과 같이 선언한다.

public class Car{
	//생성자
    Car(String model, String color, int speed){
    ...
    }
}

예제를 보자.

class Car {
    Car(String color, int cc) { //생성자를 선언함
    }
}

public class CarExample{
    public static void main(String[] args) {
        Car mycar = new Car("블랙",3000); 
        //Car mycar = new Car(); 클래스에 생성자를 선언했기 때문에 기본 생성자를 호출할 수 없음.
        System.out.println(mycar);
    }
}
class Car {
    String color;
    String gearType;
    int door;

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

    Car(String c, String g, int d) {
        color = c;
        gearType = g;
        door = d;
    }
}

class CarExample {
    public static void main(String[] args) {
        Car c1 = new Car("white", "auto", 4);
        System.out.println(c1.color + c1.gearType  + c1.door);
    }
}

필드 초기화

  1. 필드를 선언할 때 초기값을 준다
    다음과 같이 필드를 선언하고
public class Korean{
String nation = "대한민국";
String name;
String ssn;
}

다음과 같이 객체를 생성하면 k1,k2객체의 nation필드에는 모두 대한민국이 저장되어 있다.

Korean k1 = new Korean();
Korean k2 = new Korean();
  1. 생성자의 매개값으로 값들을 받아온다.
    public Korean(String n, String s) {
        name=n;
        ssn=s;

즉,

class Korean{
    String nation = "대한민국";
    String name;
    String ssn;
    //생성자
    public Korean(String n, String s) {
        name=n;
        ssn=s;
    }
}
public class KoreanExample {
    public static void main(String[] args) {
        Korean son = new Korean("손은미", "990413");

        System.out.println(son.name + "의 주민번호 앞자리는 " + son.ssn);

        Korean jung = new Korean("정철균","990413");

        System.out.println(jung.name + "의 주민번호 앞자리는 " + jung.ssn);
    }
}

참조변수 this

자바에서는 매개변수의 이름을 멤버 변수와 같은 이름으로 붙이는 경우가 많은데, 이 때는 참조변수 this를 사용하면 좋다.

위의 경우 Korean생성자의 매개변수 이름을 n,s로 사용했다.

그런데 필드의 인스턴스 변수와 매개변수의 이름이 동일할 때 this를 이용하여 다음과 같이 수정할 수 있다.

class Korean{
    String nation = "대한민국";
    String name;
    String ssn;
    //생성자
    public Korean(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
    }
}
public class KoreanExample {
    public static void main(String[] args) {
        Korean son = new Korean("손은미", "990413");

        System.out.println(son.name + "의 주민번호 앞자리는 " + son.ssn);

        Korean jung = new Korean("정철균","990413");

        System.out.println(jung.name + "의 주민번호 앞자리는 " + jung.ssn);
    }
}

생성자 오버로딩

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

class Car {
    //필드
    String company = "테슬라";
    String model;
    String color;

    //생성자
    Car() {
    }

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

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

public class Carexample {
    public static void main(String[] args) {
        Car car1 = new Car();
        System.out.println("car1.compnay: " + car1.company);

        Car car2 = new Car("모덽X");
        System.out.println("car2.compnay: " + car2.company);
        System.out.println("car2.model: " + car2.model);

        Car car3 = new Car("모델X","화이트");
        System.out.println("car3.compnay: " + car3.company);
        System.out.println("car3.model: " + car3.model);
        System.out.println("car3.color: "+ car3.color);
    }
}

다른 생성자 호출:this()

  • 생성자에서 다른 생성자를 호출할 때 사용한다.
  • 반드시 첫 줄에서만 호출이 가능하다.

class Car {
    String color;
    String gearType;
    int door;

    Car() {
        this("white", "auto", 4);
    } //Car(String color, String gearType, int door)호출

    Car(String color){
        this(color, "auto", 4);
    } //Car(String color, String gearType, int door)호출

    Car(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

class CarExample {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car("blue");

        System.out.println(c1.color + "," + c1.gearType + "," + c1.door);
        System.out.println(c2.color + "," + c2.gearType + "," + c2.door);
    }
}

위의 경우 Car()에서 다른 생성자 Car(String color, String gearType, int door)를 호출하였다.

class Car {
    //필드
    String company = "테슬라";
    String model;
    String color;
    int maxSpeed;

    //생성자
    Car() {
    }

    Car(String model){
        this(model, "화이트");
    }

    Car(String model, String color){
        this(model, color, 250);
    }

    Car(String model, String color, int maxSpeed){
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}
public class Carexample {
    public static void main(String[] args) {
        Car car1 = new Car();
        System.out.println("car1.compnay: " + car1.company);

        Car car2 = new Car("모덽X");
        System.out.println("car2.compnay: " + car2.company);
        System.out.println("car2.model: " + car2.model);

        Car car3 = new Car("모델X","화이트");
        System.out.println("car3.compnay: " + car3.company);
        System.out.println("car3.model: " + car3.model);
        System.out.println("car3.color: "+ car3.color);

        Car car4 = new Car("모델X","화이트",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);
    }
}
class Date {
    private int year;
    private int month;
    private int day;

    Date() {
        this(22, 10, 20);
    }

    ;

    Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    void pr() {
        System.out.println(year + "/" + month + "/" + day);
    }
}

public class DateEx {
    public static void main(String[] args) {
        Date d1 = new Date();
        d1.pr();
        Date d2 = new Date(20,10,20);
        d2.pr();
    }
}
output
22/10/20
20/10/20
profile
github blog 쓰다가 관리하기 귀찮아서 돌아왔다

0개의 댓글