본문 바로가기

전체 글

(12)
[오브젝트] 모듈 정보 은닉 정보 은닉은 시스템을 모듈 단위로 분해하기 위한 기본 원리로 시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감추는 것을 말한다. 외부에 감춰야 하는 비밀에 따라 시스템을 분할하는데 이 분할된 시스템을 모듈이라고 한다. 모듈 모듈은 어떤 기능 구현을 부수적으로 돕기 위한 서브 프로그램이라기 보다는 책임에 할당이다. 모듈화는 개발적인 모듈에 대한 작업이 시작되기 전에 정해져야 하는 설계 결정도 포함한다. 모듈들은 다른 모듈에 대해 감춰야 하는 설계 결정에 따라 특징이 지어지는데, 해당 모듈 내부의 작업을 가능한 한 적게 노출하는 인터페이스 또는 정의를 선택한다. 모듈을 설계할 때는 변화할 것 같은 설계 결정들의 목록을 사용해 설계를 시작하는 것이 좋다. 이러한 결..
[오브젝트] 명령-쿼리 분리 원칙 프로시져와 함수 어떤 절차를 묶어 호출 가능하도록 이름을 부여한 기능 모듈을 루틴이라고 한다. 이 루틴은 프로시져와 함수로 구분할 수 있다. 프로시져와 함수는 부수효과와 반환 값의 유무라는 측면에서 명확하게 구분된다. 프로시져는 정해진 절차를 따라 내부의 상태를 변경하는 루틴의 한 종류이고 함수는 어떤 절차에 따라 필요한 값을 계산에서 반환하는 루틴의 한 종류이다. 프로시저는 부수효과를 발생시킬 수 있지만 값을 반환할 수 없다. 함수는 값을 반환할 수 있지만 부수효과를 발생시킬 수 없다. 명령(Command)와 쿼리(Query)는 객체의 인터페이스 측면에서 프로시져와 함수를 부르는 또 다른 이름이다. 객체의 상태를 수정하는 오퍼레이션을 명령이라고 부르고 객체와 관련된 정보를 반환하는 오퍼레이션을 쿼리라고..
iOS 어플리케이션 라이프사이클 포어그라운드와 백그라운드 포어그라운드는 앱을 사용자가 보고 있는 상태로 CPU 자원 사용의 우선순위가 높은 상태를 말한다. 백그라운드는 앱을 사용자가 보고 있지 않으며 실행 중인 상태로 음악, 네비게이션 등 다른 앱을 실행 하거나 다른 화면을 보고 있는 상태를 말한다. 백그라운드 상태에서는 CPU 자원의 우선순위가 낮으며 이 포어그라운드와 백그라운드에서 데이터 처리를 매끄럽게 해주지 않으면 유저의 사용성이 떨어질 수 있다. 앱의 상태 이름 설명 Not Running 앱이 아예 실행되지 않았거나 시스템에 의해 종료된 상태 Inactive 앱이 포어그라운드에서 실행 중이지만 현재 이벤트를 받지 못하는 상태(전화) Active 앱이 포어그라운드에서 실행 중이면서 이벤트를 받고 있는 상태, 일반적으로 앱을 사..
PARA 방법론 서론 어렸을 때 부터 메모하는 것을 좋아했다. 하지만 뭔가 방식이 정해져 있진 않았다. 한 손에 들어가는 작은 수첩을 사서 뭔가 배우거나 느끼면 적어놓곤 했다. 적어 놓는 행위만으로 리마인드를 해서 쉽게 잊지 않게 되지만 다시 그 지식이 필요해서 찾을 때는 그 지식을 찾는 시간이 오래 걸려서 다시 읽게 되는 경우 없이 꽉 차면 버리고 다시 사고 그런 고장난 메모를 꾸준히도 해왔다. 이 와중에 고집은 심해서 다이어리처럼 형식이 정해져 있는건 또 싫었다. 캘린더가 있고, 날짜를 적는 란이 있고 표가 있고..이런 노트는 일체 구매하지 않았다. 선만 있는 노트에 나만의 방식으로 끄적이고 던져놓는 걸 좋아했다. 하지만 물리적인 노트는 뭔가 생각이 들었을 때 다시 적거나, 어떤 지식이 급하게 필요할 때 그 노트가 ..
[오브젝트] 객체지향 패러다임 객체지향 패러다임의 관점에서 핵심은 역할, 책임, 협력이다. 객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다. 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하는 과정에서 드러난다. 클래스와 상속은 책임과 협력이 어느정도 설계가 된 후 사용하는 구현 메커니즘일 뿐이다. 설계 이전에 구현에 초점을 맞추는 것은 변경하기 어렵고 유연하지 못한 코드를 낳는 원인이 된다. 협력이란 어떤 기능을 구현하기 위해 다양한 객체들이 메시지를 주고 받으면서 상호작용하는 것을 말한다. 객체가 협력에 참여하기 위해 수행하는 로직은 책임이라고 한다. 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하는 역할을 구성한다. 협력 두 객체 사이의 협력은 하나의 객체가 다른 객체에게 도움을 요청할 때 시..
[오브젝트] 데이터 중심 설계의 단점 응집도 응집도는 모듈에 포함된 내부 요소들이 연관되어 있는 정도이다. 모듈 내 요소들이 하나의 목적을 위해 긴밀하게 협력한다면 그 모듈은 높은 응집도를 가진 것이다. 객체지향의 관점에서 응집도는 객체에 얼마나 관련이 있는 책임들이 할당 되었는지를 나타낸다. 결합도 결합도는 의존성의 저정도로 한 모듈이 다른 모듈에 대해 얼마나 많은 지식을 가지고 있는지를 나타낸다. 어떤 모듈이 다른 모듈에 대해 너무 자세히 알고 있다면 두 모듈의 결합도는 높다고 할 수 있다. 객체지향의 관점에서 객체들끼리는 꼭 필요한 정보만을 알고 있는 것이 좋다. 데이터 중심 설계 데이터 중심 설계는 객체를 설계할 때 상태, 즉 필요로 하는 데이터를 먼저 설계하게 된다. 이렇게 하면 아래와 같은 단점이 발생한다. 객체간의 응집도가 낮아..
CollectionViewFlowLayout CollectionView 컬렉션 뷰는 반복되는 뷰를 보여주는 방법이다. 테이블 뷰는 위에서 아래로만 뷰들을 보여주지만 컬렉션 뷰는 이러한 테이블 뷰보다 커스텀이 자유롭다는 장점이 있다. 대신 그만큼 설정이 복잡하고, 그런 커스텀을 하는 방법 중 하나가 CollectionViewFlowLayout을 사용하는 것이다. CollectionViewFlowLayout CollectionViewLayout(이하 flowlayout)은 flow 대로 흐르는대로 레이아웃을 잡는 것을 의미한다. CSS의 flex-flow와 같은 맥락으로 작동한다. 수직, 수평으로 뷰를 나열할 수 있고 뷰가 한 줄이 꽉차면 아래로 자동으로 내려 가게 된다. 수직 스크롤의 경우 아래와 같이 뷰가 배치된다. 또 위 그림처럼 헤더와 푸터를 ..
UIView와 UIViewController의 Lifecycle UIView UIView는 직사각형의 영역을 관리하는 오브젝트이다. ViewControlaler의 서브뷰 형태로 내부의 자세한 내용을 그리는데 사용된다. 이 역시 Lifecycle을 가지고 있다. ViewController 내부에 존재하기 때문에 UIView의 라이프사이클은 ViewController의 라이프사이클에 포함될 수 밖에 없다. UIView의 Lifecycle didAddSubview view에게 subview가 추가됨을 알린다. willRemoveSubview view에게 subview가 사라짐을 알린다 willMove(toSuperView) view에게 superview가 이동할것임을 알린다. didMoveToSuperview view에게 superview가 이동했음을 알린다. willMo..