Java

자바 객체 심화버전

상상모음 2025. 2. 17. 17:40

자바에서 객체를 생성하는 방법은 단순한 new 키워드를 넘어서 다양한 패턴과 메커니즘을 활용할 수 있습니다. 객체 생성 방식에 따라 코드의 유지보수성, 확장성, 메모리 관리 등이 달라질 수 있습니다.

 

 

package class1.pattern;

public class Singleton {
    //싱글톤 패턴: 특정 클래스의 객체가 하나만 존재하도록 보장하는 패턴입니다.
    private static Singleton instance;

    private Singleton(){} //외부에서 직접 객체 생성 방지

    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }

    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

        System.out.println(s1 == s2);
    }

    /*
    싱글톤 패턴의 장점
    메모리 절약  (불필요한 객체 생성 방지).
    여러 곳에서 동일한 객체를 공유하여 상태 관리가 용이함.
    DB 커넥션 관리, 설정 클래스 등에 유용함.
     */
}


package class1.pattern;

//빌더 패턴 (Builder Pattern)
//빌더 패턴은 객체의 생성 과정이 복잡할 때 가독성과 유지보수성을 높이는 방법입니다.
public class Computer {
    private String CPU;
    private int RAM;
    private int storage;

    // 빌더 클래스 정의
    public static class Builder {
        private String CPU;
        private int RAM;
        private int storage;

        public Builder setCPU(String CPU) {
            this.CPU = CPU;
            return this;
        }

        public Builder setRAM(int RAM) {
            this.RAM = RAM;
            return this;
        }

        public Builder setStorage(int storage) {
            this.storage = storage;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }

    private Computer(Builder builder) {
        this.CPU = builder.CPU;
        this.RAM = builder.RAM;
        this.storage = builder.storage;
    }

    public void showSpecs() {
        System.out.println("CPU: " + CPU + ", RAM: " + RAM + "GB, Storage: " + storage + "GB");
    }

    public static void main(String[] args) {
        Computer computer = new Computer.Builder()
                .setCPU("인텔 i9")
                .setRAM(32)
                .setStorage(1000)
                .build();

        computer.showSpecs();
    }
}

//장점
//
//필수 값과 선택 값을 구분하여 객체 생성 가능.
//가독성이 좋고, 불변 객체(Immutable Object) 생성에 유용함.
//매개변수 개수가 많을 때 유용함.


package class1.pattern;


//객체 복사
public class ShallowCopy {
    //얕은 복사 (ShallowCopy)
    //객체의 참조 주소만 복사하는 방식으로 내부 객체는 공유 됨.

    String name;

    public ShallowCopy(String name){
        this.name = name;
    }

    public static void main(String[] args) {
        ShallowCopy person1 = new ShallowCopy("남건우");
        ShallowCopy person2 = person1; //참조 주소 복사.

        person2.name = "남건우";

        System.out.println(person1.name); //남건우
    }
}//person1과 person2가 같은 객체를 참조하기 때문에, person2의 값을 변경하면 person1도 영향을 받음.



package class1.pattern;


//깊은 복사
//새로운 객체를 생성하여 기존 객체와 독립적인 데이터를 유지하도록 합니다.
public class DeepCopy implements Cloneable {
    String name; //이름 필드

    //생성자
    public DeepCopy(String name){
        this.name = name;

    }

    // 깊은 복사 (Cloneable 인터페이스를 올바르게 구현)
    public DeepCopy clone(){
        return new DeepCopy(this.name);
    }

    public static void main(String[] args) {
        DeepCopy person1 = new DeepCopy("남시은");
        DeepCopy person2 = person1.clone(); //새로운 객체 생성

        person2.name = "남건우";

        //person1과 person2가 서로 다른 객체를 참조함.
        System.out.println(person1.name); //"남시은"
        System.out.println(person2.name); //"남건우"
    }
}

/*
결론
자바에서 객체를 생성하는 다양한 방식
    방식	                  특징
  new 키워드:	기본적인 객체 생성
  정적 팩토리 메서드:	객체 생성을 캡슐화, 유지보수 용이
  싱글톤 패턴:	객체 하나만 유지 (메모리 절약)
  빌더 패턴:	복잡한 객체 생성 시 가독성 향상
  얕은 복사: 	참조 주소만 복사 (동일한 객체 공유)
  깊은 복사:	새로운 객체를 생성하여 데이터 독립

    각 방식은 상황에 따라 적절히 활용하는 것이 중요합니다.
    이제 객체 생성 방식을 프로젝트에 맞게 선택해서 활용해보세요!
 */