13. 객체지향프로그래밍의 심화 / 20230428
2023. 4. 29. 01:55
🧑🏻💻 TIL(Today I Learned)
'햄버거 주문 프로그램 만들기' 실습 - 2
✔️ Today's Checkpoint
🔎 싱글톤(Singleton) → 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나
소프트웨어 디자인 패턴에서 싱클톤 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글톤 패턴이라고 한다. 주로 공통된
객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
위키 백과 : 싱글턴 패턴
➡️ 애플리케이션 전체에서 단 한 개의 객체만 생성되도록 코드를 작성하는 패턴
➡️ 즉 하나의 객체만을 생성해 이후에 호출된 곳에서는 생성된 객체를 반환하여 전반에서 하나의 인스턴스만을 사용하게 하는 패턴
public class 클래스 {
//private 접근 권한을 갖는 정적 필드 선언과 초기화 --> 외부에서 정적 필드값을 변경하지 못하도록
private static 클래스 singleton = new 클래스();
//private 접근 권한을 갖는 생성자 선언
private 클래스() {}
//public 접근 권한을 갖는 정적 메소드 선언 --> 필드값 리턴
public static 클래스 getInstance() {
return singleton;
}
}
// 핵심은 생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없도록 막는 것
- 생성자를 호출할 수 없으니 외부에서 마음대로 객체를 생성하는 것이 불가능, 대신 싱글톤 패턴이 제공하는 정적 메소드를 통해 간접적으로 객체를 얻을 수 있다.
- 하나의 자원을 공유해야하는 경우 인스턴스가 단 한 번만 만들어지도록 하여 같은 객체를 참조하도록 만들어줘야 한다.
🔎 깊은 복사(Deep Copy)와 얕은 복사 (Shallow Copy)
- 얕은 복사(Shallow Copy)
→ 객체의 참조값을 복사하는 것 (참조하는 실제 값이 같음)
public void shallowCopyExample() {
Product product = new Product("커피", 4000);
Product newProduct = product;
newProduct.setName("녹차");
newProduct.setPrice(4500);
}
//newProduct 는 product에 할당되어 있던 주소값을 똑같이 할당받음
// 즉, 동일한 객체를 가리키고 있음
// product 를 통해서 객체의 필드를 수정하면 newProduct 필드도 똑같이 바뀜
- 상품 이름이 커피이고, 가격에 4000원인 인스턴스 Product를 생성하고 newProduct에 복사함 그리고 newProduct의 이름을 녹차, 가격을 4500으로 수정한다. 그러면 결과적으로 두 인스턴스는 녹차, 4500원을 가지게 된다.
→ 참조하는 주소값을 복사했기 때문에!
2. 깊은 복사(Deep Copy)
→ 내용은 동일하지만 참조값이 다른 새로운 객체를 생성하는 것 (같은 내용을 가진 다른 객체 복제)
public void DeepCopyExample(Product product) {
Product newProduct = new Product(product.getId, product.getName, ...);
}
- newProduct가 가리키는 새로운 객체는 기존 객체(prodcut)와 내용은 같지만 서로 다른 참조값을 가진다.
- 새로운 객체는 기존 객체의 필드를 변경해도 영향을 받지 않음
동일한 상품을 두 번 고르면서 옵션은 다르게 고르는 경우, A 상품 3 개를 장바구니에 담은 뒤에 다시 A 상품을 2개 넣게 된다면 먼저 추가한 3개라는 옵션이 마지막에 추가한 옵션인 2개로 덮어쓰인다.
--> 참조값을 장바구니에 그대로 담아주기 때문, 그래서 깊은 복사를 통해 새로운 객체 생성해서 넣어야한다.
🔎 의존성 주입(Dependency Injection, DI)
➡️ 객체가 자신이 의존할 객체를 스스로 만들도록 하는 것이 아니라 외부에서 주입 해 주는 것
즉, 객체 간의 의존 관계를 외부에서 설정하여 객체 간의 결합도를 낮추는 방식
➡️ 의존성 주입의 의도 : 객체의 생성과 사용의 관심을 분리하는 것 --> 가독성과 코드 재사용 높혀줌
➡️ A가 B를 의존한다는 것은 'B가 변하면 A에도 영향을 미친다.'
두 객체 간의 관계(의존성)를 맺어주는 것을 의존성 주입이라고 하며 생성자 주입, 필드 주입, 수정자 주입 등 다양한 주입 방법이 있다.
실습 후반으로 갈수록 처음 보는 어려운 개념들이 많이 나왔다. 그 개념들을 이해하고 코드에 적용 시켜보는 것이 정말 쉽지 않았다. 이론은 무슨 말인지 알겠는데 막상 코드를 보면 대체 뭐가 뭔지 모르겠는 그런 혼돈의 상태...... 일단 오늘 나온 개념들을 정리를 해 놨으니 내일은 또 다시 열심히 코드를 붙잡고 적용시킬 수 있도록 해야겠다😂. 주말을 기회로!
'SEB_BE_45 > 공부 정리' 카테고리의 다른 글
15. [Java] 컬렉션(Collection) 2 / 20230502 (0) | 2023.05.03 |
---|---|
14. [Java] 컬렉션 (Collection) 1 / 20230501 (0) | 2023.05.02 |
12. 객체지향프로그래밍의 심화 / 20230427 (0) | 2023.04.27 |
11. 객체지향프로그래밍의 이해 / 20230426 (0) | 2023.04.27 |
10. [Java] 객체지향프로그래밍의 이해 /20230425 (0) | 2023.04.25 |