백엔드 엔지니어링/Spring Boot

[Java] 객체 생성은 어디서 해요?

혜이드 2025. 8. 16. 16:16

*이 포스팅은 <신한투자증권 프로디지털아카데미> 김송아 강사님의 강의 기반으로 작성되었습니다. 

 

개요

 

https://gpdbs9409.tistory.com/70

 

객체지향이 뭐라고 생각하세요?

*이 포스팅은 김송아 강사님의 강의 기반으로 작성되었습니다. 개요개발자는 프로그램 전반을 설계할 줄 아는 사람이어야 한다. 문제를 추상화 해서 핵심을 뽑아 내고 가이드라인을 제공할 수

gpdbs9409.tistory.com

지난번에 이 포스팅에서 객체는 무엇이고 클래스는 무엇일까?

라는 것에 대해 다뤄보았는데, 그럼 실제 프로젝트에서 객체생성을 어디서 해야할지 생각보자.

 

Main class에서 해도 될까? 

 

 

 

클래스 분류 

 

클래스는 크게 두 가지로 쪼갤 수 있다.

 

1.실행용 클래스 : main 메소드를 가지는 클래스 

public class Main {
    public static void main(String[] args) {
        Car tesla = new Car("Tesla Model 3"); //이런식으로 main 클래스의 main함수에서 생성할까?
        Person yoon = new Person(tesla);        
        yoon.driveCar();
    }
}

 

2.라이브러리용 클래스 : main 메소드를 가지지 않는 클래스 =>객체화

public class Person {
    private Car car;

    public void buyCar() {
        this.car = new Car(); // 아니면 일반 class내에서?
    }
}

 

우리는 1과 2 중 어디서 객체를 생성해야할까?

 

답은 1번이다.

왜 2번에서 객체를 생성하면 안되냐구?

 

지난 글에서 설계에서 마법의 답변은 "유지보수"와 "확장성"이라고 했다. 

 

이유 1.

2번 클래스에서 객체를 만들어버리면,  

다른 메소드 또한 저 설계도에서 생성된 객체를 쓰지 못한다.

 

이유2.

만약에.. 저 Person 안에 new car로 객체 생성을 했는데, car가 다른 api등을 참고하는 무거운 객체라면?

불필요하게 무거운 객체가 person이 여러개 만들어질 때마다 따라다녀야한다. 

 

그래서 

public class Car {
    private String model;
    public Car(String model) {
        this.model = model;
    }
    public void drive() {
        System.out.println(model + "을(를) 운전합니다.");
    }
}

public class Person {
    private Car car;

    // Person은 Car를 직접 만들지 않고 외부에서 받아옴
    public Person(Car car) {
        this.car = car;
    }

    public void driveCar() {
        car.drive();
    }
}

 

 

이런식으로 객체 생성은 하지 않되, person안에 car를 외부에서 받아오는 식으로 의존성만 주입해준다. 

 

그리고 main에서 이렇게 쓴다.. 

public class Main {
    public static void main(String[] args) {
        Car tesla = new Car("Tesla Model 3");   // ✅ Main에서 생성
        Person yoon = new Person(tesla);        // ✅ 주입 (DI)
        yoon.driveCar();
    }
}

 

 

 


 

 

 

 

cf) 생성자 퀴즈

 

Q1. 생성자는 객체가 살아있는 동안 언제든 호출할 수 있다. X 

 => 생성될때만 호출 가능함! !  

Q2. 기본 생성자는 생략할 수 있다. O

=>있음 

Q3. 생성자를 호출할 때 메모리에 객체가 올라간다 O

Q4. '수동' 소멸자가 있다. X

(GC가 대신 해줌)

FINALIZER라고 수동으로 소멸자 할 수 있지만, 권하지는 않는다.

 

 

'백엔드 엔지니어링 > Spring Boot' 카테고리의 다른 글

[Spring Boot 기초]JVM이란?  (6) 2025.08.15
[Java]Collection?  (5) 2025.08.15