티스토리 뷰

반응형

목차

    배경

    코드리뷰 중에 다음과 같은 의견을 들은 적이 있다. '로직이 들어가는 메소드가 toString() 보다 상단으로 올라가면 더 좋을 것 같아요', '보통 static 변수를 먼저 선언하는 것 같아요 😅'

    사실 평소에는 습관적으로 클래스 -> 변수 -> 생성자 -> 메서드 순으로 메서드와 필드를 선언하고 있었고, 다른 코드를 참고하더라도 비슷한 형태로 선언하고 있어서 이를 당연하게 여겼었다. 하지만 코드리뷰 중에 위와 같은 의견들을 듣기 시작하면서 어떤 순서로 선언하는 게 좋을지 궁금증이 생겨 관련 문서와 글들을 찾아보았고, 이러한 컨벤션을 준수하는 것만으로도 서로 이해하기 쉬운 코드를 작성하는데 큰 도움이 될 것 같아 블로그에도 기록해 두었다.

     

    java 메서드 및 필드 선언 순서 컨벤션

    이러한 컨벤션의 목적은 결국 가독성을 높이고 상호간 이해하기 쉬운 코드를 작성하는 데에 있다. 한 클래스 내에서 메서드와 변수를 선언하다 보면 수많은 메서드와 변수가 섞이고 가독성을 떨어뜨린다. 이런 상황에서 선언 순서에 대한 컨벤션을 준수한다면 서로 이해하기 쉬운 코드를 작성할 수 있을 것이다. (물론 한 클래스가 너무 많은 메서드와 변수를 갖거나 메서드의 로직이 너무 길다면 선언 순서뿐만 아니라 클래스 & 메서드 분리 등 리팩토링 방안도 검토해봐야 할 것이다.)

     

    선언 순서

    가장 먼저 class 명을 선언하고 그 뒤에 static 변수를 선언하다. 이 때 static 변수는 public, protected, private 순서로 선언한다.

    static 변수 다음에 instance 변수를 선언한다. static 변수와 마찬가지로 instance 변수도 public, protected, private 순으로 선언한다. 그 후 객체 생성자(constructor)를 선언한다.

     

    변수와 생성자를 선언하고나서 메서드를 선언하는데, 이때 static 메서드를 가장 먼저 선언하고 그 후 비즈니스 로직을 갖는 instance 메서드를 선언한다. 메서드는 접근 제한자 순으로 선언했던 변수와 달리 기능별로 동일한 기능을 하는 메서드들을 모아 논리적으로 배치한다.

    Methods: These methods should be grouped by functionality rather than by scope or accessibility. For example, a private class method can be in between two public instance methods. The goal is to make reading and understanding the code easier. 
    Source : https://www.oracle.com/java/technologies/javase/codeconventions-fileorganization.htm
    Another idea is to group related methods together - this makes it easier to spot seams where you could split your existing large class into several smaller, more targeted ones.
    Source : https://stackoverflow.com/questions/4668218/are-there-any-java-method-ordering-conventions 

     

    즉, 접근 제한자보다는 접근성과 코드 이해도를 높이기 위해 로직상 비슷한 기능을 하는 메서드들을 모아서 같이 배치하는 것이다. 다시 말해, 비슷한 로직을 하는 메서드 들이라면 public 접근 제한자를 갖는 메서드 사이에 private 접근 제한자를 갖는 메서드가 와도 된다. 이러한 컨벤션의 목적은 어떤 절대적인 기준을 반드시 준수해야 한다가 아닌 서로 이해하기 쉬운 코드를 작성하는데에 있다는 점을 기억하자.

     

    비즈니스 로직을 갖는 instance 메서드를 배치하고 나서 standard 메서드를 배치한다. standard 메서드는 대표적으로 java에서 모든 객체들의 최상위 객체인 Object에서 제공하는 메서드가 있고 toString(), equals(), hashCode() 등이 있다. getter/setter는 클래스 최하단에 작성한다.

     

     

    간략하게 정리한 선언 순서이다.

     

    1. class 명
    2. static 변수 (public, protected, private 순으로 선언한다.)
    3. instance 변수 (public, protected, private 순으로 선언한다.)
    4. 생성자(constructor)
    5. static 메서드
    6. (비즈니스 로직을 갖는) instance 메서드
    7. standard 메서드
    8. getter, setter 메서드

    참고

    반응형
    Comments