포스트

[클린 코드 & 가독성 향상 기법] 🤓 of 형태의 생성자? 언제, 왜 사용하는 걸까?

개발을 하다 보면 new 키워드 말고도 List.of(), Optional.of(), Integer.valueOf() 같은 익숙한 메서드들을 보신 적 있을 거예요. 뭔가 객체를 생성하는 것 같은데, 왜 굳이 of 같은 형태로 만들어서 사용하는 걸까요? 오늘은 of 형태의 생성자가 왜 유용하고, 언제 써야 하는지 함께 알아보겠습니다!


1. 읽기 쉬운 코드가 최고!!(가독성 UP)

코드에서 가장 중요한 것 중 하나는 가독성입니다. 다른 사람이 내 코드를 읽거나, 미래의 내가 코드를 다시 볼때 어려운 경우가 많습니다. 그중에서 of의 형태가 이러한 가독성을 높여줍니다.

예를 들어볼까요?

1
2
3
4
5
// 기존 방식 Point p1 = new Point(10, 20); // 10과 20이 뭘 의미하는지 바로 알기 어렵죠?

// of 형태 활용 
Point p2 = Point.ofCartesian(10, 20); // '직교 좌표로 점을 생성한다'는 의미가 명확하죠! 
Point p3 = Point.ofPolar(5.0, Math.PI / 2); // '극좌표로 점을 생성한다'고 바로 이해할 수 있어요!

이런식으로 of 뒤에 붙는 이름에 따라 “이 객체는 이런방식으로 생성되는구나!” 하고 바로 파악할 수 있습니다. new를 통해 객체를 생성하는 것 보다 객체 생성의 의도를 정확하게 생성 할 수 있습니다.

2. 더욱 유연하고, 객체를 똑똑하게 다루는 법 (유연성 & 재사용)

of 형태의 메서드는 사실 팩토리 메소드 라고 불리는 디자인 패턴의 일종이에요. 이 팩토리 메서드 덕분에 우리는 단순한 new 보다 훨씬 더 유연하고 똑똑하게 객체를 다룰 수 있습니다.

  • 객체 재사용으로 메모리 절약
    • of 메서드 내부에서는 매번 새로운 객체를 만들지 않을 수도 있습니다. 예를 들어, 불변(Immutable) 객체의 경우, 특정 값을 가진 객체가 이미 만들어져 있다면 그걸 다시 반환해서 메모리 사용량을 줄일 수 있습니다.
1
2
3
4
5
6
7
8
	 // Integer.valueOf()는 특정 범위의 숫자에 대해 이미 생성된 객체를 재사용해요.
    Integer a = Integer.valueOf(100);
    Integer b = Integer.valueOf(100);
    System.out.println(a == b); // true (캐싱된 객체를 재사용했기 때문)
    
    Integer c = new Integer(100); // Deprecated
    Integer d = new Integer(100); // Deprecated
    System.out.println(c == d); // false (항상 새로운 객체 생성)

위 코드처럼 Integer.valueOf()-128에서 127 사이의 Integer 객체를 캐싱하여 재사용합니다. 이는 불필요한 객체 생성을 줄여 성능 향상과 메모리 절약에 기여하죠.

3. API의 일관성과 편리함 (API 디자인)

자바의 Stream API, Optional 클래스 등 많은 현대적인 라이브러리나 프레임워크에서 of 형태의 메서드를 자주 사용합니다. 이는 API의 일관성을 높여 사용자가 패턴을 예측하고 쉽게 사용할 수 있도록 돕습니다. “아, 이런 종류의 객체는 of로 만드는구나!” 하고 자연스럽게 학습하게 되는 거죠.

마무리하며

결론적으로 of 형태의 생성자(정적 팩토리 메서드)는 코드의 가독성을 높이고, 객체 생성에 유연성을 더하며, API 디자인의 일관성을 유지하고, 생성자 오버로딩의 한계를 극복하는 등 다양한 장점을 제공합니다. 이제 여러분의 코드에도 of를 적극적으로 활용하여 더욱 멋지고 스마트한 코드를 작성해 보세요!!

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.