IOS 프로그래밍을 하다 보면 코드를 작성하는 것만으로 충분하지 않다는 것을 자주 느낍니다. 엔지니어는 코드 작성 전반에 걸쳐 올바른 소프트웨어 원칙을 기억하며 개발하고 싶기 때문입니다.
객체 지향 프로그래밍을 배우며 클래스와 상속이 어떻게 작동하는지 배웠습니다. 하지만 객체의 상태(변수)와 동작(함수)을 실제로 어떻게 작성하고 사용하는지가 더 중요합니다. 엔지니어의 목표는 앱을 작동시키는 것뿐만 아니라 잘 구조화되고 격리된 코드를 작성하는 것입니다. 이런 코드를 작성하기 위한 소프트웨어 개발의 세 가지 기본 원칙을 소개합니다.
1️⃣ 관심사 분리 원칙(Separation of Concerns)
첫 번째 원칙은 ‘관심사 분리 원칙’으로 하나의 모듈은 하나의 책임에 관해서만 관심을 가져야 합니다. 모듈은 협력하는 객체들로 구성되고, 객체는 적절한 책임들로 구성되고, 책임은 하나의 동작입니다. 모듈, 객체, 책임의 관심사가 다른 모듈, 객체, 책임에 있지 않을 때 종속성이 줄어들고 코드를 더 쉽게 이해하고 변경할 수 있습니다.
💡객체를 만들 때 역할과 책임이 중요하다는 것은 알지만 핵심은 객체에 어떤 상태(변수)와 동작(함수)과 속하는지 결정하는 것입니다. 이때 ‘관심사 분리 원칙’을 토대로 코드를 작성해야 합니다. 너무 어렵게 접근하기보다는 이 객체가 가져야 할 책임이 맞는지를 고민해보고 헷갈린다면 주변에 물어보는 것도 좋은 방법입니다. 일단 작성하고 넘어가도 좋습니다. 시간이 흘러서 책임의 주체를 변경하여 더 많은 역할이 햡력하는 그림이 그려지는 것도 좋은 접근이라고 생각합니다.
2️⃣ 최소 지식 원칙(Principle of least knowledge)
두 번째 원칙은 ‘데메테르의 법칙’이라고도 알려진 ‘최소 지식 원칙’입니다. 한 객체가 다른 객체 내부 구현에 대해 너무 많이 알고 있으면 객체의 동작이 변경될 때 다른 객체의 수정이 필요하고 눈덩이가 굴러 걷잡을 수 없을 만큼 변경 비용이 많이 발생합니다.
💡객체의 내부 구현을 숨기는 정보 은닉과 캡슐화를 지키며 객체 간 명확한 경계를 바탕으로 협력하는 것이 가장 중요하지만, 코드를 작성할 때는 함수 매개변수와 반환 데이터, 호출 시퀀스를 중요하게 생각해야 합니다. 객체 내부 구현을 숨겼는데 메서드 시그니처를 보고 객체가 어떤 상태를 가졌는지 유추할 수 있습니다. 내구 구현을 숨겼는데도 최소 지식 원칙을 지키지 못한 상황입니다. 매개변수와 반환 데이터 역시도 최소 지식 원칙에 맞게 작성하는 연습을 합시다!
3️⃣ 반복하지 않기
마지막 원칙은 "반복하지 않기"입니다. 간단히 말해, 프로젝트의 다른 부분에서 비슷하게 보이는 코드가 있어서는 안 된다는 뜻입니다. 실제로는 이미 작성한 코드를 복사하여 붙여넣지 말아야 한다는 뜻입니다. 다른 곳에서 이미 작성한 기능이 필요한 경우, 대신 코드를 한곳에 보관하여 재사용할 수 있도록 만들어야 합니다. 프로젝트에서 코드를 복제하면 동작을 변경할 때마다 모든 복사본을 찾아 수정해야 합니다. 또한 일부 코드에 버그가 있는 경우 이를 복사하면 앱의 다른 부분으로 버그가 확산하고 한 곳에서 수정하면 다른 모든 부분에도 버그가 남게 됩니다.
💡같은 일을 반복하지 않으려면 함수, 매개변수, 반환 데이터를 구조화하는 방법을 이해하는 것이 필수입니다. 완전히 똑같은 코드는 쉽게 재사용할 수 있는 코드로 만듭니다. 하지만 약간만 비슷한 코드는 쉽게 재사용할 수 있는 코드로 만들기가 쉽지 않습니다. 그렇기에 구조화를 연습해야 합니다. 프로토콜과 제네릭을 이해하면 유사한 코드를 일반화할 때 유용합니다.
중요한 많은 원칙과 패턴을 지키며 개발하는 것이 아렵다면 이 세 가지 원칙을 바탕으로 개발하는 것이 좋은 연습 방법이라고 생각합니다☺️☺️