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 키워드: 기본적인 객체 생성
정적 팩토리 메서드: 객체 생성을 캡슐화, 유지보수 용이
싱글톤 패턴: 객체 하나만 유지 (메모리 절약)
빌더 패턴: 복잡한 객체 생성 시 가독성 향상
얕은 복사: 참조 주소만 복사 (동일한 객체 공유)
깊은 복사: 새로운 객체를 생성하여 데이터 독립
각 방식은 상황에 따라 적절히 활용하는 것이 중요합니다.
이제 객체 생성 방식을 프로젝트에 맞게 선택해서 활용해보세요!
*/