Clean Code 작성은 소프트웨어 개발에서 핵심적인 부분입니다. 읽기 쉽고 유지보수 가능한 코드는 프로젝트의 성공과 직결되는 중요한 요소입니다. Clean Code를 작성하기 위해서는 몇 가지 핵심 원칙을 따라야 합니다. 아래는 Clean Code를 위한 10가지 원칙입니다.
- 읽기 쉬운 코드 작성하기: 코드는 사람이 읽기 쉬워야 합니다. 명확하고 간결한 표현과 일관된 네이밍을 사용해야 합니다.
- 한 가지 책임 원칙(Single Responsibility Principle, SRP): 클래스나 함수는 하나의 기능만 수행하도록 작성되어야 합니다. 이렇게 하면 코드가 모듈화되고 유지보수하기 쉬워집니다.
- 개방-폐쇄 원칙(Open-Closed Principle, OCP): 확장에는 열려 있고 변경에는 닫혀 있어야 합니다. 코드 수정 없이 새로운 기능을 추가할 수 있는 설계를 지향해야 합니다.
- 리스코프 치환 원칙(Liskov Substitution Principle, LSP): 하위 클래스는 상위 클래스의 역할을 완전히 대체할 수 있어야 합니다. 이를 위해 인터페이스를 활용하고 다형성을 지원해야 합니다.
- 의존 역전 원칙(Dependency Inversion Principle, DIP): 고수준 모듈은 저수준 모듈에 의존해서는 안 됩니다. 모듈 간의 의존성을 인터페이스와 추상화를 통해 관리해야 합니다.
- 인터페이스 분리 원칙(Interface Segregation Principle, ISP): 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 합니다. 인터페이스는 작고 응집력 있는 형태로 분리되어야 합니다.
- 법칙 최소화 원칙(Law of Demeter, LoD): 객체는 자신이 의존하는 객체와의 상호작용을 최소화해야 합니다. 객체 간의 결합도를 낮추고 유연성과 재사용성을 높여야 합니다.
- 단일 책임 원칙(Single Responsibility Principle, SRP): 함수나 메서드는 하나의 기능만 수행해야 합니다. 이를 통해 코드를 이해하기 쉽고 재사용 가능하게 만들 수 있습니다.
- 네이밍 일관성 유지하기: 변수, 함수, 클래스 등의 이름은 일관성 있게 작성해야 합니다. 의미 있는 이름을 선택하고 코드베이스 전체에서 일관되게 사용해야 합니다.
주석은 필요한 경우에만 사용하기: 코드 자체가 읽기 쉽고 이해하기 쉬워야 하며, 주석은 그 의도나 복잡성을 설명하는 용도로 사용되어야 합니다. 너무 많은 주석은 코드를 지저분하게 만들 수 있습니다.
이러한 원칙을 따르면 Clean Code를 작성하는 데 도움이 됩니다. Clean Code는 유지보수성이 뛰어나며, 버그를 찾고 수정하는 시간을 줄여줄 뿐만 아니라 개발 팀 간의 협업을 원활하게 만듭니다. Clean Code를 작성하는 습관을 기르면 소프트웨어 개발 프로젝트의 품질과 생산성을 향상시킬 수 있습니다.
* 읽기 쉬운 코드 작성하기 란
읽기 쉬운 코드를 작성하는 것은 소프트웨어 개발에서 매우 중요한 요소입니다. 읽기 쉬운 코드는 코드의 이해도를 향상시키고 유지보수성을 높이며, 팀 내의 협업과 코드 리뷰 과정을 원활하게 만듭니다. 다음은 읽기 쉬운 코드를 작성하기 위한 몇 가지 가이드라인입니다:
- 명확한 네이밍: 변수, 함수, 클래스 등의 이름을 명확하고 의미 있는 단어로 선택해야 합니다. 자세하고 직관적인 네이밍을 사용하여 코드의 의도를 명확히 전달해야 합니다.
- 주석 활용: 주석을 사용하여 코드의 의도나 복잡성을 설명하는 것이 좋습니다. 코드만으로는 전달하기 어려운 정보나 알고리즘의 설명 등을 주석으로 추가하여 코드를 이해하기 쉽게 만들어야 합니다.
- 적절한 들여쓰기: 코드 블록을 들여쓰기하여 구조를 명확하게 표현해야 합니다. 일관된 들여쓰기 스타일을 사용하고 코드의 계층 구조를 시각적으로 나타내어 코드를 이해하기 쉽게 만듭니다.
- 함수와 메서드의 크기 제한: 함수나 메서드의 크기를 작고 간결하게 유지해야 합니다. 한 함수가 너무 길면 코드의 이해도가 낮아지고 디버깅이 어려워질 수 있습니다. 필요한 경우 함수를 적절히 분리하고 의미 있는 이름으로 작성해야 합니다.
- 일관된 코드 스타일: 일관된 코드 스타일을 유지해야 합니다. 들여쓰기, 괄호의 위치, 공백 등을 일관되게 사용하여 코드의 일관성을 유지하고 혼동을 방지합니다. 코드 스타일 가이드를 따르는 것이 좋습니다.
- 단순하고 직관적인 로직: 코드의 로직은 단순하고 직관적이어야 합니다. 복잡한 조건문이나 중첩된 루프를 피하고, 코드를 간결하고 이해하기 쉽게 작성해야 합니다. 복잡성을 줄이기 위해 리팩토링을 수행해야 할 수도 있습니다.
- 주요 기능 분리: 코드를 주요 기능과 보조 기능으로 분리하여 읽기 쉽게 만듭니다. 주요 기능은 핵심 로직을 담당하고, 보조 기능은 코드의 가독성과 재사용성을 높이기 위한 보조 기능을 담당합니다.
- 테스트 가능한 코드 작성: 테스트 가능한 코드는 읽기 쉽고 유지보수하기 쉬운 코드입니다. 테스트 용이성을 고려하여 코드를 작성하고, 단위 테스트를 작성하여 코드의 동작을 검증할 수 있어야 합니다.
읽기 쉬운 코드 작성은 개발자의 역량과 코드의 품질에 직접적인 영향을 미치는 요소입니다. 코드를 작성할 때 이러한 가이드라인을 고려하면, 유지보수 가능하고 협업이 원활한 코드를 작성할 수 있습니다.
* 한 가지 책임 원칙 이란
한 가지 책임 원칙(Single Responsibility Principle, SRP)은 객체 지향 프로그래밍의 설계 원칙 중 하나입니다. 이 원칙은 클래스나 모듈은 단 하나의 책임만을 가져야 한다는 것을 강조합니다. 즉, 클래스나 모듈은 한 가지 목적 또는 기능에 집중해야 합니다.
한 가지 책임 원칙은 다음과 같이 정의됩니다:
“한 클래스는 변경할 이유가 단 하나여야 한다.”
이 원칙을 따르면 클래스는 하나의 책임만을 갖도록 설계되어야 합니다. 클래스가 여러 책임을 가지게 되면 해당 클래스의 변경 사유가 다양해지며, 코드의 복잡성과 의존성이 증가하여 유지보수가 어려워질 수 있습니다.
한 가지 책임 원칙을 준수하기 위해서는 다음과 같은 가이드라인을 따라야 합니다:
- 단일 기능 구현: 클래스나 모듈은 하나의 기능을 수행하도록 설계해야 합니다. 여러 기능을 처리해야 하는 경우, 각각의 기능을 별도의 클래스로 분리하여 단일 책임을 유지해야 합니다.
- 응집성 유지: 클래스나 모듈 내부의 메서드와 속성은 동일한 목적과 관련성을 가지도록 설계되어야 합니다. 응집성을 유지함으로써 코드의 가독성과 이해도를 높일 수 있습니다.
- 변경의 이유를 고려: 클래스를 변경해야 하는 이유를 고려하여 단일 책임을 유지해야 합니다. 만약 클래스의 변경 이유가 다양하다면, 해당 클래스를 여러 개의 작은 클래스로 분리하는 것이 좋습니다.
- 인터페이스와 추상화 활용: 인터페이스와 추상화를 사용하여 클래스 간의 결합도를 낮추고, 단일 책임을 구현한 클래스들을 통일된 인터페이스로 조합할 수 있습니다.
한 가지 책임 원칙을 준수하면 코드의 가독성과 유지보수성이 향상됩니다. 클래스가 한 가지 목적에 집중되어 있으므로 코드의 이해도가 높아지고, 변경 사항이 발생했을 때 해당 클래스만 수정하면 되므로 다른 부분에 영향을 미치는 범위가 최소화됩니다. 이는 코드의 재사용성과 모듈화를 높이고, 시스템의 확장성과 유연성을 개선할 수 있습니다.
* 개방-폐쇄 원칙 이란
개방-폐쇄 원칙(Open-Closed Principle, OCP)은 객체 지향 프로그래밍의 설계 원칙 중 하나입니다. 이 원칙은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다는 것을 강조합니다. 즉, 기존의 코드를 변경하지 않고도 기능을 확장할 수 있는 설계를 가져야 한다는 것을 의미합니다.
개방-폐쇄 원칙은 다음과 같이 정의됩니다:
“소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하며, 변경에는 닫혀 있어야 한다.”
이 원칙은 코드를 수정하지 않고도 새로운 기능을 추가할 수 있는 설계를 지향합니다. 기존의 코드를 변경하면 기능 추가나 수정이 필요한 다른 부분에도 영향을 미칠 수 있으므로, 코드의 변경을 최소화하여 시스템의 안정성을 유지하는 것이 목표입니다.
개방-폐쇄 원칙을 준수하기 위해서는 다음과 같은 구체적인 방법을 고려해야 합니다:
- 추상화와 다형성 활용: 기능을 확장하거나 변경할 때 추상화와 다형성을 사용하여 인터페이스를 정의하고 상속 또는 구현을 통해 새로운 기능을 추가합니다.
- 확장 포인트 식별: 코드를 설계할 때 확장이 필요한 부분을 식별하고, 이를 유연하게 대응할 수 있는 확장 포인트를 정의합니다. 이후 새로운 기능이 필요한 경우 해당 확장 포인트를 활용하여 기능을 추가합니다.
- 상속보다는 조합 사용: 새로운 기능을 추가할 때는 상속보다는 객체 조합(composition)을 활용하는 것이 더 좋습니다. 객체 간의 관계를 조합하여 필요한 기능을 확장하고 변경할 수 있습니다.
- 인터페이스 분리 원칙 적용: 인터페이스를 작게 분리하여 클라이언트가 필요로 하는 기능만 사용할 수 있도록 설계합니다. 이를 통해 기능 추가나 수정에 대한 영향을 최소화할 수 있습니다.
개방-폐쇄 원칙을 준수하면 코드의 유지보수성과 확장성을 향상시킬 수 있습니다. 기존의 코드를 수정하지 않고도 새로운 기능을 추가할 수 있으므로 코드의 재사용성과 유연성이 증가하며, 시스템의 안정성과 확장성을 보장할 수 있습니다.
* 리스코프 치환 원칙이란
리스코프 치환 원칙(Liskov Substitution Principle, LSP)은 객체 지향 프로그래밍의 설계 원칙 중 하나입니다. 이 원칙은 하위 타입(subtype)이 상위 타입(supertype)의 역할을 완전히 대체할 수 있어야 한다는 것을 강조합니다.
리스코프 치환 원칙은 프로그램에서 다형성을 올바르게 활용하기 위해 중요한 개념입니다. 다형성은 동일한 인터페이스를 공유하는 객체들이 서로 다른 방식으로 동작할 수 있는 능력을 말합니다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다.
리스코프 치환 원칙은 다음과 같이 정의됩니다:
“서브타입은 언제나 슈퍼타입으로 대체될 수 있어야 한다. 이는 프로그램의 의미를 변경하지 않고 기능을 확장하거나 수정할 수 있음을 의미한다.”
리스코프 치환 원칙을 지키기 위해서는 다음 사항을 고려해야 합니다:
- 메서드 시그니처: 하위 타입에서 재정의한 메서드는 상위 타입의 메서드와 동일한 시그니처(매개변수, 반환 타입)를 가져야 합니다.
- 사전 조건과 사후 조건: 하위 타입에서 재정의한 메서드는 상위 타입의 사전 조건(precondition)을 약화시킬 수 있고, 사후 조건(postcondition)을 강화시킬 수 있습니다.
- 예외 처리: 하위 타입에서 재정의한 메서드에서는 상위 타입의 예외를 던지지 않거나, 보다 구체적인 예외를 던질 수 있습니다.
리스코프 치환 원칙을 준수하면 코드의 유연성과 확장성을 높일 수 있습니다. 상위 타입을 사용하는 코드는 하위 타입을 알 필요가 없으므로, 다형성을 통해 코드의 재사용성과 가독성을 개선할 수 있습니다.
* 의존 역전 원칙 이란
의존 역전 원칙(Dependency Inversion Principle, DIP)은 객체 지향 프로그래밍의 설계 원칙 중 하나입니다. 이 원칙은 고수준 모듈이 저수준 모듈에 의존해서는 안 되며, 모듈 간의 의존성은 추상화된 인터페이스에 의존해야 한다는 것을 강조합니다.
의존 역전 원칙은 다음과 같이 정의됩니다:
- 상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다.
- 추상화는 구체적인 사항에 의존해서는 안 된다. 구체적인 사항은 추상화에 의존해야 한다.
이 원칙을 지키면 상위 수준의 모듈은 하위 수준 모듈의 변경에 영향을 받지 않으면서도 확장 가능하고 유연한 설계를 구현할 수 있습니다. 추상화를 통해 모듈 간의 결합도를 낮추고 의존성을 관리할 수 있게 됩니다.
간단히 말하면, 상위 타입을 사용하는 코드에서 하위 타입의 객체를 사용해도 아무런 문제가 발생하지 않아야 한다는 원칙입니다. 즉, 하위 타입은 상위 타입으로 간주되어야 하며, 상속 관계에서도 일관된 동작을 보장해야 합니다.
의존 역전 원칙은 다음과 같은 장점을 제공합니다:
- 유연성과 확장성: 의존 역전을 통해 인터페이스를 사용하고 의존성 주입(Dependency Injection)을 활용하여 코드를 유연하게 확장할 수 있습니다.
- 모듈의 재사용성: 의존 역전을 통해 모듈 간의 결합도를 낮추고 모듈을 독립적으로 재사용할 수 있습니다.
- 테스트 용이성: 의존 역전을 통해 의존성 주입을 활용하면 모듈을 테스트하기 쉬워집니다. 모의 객체(Mocking)를 사용하여 의존성을 대체할 수 있습니다.
- 개발자 간 협업의 용이성: 인터페이스를 통해 정의된 추상화를 기반으로 개발자들이 협업할 수 있습니다.
의존 역전 원칙을 지키기 위해서는 다음과 같은 구체적인 방법을 고려해야 합니다:
- 인터페이스와 추상 클래스를 활용한 추상화 정의
- 의존성 주입(Dependency Injection) 패턴의 적용
- 의존성 역전 컨테이너(Dependency Inversion Container) 사용
의존 역전 원칙은 느슨한 결합(Loose Coupling)과 관련된 원칙이며, 객체 지향 소프트웨어 개발에서 유지보수 가능하고 확장 가능한 시스템을 구축하는 데 중요한 역할을 합니다.
* 인터페이스 분리 원칙이란
인터페이스 분리 원칙(Interface Segregation Principle, ISP)은 객체 지향 프로그래밍의 설계 원칙 중 하나입니다. 이 원칙은 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 한다는 것을 강조합니다. 즉, 클라이언트는 자신이 필요로 하는 기능에만 의존해야 합니다.
인터페이스 분리 원칙은 다음과 같이 정의됩니다:
“클라이언트는 자신이 사용하지 않는 메서드에 의존하도록 강요받지 않아야 한다.”
이 원칙은 인터페이스의 불필요한 종속성을 제거하고, 인터페이스를 작고 응집력 있는 형태로 분리함으로써 결합도를 낮추고 코드의 유지보수성을 높이는 것을 목표로 합니다.
* 법칙 최소화 원칙
법칙 최소화 원칙(Law of Demeter, LoD), 또는 최소 지식 원칙(Principle of Least Knowledge)은 객체 지향 프로그래밍의 설계 원칙 중 하나입니다. 이 원칙은 객체 간의 결합도를 낮추기 위해 객체는 자신이 의존하는 다른 객체와의 상호작용을 최소화해야 한다는 것을 강조합니다.
법칙 최소화 원칙은 다음과 같이 정의됩니다:
“오직 객체에게 필요한 정보만 전달해야 한다. 객체는 자신이 의존하는 다른 객체의 내부 구조에 대해 알지 않아야 한다.”
이 원칙은 객체가 다른 객체와의 상호작용을 최소한으로 제한함으로써 결합도를 낮추고 코드를 유연하게 만듭니다. 객체는 자신이 사용하는 기능이 제공되는 인터페이스에만 의존해야 하며, 다른 객체의 내부 동작에 대한 세부 사항을 알 필요가 없습니다.
법칙 최소화 원칙을 준수하기 위해서는 다음과 같은 가이드라인을 따라야 합니다:
- 메시지 전달: 객체는 자신이 의존하는 다른 객체와 상호작용할 때 필요한 메시지를 전달하고, 해당 객체에게 필요한 정보만 요청해야 합니다. 객체는 다른 객체의 내부에 접근하여 정보를 가져오거나 변경해서는 안 됩니다.
- 체인 호출 최소화: 객체가 다른 객체에게 메시지를 전달할 때, 중간에 있는 객체를 건너뛰고 최종 목적지에 직접 메시지를 전달하는 것이 좋습니다. 즉, 객체가 자신이 의존하는 다른 객체를 통해 체인 호출을 최소화해야 합니다.
- 중개자 객체 제한: 객체가 다른 객체의 중개자 역할을 수행하지 않도록 해야 합니다. 객체는 자신이 직접 상호작용해야 하는 객체와만 통신해야 하며, 중개자 역할을 하는 객체를 피해야 합니다.
- 추상화와 인터페이스 사용: 객체 간의 결합도를 낮추기 위해 추상화와 인터페이스를 사용하여 의존성을 관리하는 것이 좋습니다. 객체는 인터페이스를 통해 다른 객체와 통신해야 합니다.
법칙 최소화 원칙을 준수하면 객체의 의존성을 최소화하고 코드를 유연하게 만들 수 있습니다. 객체 간의 결합도가 낮아지면 코드의 재사용성과 유지보수성이 향상되며, 시스템의 확장성과 유연성을 높일 수 있습니다.
* 단일 책임 원칙이란
단일 책임 원칙(Single Responsibility Principle, SRP)은 객체 지향 프로그래밍의 설계 원칙 중 하나입니다. 이 원칙은 클래스나 함수는 하나의 기능 또는 책임만 가져야 한다는 것을 강조합니다. 즉, 한 요소는 하나의 변경 이유를 가져야 합니다.
단일 책임 원칙은 다음과 같이 정의됩니다:
“하나의 클래스는 변경 이유가 하나여야 한다.”
이 원칙을 따르면 클래스나 함수는 한 가지 일을 수행하고, 이를 위한 변경 요인은 오직 하나여야 합니다. 이렇게 하면 코드의 응집성(cohesion)이 높아지고, 클래스나 함수의 역할을 이해하기 쉬워집니다.
단일 책임 원칙을 준수하기 위해서는 다음과 같은 지침을 따라야 합니다:
- 클래스 또는 함수의 역할 분리: 클래스나 함수가 여러 가지 역할을 수행하고 있다면, 각 역할을 분리하여 독립적인 클래스나 함수로 구성해야 합니다.
- 응집성 유지: 클래스나 함수의 기능은 관련성이 있고 함께 동작하는 요소들로 구성되어야 합니다. 한 클래스나 함수에서는 비슷한 종류의 동작과 데이터만 처리하는 것이 좋습니다.
- 변경에 대한 영향 최소화: 단일 책임 원칙을 따르면 변경이 필요한 경우 해당 클래스나 함수만 수정하면 되므로, 다른 기능에 영향을 미치지 않습니다.
- 추상화와 인터페이스 사용: 복잡한 기능을 단일 책임으로 분리하려면 추상화와 인터페이스를 사용하여 관련성 있는 기능을 분리할 수 있습니다.
단일 책임 원칙을 준수하면 코드의 가독성과 유지보수성을 향상시킬 수 있습니다. 코드의 기능이 명확하고 한 가지 목적에 집중된다면 이해하기 쉽고 변경에 유연하게 대응할 수 있습니다. 또한, 단일 책임 원칙은 코드 재사용성을 높이고 모듈화된 코드를 만들어 전체 시스템의 품질을 향상시킬 수 있습니다.
* 네이밍 일관성
네이밍 일관성은 코드 작성에서 매우 중요한 요소입니다. 일관된 네이밍 규칙을 사용하면 코드의 가독성과 이해도를 향상시키고, 개발자들 간의 협업을 원활하게 만들 수 있습니다. 다음은 네이밍 일관성을 유지하기 위한 몇 가지 지침입니다:
- 의미 있는 이름 선택: 변수, 함수, 클래스 등의 이름은 해당 역할이나 의미를 명확하게 전달해야 합니다. 짧고 간결하지만 의미 있는 이름을 선택하는 것이 좋습니다.
- 일관된 케이스 스타일 사용: 변수나 함수의 이름을 작성할 때는 케이스 스타일을 일관되게 사용해야 합니다. 예를 들어, 카멜 케이스(camelCase)나 스네이크 케이스(snake_case) 등을 선택하고, 코드베이스 전체에서 일관성 있게 사용해야 합니다.
- 표준 규칙 및 컨벤션 따르기: 특정 언어나 프레임워크의 네이밍 규칙과 컨벤션을 따르는 것이 좋습니다. 각 언어나 프레임워크에는 네이밍 관련 권장 사항이나 스타일 가이드가 제공됩니다.
- 문맥을 고려한 네이밍: 변수나 함수의 이름은 해당 문맥에서 의미가 명확하게 전달되도록 해야 합니다. 가독성을 높이기 위해 변수가 사용되는 위치와 해당 변수의 용도를 고려하여 이름을 지정해야 합니다.
- 일관성 있는 약어 사용: 약어를 사용할 때는 일관성을 유지해야 합니다. 모든 개발자들이 동일한 약어를 사용하고 이해할 수 있도록, 약어 목록을 정의하거나 팀 내에서 합의할 수 있습니다.
- 주석과 문서화 활용: 코드에 주석을 추가하여 이름의 의도와 용도를 설명하는 것이 좋습니다. 또한, 프로젝트에 문서화 가이드를 작성하여 네이밍 규칙과 예시를 공유하는 것도 유용합니다.
- 리팩토링과 리뷰 과정에서 확인: 코드 리팩토링과 코드 리뷰 과정에서 네이밍 일관성을 확인하고 개선할 수 있습니다. 다른 개발자들과 코드 리뷰를 진행하면서 네이밍에 대한 의견을 교환하고 피드백을 받을 수 있습니다.
네이밍 일관성은 코드의 가독성과 유지보수성을 향상시키는 데 중요한 역할을 합니다. 개발자들 간의 협업과 코드의 이해도를 높이기 위해 일관성 있는 네이밍 규칙을 적용하는 것이 좋습니다.
* 주석은 필요한 경우에만 사용하기
주석은 코드에 필요한 경우에만 사용해야 합니다. 주석은 코드의 의도나 설명을 추가하거나, 특정 부분의 동작을 설명하는 등의 목적으로 사용됩니다. 다음은 주석을 사용할 때 고려해야 할 가이드라인입니다:
- 코드 자체로 의도를 명확히 전달할 수 있는지 고려해야 합니다. 주석을 사용하기 전에 코드 자체를 명확하게 작성하고 구조화하여 읽기 쉽게 만드는 것이 좋습니다.
- 주석은 코드의 동작이나 알고리즘을 설명하는 데 사용될 수 있습니다. 코드의 복잡성이나 의미를 이해하기 어려운 경우에는 주석을 활용하여 설명하는 것이 도움이 됩니다.
- 코드의 변경과 주석의 일치를 유지해야 합니다. 주석은 코드와 함께 업데이트되어야 하며, 코드의 변경에 맞춰 주석도 적절하게 수정되어야 합니다. 주석과 코드의 불일치는 혼란을 야기할 수 있습니다.
- 주석은 중요한 정보를 전달하는 데 사용되어야 합니다. 코드의 특정 부분이 왜 그렇게 작성되었는지, 왜 특정 방식으로 동작하는지 등의 핵심적인 정보를 주석으로 추가하는 것이 좋습니다.
- 주석은 코드의 가독성을 향상시킬 수 있지만, 과도한 주석은 코드를 혼란스럽게 만들 수 있습니다. 적절한 주석의 사용을 유지하고, 주석으로 인해 코드의 가독성이 저하되지 않도록 해야 합니다.
- 코드 자체가 명확하고 의도가 분명하게 작성되면서도 이해하기 어려운 부분이 있다면, 주석을 사용하여 해당 부분을 설명할 수 있습니다.
주석은 코드를 이해하고 유지보수하는 데 도움을 주지만, 과도하게 사용하면 코드의 가독성을 저하시킬 수 있습니다. 따라서 주석을 사용할 때는 필요한 경우에만 사용하고, 코드 자체를 명확하게 작성하고 구조화하여 읽기 쉽게 만드는 것이 중요합니다.
def calculate_total_price(items): total = 0 for item in items: price = item.get_price() # 주석: 각 항목의 가격을 가져옴 quantity = item.get_quantity() # 주석: 각 항목의 수량을 가져옴 subtotal = price * quantity # 주석: 각 항목의 가격과 수량을 곱하여 소계를 계산함 total += subtotal return total
위의 예시에서 주석은 다음과 같은 상황에서 사용되었습니다:
- item.get_price() 코드: 해당 주석은 item 객체에서 가격을 가져온다는 의미를 설명합니다. 코드 자체로는 가격을 가져오는 메서드를 호출하지만, 주석을 통해 해당 동작을 설명함으로써 의도를 명확히 전달합니다.
- item.get_quantity() 코드: 주석은 item 객체에서 수량을 가져온다는 의미를 설명합니다. 코드가 가격과 마찬가지로 수량을 가져오는 메서드를 호출하지만, 주석을 통해 해당 동작을 설명하여 의미를 명확히 전달합니다.
- subtotal = price * quantity 코드: 주석은 각 항목의 가격과 수량을 곱하여 소계를 계산한다는 의미를 설명합니다. 코드 자체로는 계산 과정을 표현하지만, 주석을 통해 계산하는 목적을 설명하여 이해를 돕습니다.
위의 예시 코드에서는 주석을 사용하여 중요한 정보를 전달하고, 코드의 의도와 동작을 설명합니다. 이렇게 필요한 경우에만 주석을 사용하면 코드를 이해하고 유지보수하는 데 도움이 되며, 코드의 가독성을 향상시킬 수 있습니다.