인포메이트 7주차 공유(알고리즘)
인포메이트 7주차 공유(알고리즘) 모음입니다.
CSS 프로퍼티에 숨겨진 레이아웃 알고리즘 - 곽승주
Heap 메모리와 GC 알고리즘 - 윤해진
React reconciliation 알고리즘을 초간단하게 알아보자! - 김민재
재미와 이익을 위한 자바스크립트 전문화 - 김하나
CSS 프로퍼티에 숨겨진 레이아웃 알고리즘 - 곽승주
Intro
자주 사용했었던 CSS 코드가 예상치 못한 다른 결과를 낳은 적이 있었을 것입니다. 그 이유는 프로퍼티가 복잡한 시스템에서 작동하고, 프로퍼티의 작동 방식을 변경시키는 미묘한 컨텍스트가 있기 때문입니다. 이는 레이아웃 알고리즘
과 연관되어 있습니다.
레이아 웃 알고리즘
레이아웃 알고리즘
이 뭘까요? 브라우저가 HTML을 렌더링할 때, 모든 요소는 기본 레이아웃 알고리즘을 사용하여 계산된 레이아웃을 갖습니다. 레이아웃 알고리즘에는 아래와 같은 것들이 포함됩니다.
- Flexbox
- Positioned
- Grid
- Table
- Flow
z-index
를 예로 설명드리겠습니다. z-index
는 보통 position
과 함께 중첩 순서를 제어하는 데 사용되며, 겹쳐졌을 때 어느 요소가 위에 표시될지 결정하는 속성입니다. 이를 position
없이 사용하면 당연히 제대로된 동작을 하지 않겠죠? 이는 레이아웃 알고리즘 중 Flow 레이아웃
을 사용했기 때문입니다. Flow 레이아웃
은 다른 레이아웃으로 특정짓지 않는 이상 default로 사용됩니다.

하지만, 위 예시를 보면 position
을 사용하지 않고, flex
를 사용하는 것으로도 z-index
가 동작하는 것을 확인할 수 있습니다. 이것은 레이아웃 알고리즘 중 Flexbox 알고리즘
이 z-index
를 구현하기 때문입니다. 이처럼 각 레이아웃 알고리즘에 어떠한 프로퍼티를 구현할 수 있게 정의할 수 있고, 또한 일반적인 기본 동작을 재정의할 수도 있습니다. width
로 그 예를 설명하겠습니다.

첫 div 태그
는 Flow 레이아웃을 사용하여 렌더링되며, 실제로 2000px
의 너비 를 갖지만, 같은 속성을 갖는 flex-wrapper 내부의 div 태그
는 Flexbox 레이아웃을 사용하고 있습니다. 이처럼 같은 속성을 가질지라도 레이아웃 알고리즘에 의해 다른 결과를 낳을 수 있게 됩니다.
충돌
만약 하나의 요소에 여러 레이아웃 알고리즘이 적용되면 어떻게 될까요?
<style>
.row {
display: flex;
}
.primary.item {
position: absolute;
}
</style>
<ul class="row">
<li class="item"></li>
<li class="primary item"></li>
<li class="item"></li>
</ul>
세 리스트 항목은 모두 Flex 컨테이너에 포함된 자식이므로, Flexbox 레이아웃에 따라 배치되어야 합니다. 그러나 두 번째 자식 요소는 position: absolute
로 특정시켰기 때문에 Positioned 레이아웃
동작을 따릅니다.
이렇게 두 레이아웃이 충돌 시 요소는 제일 주된 레이아웃 모드를 사용하여 렌더링됩니다. 정확한 계층 구조는 모르지만, Positioned 레이아웃
이 높은 우선순위를 갖는 경향이 있습니다. 따라서 두 번째 자식 요소는 Flexbox가 아닌 Positioned 레이아웃을 사용합니다.
일반적으로 의도적인 충돌을 발생시키는 경우가 대부분입니다. 그러나 요소가 예상대로 작동하지 않는 것을 확인한다면 사용 중인 레이아웃 알고리즘을 확인해볼 필요가 있습니다.
인라인 마법 공간(inline magic space)

위 박스 안에 고양이 이미지가 있습니다. 단순 코드이며 padding이나 margin을 주지 않았는데 이미지 아래에 약간의 여백이 있는 것을 확인할 수 있습니다. 어떠한 레이아웃 알고리즘을 지정하지 않았기 때문에 Flow 레이아웃이라는 것을 유추할 수 있고, 그 Flow 레이아웃 때문에 아래 여백이 생긴다라고 생각할 수 있습니다. Flow 레이아웃은 인라인(inline)
또는 블록(block)
구조를 기반으로 합니다.
그리고 인라인 요소는 레이아웃의 일부가 아니라 단락 중간에 사용되는 경우가 많습니다. 그렇기 때문에 인라인 요소가 주변 텍스트의 가독성에 부정적인 영향을 주지 않도록 약간의 수직 공간(줄 간격)이 추가됩니다.
이러한 이유로 위 고양이 이미지 밑에 여백이 생긴 것도 이해가 될 것입니다. 이미지는 기본적으로 인라인 요소이기 때문입니다!
이를 해결하기 위한 가장 간단한 방법으로는 인라인 부분을 블록으로 처리하는 것입니다.
또한, 이 동작은 Flow 레이아웃에서만 해당하므로, 다른 레이아웃 알고리즘으로 전환해 문제를 해결할 수 있습니다 ex) display: flex;
마지막으로, line-height
를 통해 추가 공간을 0으로 축소시켜 문제를 해결할 수도 있습니다.
결론
CSS
는 많은 레이아웃 알고리즘
이 있으며 모두 고유한 기법과 숨겨진 메커니즘이 있습니다. CSS 프로퍼티에만 집중한다면, 원하는 결과를 얻지 못했을 때 그 원인을 제대로 파악하지 못할 것입니다. 또한, 원하는 결과를 만들기 위해 부가적인 속성을 추가하는 방법으로 해결할 것입니다. 하지만, 레이아웃 알고리즘을 이해한다면, 적절한 레이아웃 알고리즘을 선택해 근본적인 문제를 해결할 수 있습니다.
참고자료
https://junghan92.medium.com/번역-레이아웃-알고리즘-이해하기-baed8b1eca5f
Heap 메모리와 GC 알고리즘 - 윤해진
들어가며)
Heap. 자료구조, 알고리즘 적으로는 꽤나 익숙하실 것입니다. 그러나 이번 주제로는 힙 메모리라는 영역과 그를 관리하는 가비지 컬릭터에 대해서 이야기해 보려 합니다.
Heap 메모리란
힙 메모리란 자바스크립트에서 참조 타입(객체 등) 데이터를 저장하기 위한, 메모리 할당을 하는 영역으로 js에서 동적으로 할당되는 데이터를 저장하는 공간입니다.
힙 메모리의 경우 변수가 생성되고 해제될 때까지 데이터를 유지하며, 할당 및 해제는 프로그램 실행 중 자동으로 이루어집니다. 힙은 스택과 달리 구조화되지 않은 자유 형식의 메모리 공간으로 필요에 따라 동적 확장 및 축소 가능합니다.
힙의 동적 메모리 할당
- 객체 및 함수
- 런타임에 크기를 알 수 있음
- 객체당 제한 없음