프로그래밍/Java

[객체지향] 생성자 with Java

코드몬스터 2023. 9. 12. 01:05
728x90
본 내용은 인프런의 즐거운 자바 를 보고 정리했습니다.

 

 

생성자

  • 생성자가 있으면 기본 생성자(매개변수가 없는 생성자)는 생성 되지 않는다!!
  • 인스턴스를 사용할 때 생성자를 사용한다.
    • ex) Car taxi = new Car();
    • 즉, 우리가 특정 클래스를 new 생성자를 사용한다.
  • 어떤 값을 가지고 인스턴스가 만들어지게 하고 싶다면 생성자를 사용한다.
  • 클래스 작성시 생서자를 만들지 않았다면 자동으로 기본 생성자를 생성한다.

 

예시 코드

코드로 쉽게 이해 해보자!

 

생성자를 private 접근 제한자로 설정하면 해당 클래스는 인스턴스를 생성할 수 없다.!

 

예제 01.

결과 출력

package org.example;

public class Car {
    private String name;

    // 생성자
    // return type이 없다. 클래스와 이름이 같아야 한다.
    // 매개변수가 없는 생성자를 기본 생성자라고 한다.
    public Car () {
        System.out.println("자동차가 한 대 생성됩니다.");
    }

    public Car(String name) {
        this.name = name;
    }

    // 인스턴스 메서드
    public void printName() {
        System.out.println("자동차 이름 : " + name);
    }

}
package org.example;

public class CarExample01 extends Car {

    public static void main(String[] args) {
        Car car01 = new Car();
        car01.printName();

        System.out.println("-----------------------");
        Car car02 = new Car("myCar");
        car02.printName();
    }
}

 

예제 02.

생성자 오버로딩

  • 생성자는 매개변수의 개수가 다르거나, 타입이 다르면 여러 개를 가질 수 있다.

자신의 생성자 호출  this()

  • this는 인스턴스 자기 자신을 참조할 때 사용하는 키워드
  • this() 생성자는 자기 자신의 생성자를 말한다.
  • this()는 생성자 안에서만 생성이 가능하다.

 

 

 

package org.example;

public class User {

    // private 접근 제어자로 다른 클래스에서 접근할 수 없다.
    private String email;
    private String password;
    private String name;

    // 생성자를 하나라도 만들게 되면 기본 생성자가 자동으로 안 만들어진다.
    public User(String name, String email) {
        this(name, email, null);
    }

    // 생성자 오버로딩
    public User(String name, String email, String password) {
        this.name = name;
        this.email = email;
        this.password = password;
    }

    // 필드의 인스턴스 변수를 호출하기 위해서 getter, setter를 만들어줘야한다.
    public String getEmail() {
        return email;
    }
    public String getName() {
        return name;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String toString() {
        return "User{" +
                "email='" + email + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

 

package org.example;

public class UserExam {

    public static void main(String[] args) {
        User user = new User("이미자", "Lee@example.com");
        System.out.println(user.getName());
        System.out.println(user.getEmail());

        System.out.println("----------------");

        User user1 = new User("홍길동", "hong@example.com", "passwordTest");
        System.out.println(user1.getName());
        System.out.println(user1.getEmail());
        System.out.println(user1.getPassword());

        System.out.println("---------------");
        System.out.println(user);
        System.out.println(user1);
    }
}

 

예제 03

 

부모의 생서자를 호출하는 supser()

  • super() 생성자는 부모 생성자를 의미한다.
  • super() 생성자는 생성자 안에서만 사용가능한다.
  • 생성자는 무조건 super() 생성자를 호출해야하는데 작성하지 않았다면 자동으로 부모의 기본 생성자를 호출한다.
  • 만약 부모 클래스가 기본 생성자를 가지고 있지 않다면, 반드시 직접 super() 생성자를 호출해야한다.
  • 또는 super("test")한에 인자를 작성해줘야한다.
package org.example;

public class Car01 extends Car {

    public Car01() {
        super();    // 부모의 "기본 생성자"를 호출하는 코드가 자동으로 삽입된다.

        // 만약 부모의 기본 생성자가 없는 경우
        // 자식의 생성자에서 super를 직접 호출해야한다.
        // super 안에 전달인자를 작성해줘야 한다.
        super("test");        
        System.out.println("자동차가 한 대 생성됩니다.");
    }

}

 

 

참고 사이트

  1. http://www.tcpschool.com/java/java_methodConstructor_constructor