본문 바로가기
개발 수업/JAVA

[Java] 클래스/생성자

by 오늘 하루s 2023. 5. 16.
728x90
더보기

Day13-4. 230516

생성자

생성자란?

new 연산자에 의해 호출되어 객체의 초기화 담당

 

객체 초기화란?

필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것.

생성자를 실행하지 않고는 클래스로부터 객채를 만들 수 없음. 

 

기본 생성자

- 모든 클래스는 생성자가 반드시 존재. 하나 이상 가질 수 있음.

- 생성자 선언을 생략하면 컴파일러는 중괄호{} 블록 내용이 비어 있는 기본 생성자 추가.

[public] 클래스() { }

- 클래스가 public class로 선언되면 기본 생성자도 public이 붙지만,

클래스가 public class 없이 class로만 선언되면 기본 생성자도 public이 붙지 않음.

- Car 클래스를 설계할 때 생성자를 생략하면 기본 생성자가 자동 생성.

- 클래스에서 생성자를 선언하지 않아도 Car()인 기본 생성자를 호출해서 객체를 생성할 수 있음.

 

 

생성자 선언

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

//생성자 블록
클래스(매개변수선언,... ){
   //객체의 초기화 코드
}

Car 생성자를 호출할 때 3개의 매개값 제공한다면

Car mycar = new Car("그랜저","검정",300);

세 매개값을 생성자가 받기 위해 다음과 같이 매개 변수 선언

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

 

 

필드 초기화

- 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정됨.

- 다른 값으로 초기화하기 위해

1) 필드를 선언할 때 초기값을 주는 방법

-> 동일한 클래스로부터 생성되는 객체들은 객체 생성 시 모두 같은 값을 갖게 됨.

public class Korean{
  String nation = "대한민국";
}

-> Korean 클래스에 nation 필드를 선언하며 "대한민국"으로 초기값 준 경우

Korean k1 = new Korean()
Korean k2 = new Korean()

-> k1, k2 객체의 nation 필드에는 모두 "대한민국"이 저장되어 있음.

 

2) 생성자에 초기값을 주는 방법

public class Korean{
   //필드
  String name;
  String ssn;

  //생성자
  public Korean(String n, String s){
      name = n;
      ssn = s;
  }
}
Korean k1 = new Korean("박자바", "00000-0000000")
Korean k2 = new Korean("김자바", "111111-1111111")

-> 아래코드에서 매개 변수 값 전달되고 name필드와 ssn필드에 초기값으로 사용됨.

 

  • 매개 변수와 필드명이 같은 경우 this 사용
 public Korean(String n, String s){
      this.name = name;
      this.ssn = ssn;
  }

this는 객체 자신의 참조로 객체가 객체 자신을 this라고 함.

'this.필드'는 this라는 참조 변수로 필드를 사용하는 것과 동일.

 

생성자 오버로딩

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

-> 다양한 방법으로 객체를 생성하기 위해 사용

- 생성자 오버로딩 시 주의할 점은 매개 변수 타입과 개수, 선언된 순서가 똑같을 경우 매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아니다.

Car(String model, String color){....}
Car(String color, String model){....} //오버로딩 아님.

- Car클래스에서 생성자 오버로딩한 예

public class Car{
   Car(){...}
   Car(String model){...}
   Car(String model, String color){....}
}

- Car객체 생성

Car car1 = new Car();
Car car1 = new Car("그랜저");
Car car1 = new Car("그랜저","흰색");

 

 

Car06 클래스>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package chap0607;
 
import java.util.Date;
 
public class Car06 {
    //field
    private String     company;
    private int     price;
    private char      grade; //에너지등급 예)'A','B'
    private boolean isHybrid; //하이브리드유뮤 예)true,false 
    private Date    productionDay; //생산일
    
    //constructor
    //생성자 오버로딩
    public Car06_p232() {}
    public Car06_p232(String company,int price) {
        this.company=company;
        this.price=price;
    }    
    public Car06_p232(String company) {
        this.company=company;
    }    
    public Car06_p232(int price) {
        this.price=price;
    }
    
    //method
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public char getGrade() {
        return grade;
    }
    public void setGrade(char grade) {
        this.grade = grade;
    }
    public boolean isHybrid() {
        return isHybrid;
    }
    public void setHybrid(boolean isHybrid) {
        this.isHybrid = isHybrid;
    }
    public Date getProductionDay() {
        return productionDay;
    }
    public void setProductionDay(Date productionDay) {
        this.productionDay = productionDay;
    }
}
cs

 

Car06Main 클래스>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package chap0607;
 
public class Car06Main {
    public static void main(String[] args) {
        //Car06클래스의 매우좋은회사에서 생산한 판매가격이 5000인 파라미터가 1개인 생성자를 호출하여 객체생성
        Car06_p232 myCar3 = new Car06_p232("매우좋은회사",5000);
        System.out.println(myCar3.getCompany());
        System.out.println(myCar3.getPrice());
        System.out.println("--------");
        System.out.println();
 
        //Car06클래스의 int타입 파라미터가 1개인 생성자를 호출하여 객체생성
        Car06_p232 myCar2 = new Car06_p232(3000);
        System.out.println(myCar2.getPrice());
        System.out.println("--------");
        System.out.println();
 
        //Car06클래스의 String파라미터가 1개인 생성자를 호출하여 객체생성
        Car06_p232 myCar1 = new Car06_p232("좋은회사");
        System.out.println(myCar1.getCompany());
        System.out.println("--------");
        System.out.println();
        
        //Car06클래스의 기본생성자를 호출하여 객체생성
        Car06_p232 myCar = new Car06_p232();
        System.out.println(myCar.getCompany());
        System.out.println(myCar.getPrice());
        System.out.println(myCar.getGrade());
        System.out.println(myCar.isHybrid());
        System.out.println(myCar.getProductionDay());
    }
}
 
cs
더보기

* 실행 결과

 

매우좋은회사
5000
--------

3000
--------

좋은회사
--------

null
0

728x90

'개발 수업 > JAVA' 카테고리의 다른 글

[Java] 상속/부모 생성자 호출 super()  (0) 2023.05.17
[Java] 클래스/this()  (0) 2023.05.17
[Java] 클래스/접근제한자  (0) 2023.05.16
[Java] final,상수(static final)  (0) 2023.05.16
[Java] 상속(inheritance)/클래스 상속  (0) 2023.05.16