본문 바로가기

Design Pattern

(6)
SOLID Principles Series 5 : Dependency Inversion (의존성 역전 원칙) SOLID Principles - Dependency Inversion 의존성 역전(Dependency Inversion) 원칙은 구체적인 개념보다는 추상적인 개념에 의존해야 한다는 원칙입니다. 구체적인 객체는 추상화된 객체(프로토콜)에 의존해야 한다는 의미입니다. 아래의 예시 코드를 살펴보면, EPL 클래스는 Liverpool과 Chelsea에 직접 의존하고 있습니다. 이는 유지보수를 어렵게 만들며, 강등 및 승격 시 매번 코드를 수정해야 하는 문제가 있습니다. 이는 의존성 역전 원칙을 위배하는 것입니다. class Liverpool { func whoAreYou() -> String { return "We are Liverpool!" } } class Chelsea { func whoAreYou() ..
SOLID Principles Series 2 : Open-Closed (개방 폐쇄 원칙) SOLID Principles - Open-Closed 소프트웨어 개발에서 SOLID 원칙 중 두 번째인 Open-Closed(개방 폐쇄) 원칙은 코드는 확장에는 열려있고 수정에는 닫혀있어야 한다는 원칙입니다. 이는 새로운 기능이 추가되거나 변경이 필요할 때 코드를 수정하지 않고 확장할 수 있어야 한다는 의미입니다. 아래의 예시 코드를 살펴보면, EPL 클래스는 팀 이름을 가지고 있는 클래스입니다. whoAreYou 함수는 EPL 인스턴스의 팀에 따라 다른 출력을 하도록 구현되어 있습니다. 그러나 새로운 팀(Tottenham, Arsenal)을 추가하려면 whoAreYou 함수를 수정해야 하는 문제가 발생합니다. 이는 Open-Closed 원칙을 위반하는 것입니다. class EPL { let team:..
SOLID Principles Series 4 : Interface Segregation (인터페이스 분리 원칙) SOLID Principles - Interface Segregation 소프트웨어 개발에서 SOLID 원칙 중 네 번째인 Interface Segregation(인터페이스 분리) 원칙은 인터페이스는 구체화된 인터페이스들로 나뉘어져 있어야 한다는 원칙입니다. 즉, 클라이언트는 필요한 인터페이스만 사용할 수 있어야 하며, 큰 범위의 인터페이스를 구현하지 않도록 해야 합니다. 아래의 예시 코드를 살펴보면, 축구 선수를 정의하는 FootballPlayer 프로토콜이 있고, 채택하는 클래스들은 패스, 드리블, 슛을 구현해야 합니다. 그러나 해당 예시에서는 골키퍼인 김병지를 FootballPlayer에 강제로 포함시키기 위해 divingCatch()와 goalKick() 메서드를 추가하였습니다. 이로 인해 Mes..
SOLID Principles Series 3 : Liskov Substitution(리스코프 치환) 소프트웨어 개발에서 SOLID 원칙 중 세 번째인 Liskov Substitution(리스코프 치환) 원칙은 상속 관계에 있는 클래스들이 서로를 대체할 수 있어야 한다는 원칙입니다. 즉, 부모 클래스 타입으로 선언된 변수에 자식 클래스의 인스턴스를 할당하여도 기대한 동작을 수행해야 합니다. 아래의 예시 코드를 살펴보면, EPLTeam 클래스를 상속받은 Liverpool 클래스와 Chelsea 클래스가 각각 자신의 도시를 출력하는 메서드를 오버라이딩하고 있습니다. 이때, 부모 클래스 타입으로 선언된 변수에 각 클래스의 인스턴스를 할당하여도 메서드의 동작이 예상대로 수행됩니다. class EPLTeam { func whereAreYou() { print("we are in England") } } class..
SOLID Principles Series 1 : Single Responsibility (단일 책임 원칙) SOLID Principles - Single Responsibility 소프트웨어 개발에서 SOLID 원칙 중 하나인 단일 책임 원칙은 하나의 클래스가 목적에 부합하는 단 하나의 책임만을 가져야 한다는 원칙입니다. 이를 통해 클래스의 역할과 책임이 명확히 분리되어 유지보수성과 확장성이 향상됩니다. 예시 1: 함수 분리 다음은 함수 분리의 예시입니다. func add(first: Int, second: Int) -> Int { return first + second } func numPrint(num: Int) { print(num) } 위의 예시에서 첫 번째 함수는 두 수를 더하고 결과를 반환하는 역할을, 두 번째 함수는 숫자를 프린트해주는 역할을 수행합니다. 이 두 함수는 각각 다른 책임을 가지므로 ..
[Swift] 싱글톤 패턴(Singleton Pattern)과 private init 싱글톤 패턴은 앱 실행 시, 힙 영역에 유일하게 한 개만 존재하는 객체가 필요한 경우에 사용한다. (특정, 유일한 데이터/관리 객체가 필요한 경우) 예시 코드 class Singleton { static let shared = Singleton() // 자신의 객체를 생성해서 전역변수에 할당 // 왜 그냥 property가 아니라 static property일까? // Singleton 패턴은 메모리에 단 하나의 객체만 올라가야 한다. 매번 인스턴스를 생성해야만 접근 가능한 stored property는 개념상 어긋(?)남 **var userInfoId = 12345** private init() {} } 사용 (접근) 방식 Singleton.shared.userInfoId ** private init을..