Effective JAVA 책 완독하기1 - 생성자 대신 스태틱 팩토리 메소드를 고려하라

박경현·2023년 4월 24일
0

자바를 제대로 하려면 꼭 봐야하는 책에 항상 있던 책이다..
스프링을 시작하면서 자바의 원초적인 근본에 대해 공부해야겠다고 생각이 들어 이렇게 적어본다!

항목1 - 생성자 대신 스태틱 팩토리 메소드를 고려하라!

이 이야기에 앞서서 팩토리 패턴에 대해 짚고 넘어가야한다!

팩토리 패턴

팩토리 패턴은 클래스의 객체를 대신 만들어 주는 공장을 가지는 패턴이다!

팩토리 패턴의 장단점

장점

  • 지금 이 클래스를 잘 몰라도 팩토리 클래스가 객체 생성을 담당한다!

단점

  • 객체가 늘어날때마다 하위 클래스 재정의를 해야해서 만들어야할 클래스 개수가 늘어날 수 있다!
  • 객체의 자료형이 하위 클래스에 의해서 결정 -> 확장 용이

코드 -> shape 인터페이스의 구체적 객체를 공장에서 만들기!

Shpae 인터페이스

public interface Shape { void draw(); }

Shape 인터페이스의 구체적 클래스1 -> Circle

public class Circle implements Shape{
	@Override
    public void draw(){ System.out.println("Circle - draw() Method.");} 
}

Shape 인터페이스의 구체적 클래스2 -> Rectangle

public class Rectangle implements Shape{
	@Override
    public void draw(){ System.out.println("Rectangle - draw() Method.");} 
}

객체를 생성해주는 팩토리 클래스 -> ShapeFactory

public class ShapeFactory {
	public Shape getShape(String shapeType){
    	if(shapeType ==null) { return null;}
        if(shapeType.equalsIgnoreCase("CIRCLE") {
        	return new Circle();
        }
        if(shapeType.equalsIgnoreCase("RECTANGLE") {
        	return new Rectangle();
        }
    }
}

Factory패턴 테스트!

public class FactoryPatternTest {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        Shape shape1 = shapeFactory.getShape("CIRCLE");

        shape1.draw();
    }
}

위에서 알아봤으니까 이제 스태틱 팩토리 메소드란?

클래스의 인스턴스를 반환하는 정적메소드!!
즉 이 valueOf 메소드를 호출하면 클래스의 인스턴스를 반환해 준다!

public static Boolean valeOf(boolean b) {
	return b ? Boolean.TRUE : Boolean.FALSE;
}

굳이 이방법을 사용해야하는 이유는? 그리고 장단점

new로 객체를 생성하는 방법은 두가지 문제가 있다

  1. 누구나 객체를 만들어버리기 때문에 보안의 위험
  2. 매번 객체를 새로 생성해주기 때문에 메모리 낭비가 있을 수 있다

그렇기에 함부로 객체를 생성하지 못하게 막으면서 싱글톤으로 유지 할 수 있는 스태틱 팩토리 메소드 방법을 고려해라!!

장점

이름을 가질 수 있다

  • 결국 함수로 호출해야하기 때문에 함수 이름을 잘 정의 해주면 우리가 이 클래스의 내부를 이해하기 편하다!

호출할 때 마다 인스턴스 생성 안함!

  • 미리 만들어놓은 인스턴스를 주로 반환해주기 때문에 싱글톤 유지 됨!

정적 팩토리 메소드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다!

  • 클라이언트에게 필요하지 않을때는 기본 구현체를, 요구사항이 있을때는 특정 구현체를 반환 할 수 있다!

단점

정적 팩토리 메서드는 프로그래머가 찾기 어렵다!!! => 몇가지 지정한 이름들로 만들자!!

  • valuePf, from 등의 함수 이름으로 모두가 약속한 방식으로 메소드 이름정의하기!!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글