코딩 기록들

[Java Programming] 5.1 생성자 본문

Java

[Java Programming] 5.1 생성자

코딩펭귄 2024. 1. 23. 17:26

생성자

- 클래스를 인스턴스로 만들어주는 특별한 메소드

- 반드시 new 라는 키워드로 호출해야함

- 생성자이름은 인스턴스로 만드려는 클래스의 이름과 동일해야함 (타입과 생성자의 이름이 같아야 함)

- 안써도 됨 & 초기값을 주고싶을때 사용!

- 생성자는 반환타입이 없음 : public 클래스명() 으로 선언하고, 반환타입이 없는 메소드이기 때문에, return 키워드X (필요한경우 파라미터값은 줘야함. 반환타입이 없는거랑 파라미터 주는거랑 헷갈리지말것)

Car car = new Car();
CraneGameMachine cgm = new CraneGameMachine();

 

생성자를 정의하지 않았는데, 호출이 가능한 이유

-> 생성자가없는 클래스를 작성하면 -> '기본생성자'가 자동 추가

- 어떠한 형태의 생성자라도 클래스에 정의되어있다면, 이 과정에서 파라미터가 없는 기본생성자는 생성되지 않음

- ConstructorTest.java -
public class ConstructorTest {    
}

- ConstructorTest.class - > 자동추가됨
public class ConstructorTest {
  public ConstructorTest() {
  }
}

 

생성자를 직접 만드는 이유

1. 멤버변수를 초기화 하기 위해(멤버변수에 기본값(초기값)을 별도로 할당을 하기 위해)

- 특히, Reference Type 위주로 초기화

- ex) 배열, 컬렉션

2. 인스턴스 생성과 동시에 다른 메소드를 호출하기 위해서 사용

- ex) 인스턴스를 생성함과 동시에 insertMoney메소드를 호출하기 위해

 

Java파일이 실행되는 과정

- java파일의 실행을 위해서는 바이트코드로 변환되어야함

- > 바이트코드 변환시 생성자정의가 안되어있다면 -> 기본생성자를 자동으로 생성해줌

ex) 자바 소스 코드 -> 컴파일 (.class 해주어서 기계가 알아볼 수 있게 바뀜) & 컴파일할때 생성자 유무 체크하고, 없다면 기본생성자를 컴파일러가 개입하여 생성자 추가함

바이트코드란?

- JVM에서 동작이될수있게 구성되어있는 코드 (java파일을 바이트코드로 변경한 후 변경된파일을 JVM에서 실행)

- java파일을 바이트코드로 변경하는 과정 = 컴파일

 

                       이렇게 .class 파일들 = 컴파일 된 파일들 을 열어보면 사람은 이해하기 힘든 모습을 볼수있다

this = 생성자가 만들어준 인스턴스

 

this

- 파라미터로 전달된 값들은 멤버변수에게 할당되어야 하므로, 이러한 경우  this 사용

public class CoffeeShop {
    
    int iceAmericano;
    int hotAmericano;
    
    public CoffeeShop(int iceAmericano, int hotAmericano) {
        this.iceAmericano = iceAmericano; // 멤버변수에 초기값 할당
        this.hotAmericano = hotAmericano; // 멤버변수에 초기값 할당
    }
    
CoffeeShop cs = new CoffeeShop(4000, 3000);

 -> 여기에서 cs 가 가리키는것 : this

 

this의 의미 : 현재 호출되고있는 인스턴스

- 생성자 내부에서 : 생성자가 만든 인스턴스 객체를 가리킴

- 메소드 : 호출하는 메소드 의 (.) 앞 에 있는거, 점연산자를 사용한 인스턴스 객체


 

데이터 클래스 (Data Class)

- 멤버변수만 존재하는 클래스

- 기능이 없는 클래스

- VO(value object)클래스로 부름

- 만드는 방법 : 클래스를 만들고, 멤버변수(와 생성자) 만 씀

- Java14 부터 Data Class 를 쉽게 정의할 수 있게 됨

 

--> public record Coffee(String name, int price){}

---> 잘 안씀 : 실무에서는 자바10이상의 버전을 사용하지 않음(안정성 떨어짐, )

 

 

 

 

 

 

 

reference = 생성자 호출시에만 메모리에 쓰여짐

orderedDrink = 반환시키는 상품

null : 변수는 만들겠지만, 실제 메모리에 쓰여지는것은 만들지 말아라

 


 

유틸리티 클래스

- 기능만 존재하며, 속성이 없음

- 물리적으로는 존재할수없지만, OOP에서는 흔하게 사용됨