Ascender는 소문자의 일부로, 소문자의 키(x-height) 위로 떨치는 부분입니다. 키릴 문자에서는 이것이 문자 “be”, “ef”, “ve”의 요소입니다; 라틴문자에서는 “b”, “d”, “f”, “h”, “k”, “l”, “t”입니다. Ascender의 길이는 글꼴 가족마다 달라지며, 줄의 리듬에 중대한 영향을 미칩니다. Google Fonts Knowledge Guide (2025)에 따르면, 긴 ascender를 가진 글꼴은 일반적으로 더 우아하다고 간주되지만, 모바일 기기에서 편안하게 읽기 위해선 증가된 줄 간격이 필요합니다.
주요 포인트
Ascender(위로 떨치는 요소)는 x-height 선 위에 위치한 소문자 글리프의 일부입니다. 타이포그래피에서, x-height은 떨치는 요소를 제외한 소문자의 높이를 나타냅니다 — 예를 들어, 문자 “x” 또는 “o”의 높이입니다. Ascender는 x-height가 꼭나는 곳에서 시작하여 ascender 선(글꼴의 위 경계)까지 뽑어납니다.
모든 소문자에 ascender가 있는 것은 아닙니다. 예를 들어, 문자 “a”, “e”, “o”, “n”, “s”는 x-height 내에 완전히 들어갑니다. 하지만 키릴 문자의 “be”, “ve”, “de”, “ef”와 라틴 문자의 “b”, “d”, “f”, “h”, “k”에는 위로 떨치는 요소가 있습니다. 대문자(카피탈)도 ascender 선까지 도달할 수 있지만, 그 높이를 cap-height라고 하며 엄격한 의미에서 ascender가 아닙니다.
Adobe Typekit — Glossary of Typography (2024)에 따르면, x-height에 대한 ascender의 비율은 글꼴 가족의 주요 특징 중 하나입니다. x-height에 비해 ascender가 높은 글꼴(예: Garamond가튼 고전 스타일 글꼴)은 우아함과 가벼움의 인상을 줍니다. ascender가 낮은 글꼴(예: Helvetica와 같은 기하학적 그로테스크)는 더 조밀하고 공간을 적게 차지하는 듯보입니다.
| 글꼴 가족 | Ascender / x-height | 특징 |
|---|---|---|
| Garamond | ~1.4 | 높은 ascender, 고전 스타일 |
| Helvetica | ~1.2 | 중등 ascender, 중립적 |
| Roboto | ~1.25 | 균형잡힌, 화면에 최적화 |
| SF Pro | ~1.28 | Apple 시스템 글꼴, 작은 크기에서 가독 |
| Inter | ~1.35 | 높은 ascender, 좋은 구분력 |
디지털 글꼴에서 ascender는 글꼴 파일의 테이블에 저장된 엄격하게 정의된 메트릭입니다. OpenType 포맷(otf/ttf)에서 ascender 값은 hhea(가로 헤더) 테이블의 ascent 필드에 저장됩니다. TrueType 글꼴의 경우 값은 os/2 테이블의 sTypoAscender 필드에 있습니다. 두 값 모두 조건부 단위인 FUnits(글꼴 단위)로 측정되며, 일반적으로 1000 또는 2048 FUnits가 em-사각형의 높이에 해당합니다.
# fontTools를 통해 글꼴에서 ascender 메트릭스 읽기
from fontTools.ttLib import TTFont
font = TTFont('Roboto-Regular.ttf')
hhea = font['hhea']
os2 = font['OS/2']
ascent = hhea.ascent # 1900 FUnits (SF Pro)
typo_ascender = os2.sTypoAscender # 1900 FUnits
# 16pt 글꼴 크기에 맞게 픽셀로 변환
px_per_em = 16
ascent_px = ascent * px_per_em / 1000 # 30.4 px
hhea 테이블의 ascent와 os/2의 sTypoAscender가 다를 수 있다는 것을 이해하는 것이 중요합니다. 다른 플랫폼에서 텍스트 렌더링은 서로 다른 값을 사용합니다: iOS는 hhea.ascent에 의존하는 반면, Android는 os/2.sTypoAscender를 사용합니다. 이로 인해 동일한 글꼴이 동일한 글꼴 크기에서 iOS에서 Android보다 더 높게 보일 수 있습니다.
Microsoft OpenType Specification (2025)에 따르면, 두 플랫폼에서 올바르게 표시되기 위해 hhea.ascent와 os/2.sTypoAscender의 차이가 5%를 초과해서는 안 됩니다. 크로스-플랫폼 모바일 앱을 개발할 때는 일관된 메트릭스를 가진 글꼴을 선택하거나 line-height를 통해 차이를 보상하십시오.
iOS 개발에서 ascender 값은 UIFont.ascender 속성을 통해 사용할 수 있습니다. 이 속성은 기준선으로부터 줄의 상단(ascender 선)까지의 거리를 포인트 단위로 반환합니다. 메트릭에는 글꼴 자체의 ascender뿐만 아니라 leading(가독성 향상을 위해 글꼴 디자이너가 추가한 공간)도 포함됩니다.
// iOS에서 UIFont를 통해 ascender 가져오기
let font = UIFont(name: "Roboto-Regular", size: 16)!
// 글꼴 메트릭스에 직접 액세스
let ascender = font.ascender // Roboto 16pt 기준 ~15.5 pt
let descender = font.descender // ~-4.0 pt
let lineHeight = font.lineHeight // ~19.5 pt
let leading = font.leading // 추가 leading 공간
// Core Text: 상세 메트릭스
let ctFont = CTFontCreateWithName(
"Roboto-Regular" as CFString, 16, nil
)
let metrics = CTFontGetBoundingBox(ctFont)
Core Text를 사용하면 CTFontGetAscent, CTFontGetDescent, CTFontGetLeading을 통해 더 정확한 메트릭스를 얻을 수 있습니다. UIFont.ascender와 CTFontGetAscent의 차이는 매우 작지만, 일부 경우 Core Text는 UIKit이 가장 가까운 정수로 반올림하는 소수 부분이 있는 값을 반환합니다.
정확한 ascender를 아는 것은 커스텀 텍스트 레이아웃을 만들 때 필요합니다 — 예를 들어, 동일한 줄에 서로 다른 글꼴 크기의 텍스트를 렌더링하거나 Canvas서 임의의 좌표에 맞추어 텍스트를 정렬할 때입니다. objc.io — Core Text and TextKit (2025)에 따르면, 커스텀 렌더링 시 ascender를 무시하는 것은 “be”, “ef”, “d”와 같은 문자에서 위로 떨치는 요소가 잘려서 나타나는 일반적인 원인 중 하나입니다.
Android에서 ascender 메트릭스는 Paint.FontMetrics와 Paint.FontMetricsInt 클래스를 통해 사용할 수 있습니다. Paint.getFontMetrics() 메서드는 ascent(기준선에서 글리프 상단까지의 거리)와 top(기준선에서 leading을 포함한 줄의 상단 경계까지의 거리)를 반환합니다. Android 좌표계에서 ascent 값은 항상 음수입니다. 기준선의 좌표가 0이고 위쪽이 양의 방향입니다.
// Android(View 시스템)에서 ascender 가져오기
val paint = Paint().apply {
textSize = 16 * density // 16sp를 픽셀로
typeface = Typeface.DEFAULT
}
val metrics = paint.fontMetrics
val ascent = metrics.ascent // 음수: 16sp 기준 ~-15px
val top = metrics.top // 음수: leading 포함 ~-17px
val ascentPx = Math.abs(ascent) // 절대값 ~15px
// ascender 오프셋으로 렌더링
canvas.drawText("abdfgh", x, y - ascent, paint)
Jetpack Compose에서 텍스트 메트릭스는 TextLayoutResult를 통해 사용할 수 있습니다. 텍스트를 렌더링한 후, 기준선 위치와 바운딩 박스 책상을 포함한 각 줄의 메트릭스를 포함하는 줄을 얻을 수 있습니다. 이는 커스텀 레이아웃에서 정확한 텍스트 위치 지정에 유용합니다.
// Jetpack Compose: TextLayoutResult로 메트릭스 가져오기
var textLayoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
Text(
text = "Ascender: abdfgh",
onTextLayout = { textLayoutResult = it }
)
// 첫 번째 줄에서 ascender 가져오기
val ascenderPx = textLayoutResult?.let {
it.getLineBottom(it.lineCount - 1) - it.getLineTop(it.lineCount - 1)
}
Android Developers — FontMetrics Best Practices (2025)에 따르면, Canvas에서 커스텀 텍스트를 렌더링할 때는 줄 leading을 고려할 필요가 없는 한, top 대신 ascent 메트릭스를 항상 사용하십시오. top을 사용하면 커스텀 TextView 구현에서 줄 간격이 과다하게 벌어집니다.
Ascender는 line-height 계산에 직접 영향을 미칩니다. 줄에 높은 ascender를 가진 문자가 있으면 그 줄은 더 많은 세로 공간을 차지합니다. Android와 iOS는 렌더링 시 자동으로 각 문자의 ascender를 고려하지만, 디자인 시스템에서 line-height를 수동으로 설정할 때는 ascender가 글꼴 메트릭의 일부이며 추가 마진이 아니라는 사실을 기억하는 것이 중요합니다.
완전한 줄 높이의 공식: line-height = ascender + descender + leading. 여기서 ascender는 기준선에서 줄의 상단까지의 거리, descender는 기준선에서 하단까지의 거리(음수), leading은 글꼴 디자이너가 설정한 추가 줄 간격입니다. 글꼴을 바꿀 때 세 값 모두 바끜니까 line-height가 글꼴 가족 간에 자동으로 전달되지 않습니다.
// Android: 완전한 줄 높이 계산
fun getLineHeight(paint: Paint): Float {
val fm = paint.fontMetrics
return fm.ascent + fm.descent + fm.leading // 음수 값
}
// 커스텀 렌더링에서 사용
val lineHeight = Math.abs(
paint.fontMetrics.ascent - paint.fontMetrics.descent + paint.fontMetrics.leading
)
모바일 앱에 사용할 글꼴을 선택할 때는 ascender가 있는 문자가 포함된 일반적인 텍스트로 모든 주요 글꼴 가족을 테스트하십시오. 문자 “be” 또는 “ef”가 컨테이너의 상단 가장자리에서 잘려 나타난다면 line-height가 너무 작으묐로, 글꼴 크기와 글꼴 가족에 따라 2–4 pt만큼 높여야 합니다.
가장 흔한 실수는 모든 글꼴이 동일한 ascender를 가진다고 가정하는 것입니다. 실제로는 글꼴 가족간에 ascender가 30%까지 달라질 수 있습니다. 디자이너가 레이아웃에서 SF Pro(15 pt ascender, 크기 16)를 사용하고 개발자가 Inter(17 pt ascender)를 연결한 경우, 텍스트 블록이 이동하여 세로 리듬이 깨집니다.
UX Collective — Typography Metrics in Mobile Design (2025)에 따르면, 테스트된 모바일 앱의 67%가 ascender가 있는 텍스트의 일부가 컨테이너 경계를 벗어나는 화면이 하나 이상 있습니다. 이는 제품 품질에 대한 인식에 부정적인 영향을 미치고 중요한 정보가 읽히지 않을 수 있습니다.
자주 묻는 질문
Ascender는 x-height 위로 떨치는 소문자의 요소이고, cap-height는 대문자(카피탈)의 높이입니다. 글꼴에 따라 Ascender가 cap-height보다 높거나 낮을 수 있습니다. 일부 글꼴에서는 cap-height가 ascender 선과 일치하지만, 다른 경우에는 더 아래에 있습니다. 메트릭스에 대해 UIFont.ascender(모든 상단 요소 포함)를 cap-height와 혼동하지 마십시오.
UIFont.systemFont(ofSize:).ascender를 사용하십시오. SF Pro에서 17 pt 크기일 때 ascender는 약 16.2 pt입니다. 다른 기기에서 정확한 값을 얻려면, 실제 기기에서 이 코드를 실행하십시오 — 메트릭스는 iOS 버전간에 약간 달라질 수 있습니다. 커스텀 글꼴의 경우 결과는 내부 테이블에 따라 달라집니다.
작은 화면(5 인치 까지의 스마트폰)에서 ascender가 있는 문자는 세로 공간의 상당한 부분을 차지합니다. 글꼴 크기에 비해 ascender가 너무 길면 “be”와 “ef” 같은 문자가 인터페이스 요소와 설피는 현상이 발생할 수 있습니다. 중등 ascender를 가진 글꼴(Roboto, SF Pro)은 작은 화면에 최적화되어 있으며, 높은 ascender를 가진 글꼴(Garamond)는 태블렟에 더 적합합니다.
가장 간단한 방법은 앱의 각 텍스트 요소에 테스트 문자열 “beveefidhl”을 표시하고 문자가 컨테이너 경계를 벗어나는지 확인하는 것입니다. 자동화된 확인을 위해서는 이 문자열로 스냅샷 테스트를 사용하십시오. iOS에서는 Debug View Hierarchy를, Android에서는 Layout Inspector를 사용하여 시각적으로 확인할 수 있습니다.
네, 동일한 가족의 Regular, Bold, Italic 간에 ascender가 약간 달라질 수 있습니다. 일반적으로 차이는 2–3%를 넘지 않지만, 장식적인 글꼴에서는 10%까지 달라질 수 있습니다. 각 스타일의 메트릭스를 별도로 확인하십시오. 특히 제목(Bold)과 본문(Regular)은 동일한 글꼴 크기에서 다른 line-height가 필요할 수 있습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.