목표
JAVA의 클린 코드와 리팩토링에 대해 이해하고 실제 코드를 리팩토링 해보는 실습을 진행하여 실제로 코드를 개선하고 향상시키는 경험을 쌓습니다.
내용정리
__________ EX01 {
public abstract void method1();
public abstract void method2();
}
❓빈칸에는 어떤 게 들어가야 할까?
- abstract class 하면 에러 사라진다! : 1개이상 abstract 면 abstract 해주기로 약속
- interface 해도 에러 사라진다!
- 추상 클래스(Abstract Class):
- 공통된 특성을 가진 클래스들의 부모 클래스로 사용됩니다.
- 상속을 통해 확장될 것으로 예상되는 메서드나 필드를 제공합니다.
- 일부 메서드의 구현을 제공할 수 있습니다.
- 상속을 통해 재사용성을 촉진합니다.
- 인터페이스(Interface):
- 클래스 간의 계약(Contract)을 정의합니다.
- 클래스가 어떤 메서드를 반드시 구현해야 하는지 명시합니다.
- 다중 상속을 흉내내기 위한 수단으로 사용됩니다. 클래스가 여러 개의 인터페이스를 구현할 수 있습니다.
- 구현된 메서드가 없고, 모든 메서드가 추상 메서드입니다
❓추상 클래스와 인터페이스 역할이 교환될 수 있을까?
서로 다른 목적을 가지고 있기 때문에 그 목적을 서로 교환할 수는 없지만, 조합하여 자바의 다형성을 적극 활용할 수는 있습니다!
인터페이스와 추상 클래스는 자바에서 다형성을 구현하는 데 있어 각각의 장점과 사용 시점이 있습니다. 인터페이스는 다중 구현과 느슨한 결합을, 추상 클래스는 코드 재사용과 일관된 구현을 제공합니다.
회사에서는 추상클래스를 쓰기보다 인터페이스만 쓰는 회사가 많을 것입니다.
구현하는 입장에서 인터페이스가 더 자유도가 높기 때문이죠
* 객체 지향은 절차적 프로그래밍을 완전히 무시하는 것이 아니라, 데이터와 기능을 적절하게 조직화하여 보다 효율적으로 문제를 해결하는 방법을 제시합니다.
클린코드와 리팩토링
1
return exponent >= 0 ? mantissa * exponent : mantissa / -exponent;
2
if ( exponent > 0) {
return mantissa * exponent;
else {
return mantissa / -exponent;
}
❓두 코드 중에 클린 코드는?
후자가 클린코드로 판단됩니다.
true, false 에 따라 변수가 바뀌는 간단한 로직은 삼항연산자도 OK, 되려 if문으로 쓰면 굳이 풀어쓴 느낌이 듭니다.
그러나, 대부분 연산문이 들어가고, 이 때는 2번이 클린 코드라고 할 수 있습니다.
“코드를 읽으며 짐작했던 기능을 각 루틴이 그대로 수행한다면 클린 코드로 불러도 되겠다. 코드가 그 문제를 풀기 위한 언어처럼 보인다면 아름다운 코드라 불러도 되겠다”
- Ward Cunningham -
객체 지향, 클린 코드 참 쉽죠
- Robert C. Martin -
* object consultant, 익스트림 프로그래밍 분야에서 전 세계를 이끄는 경험이 풍부한 컨설턴트
좋은 이름을 지으려면 시간이 걸리지만, 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
- Joshua Bloch의 Effectvie Java 中 -
클린코드를 위해 주의해야 할 점
- List라는 이름은 변수명에 들어가면 안 됩니다
-> "List"는 자바의 표준 라이브러리(java.util 패키지)에 있는 인터페이스인 "List"를 나타냅니다. 따라서, 변수명으로 "List"를 사용하면 표준 라이브러리의 클래스명과 충돌할 수 있습니다. 이는 코드의 가독성을 해치고 예기치 않은 동작을 초래할 수 있습니다. - 메소드가 이미 클래스의 필드에 접근할 권한을 가지고 있다면, 매개변수를 추가로 사용하여 필드를 전달하는 것은 불필요할 수 있습니다.
- 주석은 나쁜 코드를 보완하지 못하니 코드 개선이 우선적입니다.
- 변수명과 메소드명은 다른 사람이 읽어도 바로 이해할 수 있게!
1. 조건문/ 메소드명은 긍정
2.메소드로 가능한 한 추출
3.메소드 이름은 무조건 동사가 제일 앞!
4.자바 상수는 대문자+스네이크 표기
지역변수는 메소드 내부에서만 사용되는 임시적인 데이터를 저장하기 위한 용도로 사용되며, 객체지향적인 설계를 고려할 때에는 객체의 상태를 캡슐화하여 외부에서 직접적인 접근을 피하는 것이 좋습니다.
회고
리팩토링을 해 보는 실습을 진행하면서 기존에는 기능에만 집중했다면, 코드의 유지보수에도 집중하는 개발자가 되는 것의 중요성을 느꼈습니다. 지속적인 학습과 연습을 통해 코드를 개선하는 노력을 계속하고, 다양한 프로젝트에서 이러한 원칙을 적용해보며 경험을 쌓아야 함을 다짐하게 되었습니다
'BackEnd' 카테고리의 다른 글
클라우드 기반 백엔드 기초: 애자일과 설계 (0) | 2024.04.15 |
---|---|
클라우드 기반 백엔드 기초 : 내가 생각하는 객체 지향이란? (2) | 2024.04.11 |
클라우드 기반 백엔드 기초 : 추상클래스와 인터페이스, 자바 컬렉션 API (0) | 2024.04.08 |
클라우드 기반 백엔드 기초 : 페어프로그래밍 (0) | 2024.04.05 |
클라우드 기반 백엔드 기초 : JAVA (2) (0) | 2024.04.04 |