새소식

JAVA

자바 기초 : 생성자

  • -

핵심개념

  • 생성자 : new연산자로 호출되는 {}블록. 클래스로부터 new 연산자로 객체를 생성할 때 호출되어 객체의 초기화를 담당. 모든 클래스에 하나 이상 존재한다.
    ex) Car myCar = new Car();

  • 객체 초기화 : 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것. 생성자를 실행하지 않으면 클래스로부터 객체를 만들 수 없다.
    new연산자에 의해 생성자가 성공적으로 실행 -> 힙 영역에 객체가 생성, 객체의 번지가 리턴 -> 리턴된 객체의 번지가 클래스 변수에 저장됨

  • 기본 생성자 : 모든 클래스는 생성자가 반드시 있어야하며, 생성자를 하나 이상 가질 수 있다. 만약 클래스 내부에 생성자 선언을 생략할 경우 컴파일러에 의해 바이트코드에 내용이 비어있는 기본생성자를 자동으로 추가된다.
    *소스 파일 : 프로그래밍 언어로 이루어진 파일
    *바이트 코드 파일 : 자바 소스 파일을 javac 명령어로 컴파일한 파일
    *확장명이 .java인 텍스트 파일을 생성하고 자바 언어로 코드를 작성한 후 이렇게 만들어진 자바 소스파일을 컴파일하면 확장명이 .class인 바이트 코드 파일이 생성된다.
    ex) [public] 클래스() {}  -> 클래스가 public 으로 선언되어있을시 생성자도 public, 아니면 제외

 

  • 생성자 선언 : 기본 생성자 대신 생성자를 선언하려면 아래와 같은 형태로 선언해야한다. 생성자 블록 내부의 객체 초기화 코드는 필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용전에 필요한 준비를 한다. 또한 매개변수선언은 생략하거나 여러개를 선언하는 것이 가능하다.
    ex) [public] 클래스 (매개변수선언,...) {
           //객체의 초기화 코드
     }

    만약 클래스에 기본생성자가 아닌 생성자가 선언되어있을 경우 반드시 기본생성자가 아닌 선언된 생성자를 호출해서 객체를 생성하야한다.
    ex)
    Car myCar = new Car("승용차", "검정", 300);  (o)
    Car myCar = newCar();  (x)
public class Car {
   //생성자
   Car(String color, int cc){
   System.out.println("Car 객체가 생성되었습니다.");
   }
}

---------------------------------------------------------------------------------

public class CarEx {
   public static void main(String[] args) {
   // Car myCar = new Car() (x)
   //생성자를 선언했기 때문에 기본생성자로는 호출할 수 없음

   Car myCar = new Car("흰색", 3000);
   }
}
실행결과 : Car 객체가 생성되었습니다.

 

  • 필드 초기화 : 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다. 다른 값으로 초기화하고 싶다면 필드를 선언할 때 초기값을 주거나 생성자에서 초기값을 주는 방법이 있다. 필드에서 선언할때 준 초기값은 객체 생성시에는 필드의 값이 모두 같으나 객체 생성 후 초기값을 변경할 수 있다.
public class Korean {
   //필드
   String nation = "대한민국";
   //초기값을 대한민국으로 준 경우 Korean 클래스로부터 k1,k2객체 생성시 k1과k2객체의 nation필드는 대한민국이 저장됨
   String name;
   String ssn;

   //생성자
   public Korean(String n, String s) /*매개변수선언*/ {
   //객체의 초기화 코드
   name = n;
   ssn = s;
   }

   /*매개변수 이름을 필드이름과 동일하게 할 경우
   public Korean(String name, String ssn){
   this.name = name;    //this는 객체 자신의 참조이다.
   this.ssn = ssn;          //this.필드 = 매개변수;
   }
   */
}

---------------------------------------------------------------------------------------------------------------------------------

public class KoreanEx {
   public static void main(String[] args) {
   Korean k1 = new Korean("박삼삼", "012345-1234567");
   System.out.println("k1.name : " + k1.name);
   System.out.println("k1.name : " + k1.ssn);

   Korean k2 = new Korean("김칠칠", "123456-1234567");
   System.out.println("k2.name : " + k2.name);
   System.out.println("k2.name : " + k2.ssn);
   }
}
실행결과 : 
k1.name : 박삼삼
k1.name : 012345-1234567
k2.name : 김칠칠
k2.name : 123456-1234567

 

  • 생성자 오버로딩 : 매개 변수를 달리하는 생성자를 여러개 선언하는 것. 외부에서 제공되는 다양한 데이터를 사용하여 객체를 초기화하려면 생성자가 다양화 되어야 할 필요가 있다. 생성자 오버로딩은 매개변수의 타입과 개수, 순서가 다르게 선언되어야 한다.
    ex) Car car1 = new Car();
          Car car2 = new Car("흰색")
          Car car3 = new Car("흰색", 300)
    생성자 오버로딩 시 매개변수의 타입, 개수, 선언된 순서가 같은 경우 매개변수의 이름만 바꾸는 것은 생성자 오버로딩이 아니다.
    ex) Car(String model, String color) {....}
          Car(String color, String model) {....}   -> 오버로딩 아님
public class Car {
   //필드
   String company = "현재자동차";
   String model;
   String color;
   int maxSpeed;

   //생성자
   //생성자 오버로딩을 통해 다양한 데이터로 객체 초키화
   Car(){ //생성자1
   }
   Car(String model){ //생성자2
   this.model = model;
   }
   Car(String model, String color){ //생성자3
   this.model = model;
   this.color = color;
   }
   Car(String model, String color, int maxSpeed){ //생성자4
   this.model = model;
   this.color = color;
   this.maxSpeed = maxSpeed;
   }
}

----------------------------------------------------------------------------------------------------------------------

public class CarEx {
   public static void main(String[] args) {
   Car car1 = new Car(); //생성자1
   System.out.println("car1.company : " + car1.company);
   System.out.println(); //한줄 띄우기

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

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

   Car car4 = new Car("택시", "검정", 200); //생성자4
   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);
   }
}

실행결과 : 
car1.company : 현재자동차

car2.company : 현재자동차
car2.model : 자가용

car3.company : 현재자동차
car3.model : 자가용
car3.color : 빨강

car4.company : 현재자동차
car4.model : 택시
car4.color : 검정
car4.maxSpeed : 200

 

  • 다른 생성자 호출 -> this()
    :생성자에서 객체 자신의 또다른 생성자를 호출할 때 this() 코드 사용. 생성자 오버로딩이 증가할 경우 생성자 간의 중복 코드 발생. 이 경우 필드 초기화 내용을 한 생성자에게만 집중 작성하고 나머지 생성자는 초기화 내용을 가진 생성자로 호출하면서 해결함. 또한 this()코드는 반드시 생성자 첫 줄에서만 허용된다.
    ex) 클래스([매개변수, ...]){
              this(매개변수, ..., 값, ...   );
              실행문;
          }
public class Car {
   //필드  

   String company = "미래자동차";
   String model;
   String color;
   int maxSpeed;

   //생성자
   Car(){
   }
   Car(String model){
   this(model, null, 0); //호출
   }
   Car(String model, String color){
   this(model, color, 0); //호출
   }
   Car(String model, String color, int maxSpeed){ //호출
   this.model = model; //공통실행코드
   this.color = color; //공통실행코드
   this.maxSpeed = maxSpeed; //공통실행코드
   }
}
   
--------------------------------------------------------------------------------------------

public class CarEx {
   public static void main(String[] args) {
   Car car1 = new Car(); //생성자1
   System.out.println("car1.company : " + car1.company);
   System.out.println(); //한줄 띄우기


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


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


   Car car4 = new Car("택시", "검정", 200); //생성자4
   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);
   }
}
실핼결과 : 
car1.company : 미래자동차

car2.company : 미래자동차
car2.model : 자가용

car3.company : 미래자동차
car3.model : 자가용
car3.color : 빨강

car4.company : 미래자동차
car4.model : 택시
car4.color : 검정
car4.maxSpeed : 200

'JAVA' 카테고리의 다른 글

자바 기초 : 인스턴스 멤버와 정적 멤버  (0) 2023.03.07
자바 기초 : 메소드  (0) 2023.03.06
자바 기초 : 필드  (0) 2023.03.02
자바 기초 : 객체 지향 프로그래밍  (0) 2023.03.02
자바 기초 : 열거 타입  (0) 2023.02.24
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.