반응형
이전 글에서는 퍼사드(Facade) 패턴을 모던 C++ 관점에서 재해석하며, 상속 없이 람다와 함수 합성으로 복잡한 서브시스템을 단순한 인터페이스로 감싸고, std::expected, std::format, coroutine, Ranges 등을 활용해 비동기 처리나 조건부 처리, 로깅, 에러 처리 등 다양한 요구사항에 쉽게 대응할 수 있음을 확인했습니다. 이번에는 구조적 패턴 중 플라이웨이트(Flyweight) 패턴을 다룹니다.플라이웨이트 패턴은 많은 수의 유사한 객체를 효율적으로 관리하기 위해 객체들이 공유할 수 있는 상태를 중앙에서 관리하는 패턴입니다. 예를 들어, 텍스트 처리기에서 각 문자를 개별 객체로 표현하면 메모리 낭비가 심하므로, 공유 가능한 폰트 정보나 형태 정보를 플라이웨이트 객체로 한 ..
이전 글에서는 데코레이터(Decorator) 패턴을 모던 C++ 관점에서 재해석하며, 상속 없이도 람다 합성을 통해 객체에 동적으로 기능을 추가하는 방법을 살펴봤습니다. 이번에는 구조적 패턴 중 퍼사드(Facade) 패턴을 다룹니다.퍼사드 패턴은 복잡한 서브시스템을 단일하고 단순한 인터페이스로 감싸, 클라이언트가 시스템을 쉽게 사용할 수 있게 하는 패턴입니다. 전통적으로는 Facade 클래스를 만들어 서브시스템 객체들을 정적 호출 계층으로 감싸았으나, 이는 서브시스템 변경 시 Facade 수정 필요, 에러 처리나 비동기 처리 시 복잡성 증가 등의 문제를 야기합니다.C++20 이상에서는 Concepts, 람다, std::function, std::expected, std::format, coroutine,..
이전 글에서는 컴포지트(Composite) 패턴을 모던 C++ 관점에서 재해석하며, std::variant와 std::visit를 통해 상속 없이 부분-전체 구조를 값 기반으로 표현하고, Ranges, coroutine, std::expected, std::format 등을 활용해 조건부 처리, 비동기 연산, 로깅 등 다양한 요구사항에도 쉽게 대응할 수 있음을 확인했습니다. 이번에는 구조적 패턴 중 데코레이터(Decorator) 패턴을 다룹니다.데코레이터 패턴은 객체에 동적으로 새로운 기능을 추가하기 위한 패턴이며, 전통적 구현에서는 컴포넌트를 상속한 데코레이터 클래스 계층을 통해 기능을 장식(Decorate)해야 했습니다. 그러나 이는 클래스 증가와 유지보수 어려움을 초래합니다. C++20 이상에서는 ..
여러분, 코딩 인터뷰를 준비하는 여정은 길고 험난할 수 있습니다. 알고리즘과 자료구조, 동적 프로그래밍, 그리디, 고급 문자열 알고리즘, 시스템 설계까지, 다양한 주제와 개념을 익히고 숙달해야 하는 과정에서 “정말 이게 다 필요할까?”, “어떻게 하면 더 효율적으로 준비할 수 있을까?”라는 고민을 하실 텐데요. 이 글에서는 그동안 살펴본 다양한 주제들을 총체적으로 정리하고, 추가 학습 방안과 참고 자료를 제안함으로써 여러분이 앞으로 더 체계적이고 자신감 있게 인터뷰 준비를 해나갈 수 있도록 도움을 드리려고 합니다.단순히 알고리즘 문제만 잘 푼다고 해서 합격이 보장되진 않습니다. 회사마다 문화나 요구사항이 다르고, 커뮤니케이션 스킬, CS 기본기, 시스템 설계 이해도 등 다양한 역량이 필요합니다. 그러나 ..
여러분은 반복적인 업무에 지친 적이 있으신가요? 매일 같은 일을 반복하며 "이 일을 자동화할 수 있다면 얼마나 좋을까?"라고 생각해 보신 적이 있으신가요? 그렇다면 Make를 소개해 드리고 싶습니다. Make는 이전에 Integromat으로 알려졌던 강력한 노코드 자동화 플랫폼입니다. 이 플랫폼은 여러분의 업무 방식을 완전히 바꿀 수 있는 잠재력을 가지고 있습니다.Make의 탄생과 발전Make의 이야기는 2012년, 체코의 프라하에서 시작되었습니다. 소프트웨어 개발자인 온드레이 크프리바와 그의 팀은 비즈니스 프로세스를 더 효율적으로 만들 수 있는 방법을 고민하고 있었습니다. 그들은 복잡한 코딩 없이도 다양한 앱과 서비스를 연결하고 자동화할 수 있는 플랫폼을 만들고자 했습니다. 이렇게 탄생한 것이 바로 I..
이전 글에서는 브리지(Bridge) 패턴을 모던 C++ 관점에서 재해석하며, 상속 기반 추상/구현 분리 없이도 람다, Concepts, std::expected, coroutine, Ranges, std::format 등을 활용해 추상과 구현을 유연하게 연결할 수 있음을 확인했습니다. 이번에는 구조적 패턴 중 컴포지트(Composite) 패턴을 다룹니다.컴포지트 패턴은 객체를 트리 구조로 구성해, 개별 객체(Leaf)와 복합 객체(Composite)를 동일하게 다룰 수 있게 하는 패턴입니다. 전통적으로는 Component 추상 클래스, Leaf, Composite 클래스 상속 계층을 정의했으나, 이는 클래스 증가와 유지보수 어려움을 야기합니다.C++20 이상에서는 std::variant, std::vis..
이전 글에서는 어댑터(Adapter) 패턴을 모던 C++ 관점에서 재해석하며, 기존 인터페이스를 원하는 다른 인터페이스로 변환하기 위해 상속 없이도 람다, Concepts, std::expected, std::format, coroutine, Ranges 등을 활용할 수 있음을 확인했습니다. 이번에는 구조적 패턴 중 브리지(Bridge) 패턴을 다룹니다.브리지 패턴은 추상(Abstraction)과 구현(Implementation)을 분리하여 둘을 독립적으로 확장 가능하게 만드는 패턴입니다. 전통적으로는 추상 클래스 계층과 구현 클래스 계층을 상속 기반으로 구분하고, 추상 클래스가 구현 객체를 참조하는 구조를 사용했습니다. 이 방식은 새로운 추상이나 구현 타입 추가 시 클래스 증가와 복잡성 상승을 초래합니..
여러분, 알고리즘 문제를 잘 푼다고 해서 코딩 인터뷰를 완벽히 대비했다고 할 수는 없습니다. 대형 IT 기업이나 일정 수준 이상의 기술력을 요구하는 기업에서는 시스템 설계(System Design) 인터뷰를 진행하여 지원자의 대규모 시스템 구성 능력, 확장성(Scalability), 고가용성(High Availability), 성능 최적화, 보안, 비용 관리 역량 등을 평가하곤 합니다.시스템 설계 인터뷰는 단순히 코드를 잘 짜는 것이 아니라, 수십 만 또는 수억 명의 유저가 사용하는 서비스 인프라를 어떻게 설계할지, 어떤 컴포넌트를 사용할지, 트래픽 폭증 상황에서 시스템이 어떻게 견딜지, 데이터 분산이나 캐싱, 로드 밸런싱을 어떻게 적용할지, DB 스케일링은 어떤 전략을 쓸지, 보안과 모니터링은 어떻게 ..
이전 글에서는 비지터(Visitor) 패턴을 모던 C++ 관점에서 재해석하며, std::variant와 std::visit를 통해 이중 디스패치 없이도 다양한 요소 타입별 로직을 처리하는 법을 살펴보았습니다. 이제는 구조적(Structural) 패턴 중 하나인 어댑터(Adapter) 패턴을 다룹니다.어댑터 패턴은 기존 클래스나 함수 인터페이스를 클라이언트가 원하는 다른 인터페이스로 변환하는 패턴입니다. 전통적으로는 어댑터 클래스를 상속 기반으로 정의하고, 기존 인터페이스를 변환하는 메서드를 구현했지만, 이 방식은 클래스 증가, 상속 기반 구조로 인한 유지보수 어려움을 야기합니다.C++20 이상에서는 Concepts로 원하는 인터페이스 요구사항을 명시하고, 람다나 함수 합성으로 변환 로직을 구현하면 상속 ..
이전 글에서는 템플릿 메서드(Template Method) 패턴을 모던 C++ 관점에서 재해석하며, 상속 없이도 람다, Concepts, std::expected, std::format, coroutine, Ranges 등을 활용해 알고리즘 골격을 선언적이고 타입 안전하게 표현할 수 있음을 확인했습니다. 이번에는 행동(Behavioral) 패턴 중 비지터(Visitor) 패턴을 다룹니다.비지터 패턴은 객체 구조(예: 복합 구조나 노드 트리)를 순회하면서, 각 요소 타입에 따라 다른 연산을 수행할 수 있게 하는 패턴입니다. 전통적으로는 각 요소 클래스에 accept(Visitor&) 메서드를 정의하고, 비지터 인터페이스에 각 요소 타입별 visit() 메서드를 두어 이중 디스패치를 실현했으나, 이는 클래스..