7월 29일 - 좋은코드?

Yullgiii·2024년 7월 30일
0

좋은 코드란 무엇인가

‘좋은 코드란 무엇인가?’라는 질문은 많은 개발자들이 고민하는 문제이다. 여러 사람들의 경험과 관점에 따라 좋은 코드의 정의는 다를 수 있지만, 공통적으로 다음과 같은 기준들이 있다.

  • 읽기 쉬운 코드: 다른 개발자들이 이해하기 쉽고, 유지보수하기 쉬운 코드.
  • 중복이 없는 코드: DRY(Don't Repeat Yourself) 원칙을 준수하여 중복을 최소화한 코드.
  • 테스트가 용이한 코드: 유닛 테스트와 통합 테스트가 쉽게 작성될 수 있는 코드.

더 많은 정보는 여기를 참고하자.

Object Oriented Programming (OOP)

객체 지향 프로그래밍(OOP)은 현실 세계의 사물들을 객체로 보고, 이 객체들 간의 상호작용을 통해 프로그래밍을 하는 패러다임이다. 이는 인간 중심적인 프로그래밍 방식으로, 현실 세계의 특징들을 추상화하여 소프트웨어에 적용하는 것이다.

OOP의 장점

  • 재사용성: 이미 작성된 코드를 재사용할 수 있어 개발 효율이 높아진다.
  • 신뢰성: 검증된 코드(라이브러리)를 사용하여 버그 발생을 줄일 수 있다.
  • 생산성: 라이브러리를 사용하여 빠르게 개발할 수 있다.
  • 유지보수성: 객체 단위로 코드가 나누어져 있어 디버깅과 유지보수가 용이하다.
  • 명확한 요구사항 반영: 데이터 모델링 시 객체와 매핑이 수월하여 요구사항을 명확히 반영할 수 있다.

OOP의 단점

  • 성능 오버헤드: 객체 간의 메시지 교환으로 인해 성능 오버헤드가 발생할 수 있다. 그러나 하드웨어의 발전으로 이 문제는 많이 완화되었다.
  • 상태 관리의 어려움: 객체가 상태를 가지기 때문에 예측할 수 없는 상태 변화로 인해 버그가 발생할 수 있다. 이는 함수형 프로그래밍이 주목받게 된 배경이다.

객체 지향적 설계 원칙

  1. SRP (Single Responsibility Principle): 단일 책임 원칙
    • 클래스는 하나의 책임만 가져야 하며, 변경의 이유는 단 하나여야 한다.
  2. OCP (Open-Closed Principle): 개방-폐쇄 원칙
    • 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
  3. LSP (Liskov Substitution Principle): 리스코프 치환 원칙
    • 상위 타입의 객체를 하위 타입의 객체로 치환해도 프로그램은 정상적으로 동작해야 한다.
  4. ISP (Interface Segregation Principle): 인터페이스 분리 원칙
    • 인터페이스는 클라이언트를 기준으로 분리해야 한다.
  5. DIP (Dependency Inversion Principle): 의존 역전 원칙
    • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다.

예제 코드

다음은 OOP의 단일 책임 원칙(SRP)을 준수하여 작성된 예제 코드이다. 이 예제는 사용자 정보를 관리하는 간단한 프로그램이다.

// 사용자 정보 클래스
class User {
    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }
}

// 사용자 데이터 저장소 클래스
class UserRepository {
    private List<User> users = new ArrayList<>();

    public void addUser(User user) {
        users.add(user);
    }

    public List<User> getUsers() {
        return users;
    }
}

// 사용자 서비스 클래스
class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void registerUser(String name, String email) {
        User user = new User(name, email);
        userRepository.addUser(user);
    }

    public List<User> getAllUsers() {
        return userRepository.getUsers();
    }
}

public class Main {
    public static void main(String[] args) {
        UserRepository userRepository = new UserRepository();
        UserService userService = new UserService(userRepository);

        userService.registerUser("John Doe", "john@example.com");
        userService.registerUser("Jane Doe", "jane@example.com");

        for (User user : userService.getAllUsers()) {
            System.out.println(user.getName() + ": " + user.getEmail());
        }
    }
}

이 예제는 SRP 원칙을 잘 따르고 있다. User 클래스는 사용자 정보를 관리하고, UserRepository 클래스는 사용자 데이터를 저장하며, UserService 클래스는 사용자 등록과 조회 기능을 제공한다. 각 클래스는 하나의 책임만을 가지며, 이를 통해 코드의 가독성과 유지보수성을 높였다.

So...

좋은 코드는 가독성, 유지보수성, 재사용성 등을 고려한 코드이다. OOP는 이러한 좋은 코드를 작성하는 데 유용한 패러다임을 제공한다. OOP의 다양한 설계 원칙을 잘 활용하면 더 나은 품질의 소프트웨어를 개발할 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글