|

ConstraintSet 사용법 정리: 코드로 ConstraintLayout 제약을 바꿔야 할 때 보는 가이드

ConstraintSet 사용법과 기본 흐름을 설명하는 안드로이드 대표 이미지
clone, connect, clear, applyTo 흐름을 쉽게 정리한다

ConstraintSet 사용법은 ConstraintLayout 기본 개념을 이해한 뒤에 자주 막히는 다음 단계입니다. XML만으로는 화면 상태 변화를 다루기 애매한 순간, 코드에서 제약을 다시 연결하고 적용해야 할 때 ConstraintSet이 등장합니다.

이번 글에서는 ConstraintSet이 왜 필요한지부터, clone, connect, clear, applyTo 흐름을 실제 상태 변화 UI 예시와 함께 쉽게 정리하겠습니다. 핵심은 메서드 이름을 외우는 것이 아니라 상태에 따라 제약 설계를 바꾼다는 감각을 잡는 것입니다.


먼저 한 줄로 정리

ConstraintSet은 코드에서 ConstraintLayout의 제약 상태를 바꿀 때 쓰는 도구라고 이해하면 됩니다. 그리고 입문 단계에서는 clone -> 수정 -> applyTo 흐름만 먼저 잡아도 충분합니다.

ConstraintSet의 clone, 수정, applyTo 흐름을 설명하는 이미지
ConstraintSet 기본 흐름: clone -> 수정 -> applyTo

ConstraintSet이 왜 필요한가

ConstraintLayout은 XML만으로도 강력하지만, 화면 상태가 바뀌는 순간에는 XML만으로 반복 처리하기 어려운 경우가 생깁니다. 버튼 위치가 상태에 따라 바뀌거나, 카드가 펼쳐질 때 텍스트 영역 제약이 바뀌거나, 특정 뷰를 숨기고 보일 때 다른 뷰 제약도 함께 바꿔야 하는 상황이 그렇습니다.

이런 상황에서 XML 레이아웃 파일을 여러 개 나누는 방법도 있지만, 상태 변화가 비교적 단순하다면 코드에서 제약만 바꾸는 쪽이 더 자연스러울 수 있습니다. 즉, ConstraintSet은 같은 ConstraintLayout 안에서 제약 상태를 코드로 바꾸고 싶을 때 떠올리기 좋은 도구입니다.


ConstraintSet은 무엇을 담고 있는가

Android 공식 가이드는 ConstraintSet을 ConstraintLayout 자식 요소들의 constraints, margins, padding 등을 담는 lightweight object로 설명합니다. 쉽게 말하면 ConstraintSet은 현재 제약 상태를 코드에서 들고 다닐 수 있게 만든 설계도에 가깝습니다. 버튼이 어디에 붙는지, 어떤 뷰가 어떤 뷰와 연결되는지, 어떤 margin을 쓰는지 같은 정보를 담고 있다가 나중에 한 번에 적용할 수 있습니다.


ConstraintSet 사용법에서 가장 먼저 이해해야 할 흐름

  1. ConstraintSet 객체를 만든다
  2. clone으로 현재 제약 상태를 가져온다
  3. 필요한 제약을 수정한다
  4. applyTo로 실제 레이아웃에 반영한다

기본 예시

val constraintSet = ConstraintSet()
constraintSet.clone(binding.rootLayout)

constraintSet.connect(
    R.id.actionButton,
    ConstraintSet.TOP,
    R.id.titleText,
    ConstraintSet.BOTTOM,
    24
)

constraintSet.applyTo(binding.rootLayout)

이 흐름을 가장 단순하게 풀면 이렇습니다. 현재 레이아웃 상태를 복사해서 가져오고, 바꾸고 싶은 제약만 수정한 뒤, 다시 실제 화면에 적용합니다. 즉, ConstraintSet은 처음부터 모든 제약을 새로 쓰는 도구라기보다 기존 상태를 가져와 필요한 부분만 바꾸는 방식으로 이해하는 편이 좋습니다.


connect와 clear는 어떻게 다를까

ConstraintSet의 clone, connect, clear, applyTo 역할을 비교한 표
ConstraintSet 핵심 메서드 역할 비교표

connect

connect는 특정 뷰의 한쪽을 다른 뷰의 어느 쪽에 연결할지 정하는 메서드입니다. 즉, ‘이 버튼의 top을 저 텍스트의 bottom에 붙여라’ 같은 지시를 코드로 표현하는 역할입니다.

clear

clear는 기존 제약을 비우는 역할입니다. 기존 연결을 그대로 둔 채 새로운 연결을 추가하면 상황에 따라 읽기 어려운 제약 상태가 생길 수 있기 때문에, 상태를 분명히 바꿀 때는 먼저 기존 제약을 비우는 편이 더 안전한 경우가 많습니다.


상태 변화 예시

가장 이해하기 쉬운 예시는 버튼 위치가 상태에 따라 달라지는 경우입니다. 예를 들어 처음에는 버튼이 화면 아래쪽에 있다가, 상태가 바뀌면 제목 아래로 올라오게 하고 싶다고 해보겠습니다.

예시 흐름

val set = ConstraintSet()
set.clone(binding.rootLayout)

set.clear(R.id.actionButton, ConstraintSet.BOTTOM)
set.connect(
    R.id.actionButton,
    ConstraintSet.TOP,
    R.id.titleText,
    ConstraintSet.BOTTOM,
    16
)

set.applyTo(binding.rootLayout)

이 코드를 읽는 핵심은 어렵지 않습니다. 기존 bottom 연결을 없애고, 새로운 top 연결을 만들고, 그 상태를 레이아웃에 반영합니다. 즉, ConstraintSet은 복잡한 애니메이션 도구라기보다 상태에 따라 제약 설계를 다시 적용하는 도구라고 보면 됩니다.


0dp와 match constraints도 같이 이해해야 할까

간단히는 그렇습니다. ConstraintLayout API 문서는 0dpMATCH_CONSTRAINT와 동등하게 설명합니다. 즉, ConstraintSet으로 width나 height 관련 제약을 바꿀 때도 기본적으로는 ConstraintLayout에서 쓰던 제약 계산 원리를 그대로 가져갑니다. ConstraintSet을 쓴다고 해서 ConstraintLayout 기본 원리가 사라지는 건 아닙니다.


자주 하는 실수

  1. clone 없이 바로 새로 짠다고 생각하는 실수
  2. clear 없이 connect만 반복하는 실수
  3. ConstraintSet과 MotionLayout을 같은 도구로 생각하는 실수

입문 단계에서는 기존 상태를 가져와 일부만 수정하는 흐름이 훨씬 이해하기 쉽습니다. 그리고 상태를 분명히 바꿀 때는 기존 제약을 먼저 정리하는 편이 더 안전합니다.


ConstraintSet과 MotionLayout은 어떻게 다를까

입문 관점에서 아주 짧게만 구분하면 이렇습니다. ConstraintSet은 코드에서 제약 상태를 바꾸는 도구이고, MotionLayout은 상태 전환과 애니메이션 흐름까지 설계하는 도구입니다. 즉, ConstraintSet은 상대적으로 더 단순한 상태 변화 제어에 먼저 접근할 때 좋고, MotionLayout은 전환 자체를 중요한 UI 경험으로 설계할 때 더 잘 맞습니다.


한 번에 정리

  • ConstraintSet은 코드에서 제약 상태를 바꾸는 도구다
  • clone -> 수정 -> applyTo 흐름이 기본이다
  • connect는 제약을 연결하고, clear는 기존 제약을 비운다
  • XML로만 처리하기 애매한 상태 변화 UI에서 특히 유용하다
  • MotionLayout과는 역할이 다르다

즉, ConstraintSet은 메서드 암기보다 상태에 따라 제약 설계를 다시 적용한다는 감각을 먼저 잡는 것이 중요합니다.


마무리

ConstraintSet은 처음 보면 API 이름이 많아서 어렵게 느껴질 수 있습니다. 하지만 clone으로 현재 상태를 가져오고, 필요한 제약만 바꾸고, applyTo로 반영한다는 흐름만 잡히면 생각보다 빠르게 익숙해질 수 있습니다. 특히 ConstraintLayout을 이미 쓰고 있는데 상태 변화 UI를 코드에서 제어해야 하는 순간이 왔다면, ConstraintSet은 가장 먼저 익혀둘 만한 도구입니다.

관련해서 ConstraintLayout 기본 개념과 디버깅을 먼저 정리하고 싶다면 안드로이드 ConstraintLayout 완전 정리, ConstraintLayout 디버깅 가이드, ConstraintLayout chain 완전 정리 글을 함께 읽어보면 좋습니다. 공식 기준은 Android Developers ConstraintLayout 가이드, ConstraintSet API reference, ConstraintLayout API reference를 참고하면 됩니다.

함께보면 좋은 글