코틀린 명시적 뒷받침 필드

Kotlin explicit backing fields

공개 프로퍼티 타입과 내부 저장 타입을 한 선언 안에서 분리합니다.

···
html
<div class="r2 backing" data-step="0"><div class="r2-head">EXPLICIT BACKING FIELD<span class="r2-live"></span></div><div class="r2-stage"><div class="r2-field-top">public <strong>List</strong><span>read only</span></div><div class="r2-field-wire"></div><div class="r2-field-bottom">field <strong>ArrayList</strong><span>mutable</span></div><div class="r2-field-action">add(item)</div></div><div class="r2-foot"><span class="r2-caption"></span><span class="r2-progress"></span></div></div>
css
.r2{width:min(95vw,730px);height:min(92vh,330px);padding:clamp(9px,2.5vmin,17px);display:flex;flex-direction:column;gap:7px;border:1px solid var(--line);border-radius:13px;background:var(--surface);color:var(--fg);font:500 clamp(12px,3.4vmin,16px)/1.25 var(--font-sans,sans-serif)}.r2 *{box-sizing:border-box}.r2-head{display:flex;justify-content:space-between;align-items:center;min-height:17px;color:var(--accent);font-size:12px;font-weight:700;letter-spacing:.03em}.r2-live{height:7px;width:7px;border-radius:50%;background:var(--accent);animation:r2beat 1.1s infinite}@keyframes r2beat{50%{opacity:.25}}.r2-stage{flex:1;min-height:0;position:relative;overflow:hidden}.r2-foot{min-height:27px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px}.r2-caption{min-width:0}.r2-progress{flex:none;color:var(--accent);font:600 12px ui-monospace,monospace}.backing .r2-stage{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}.r2-field-top,.r2-field-bottom{width:min(85%,260px);display:flex;justify-content:space-between;align-items:center;gap:5px;padding:8px;border:1px solid var(--line);border-radius:7px;background:var(--bg);font-size:12px;transition:background .3s,transform .3s}.r2-field-top strong,.r2-field-bottom strong{color:var(--accent)}.r2-field-top span,.r2-field-bottom span{color:var(--muted)}.r2-field-wire{height:15px;border-left:2px solid var(--accent)}.r2-field-action{padding:3px 9px;border-radius:5px;border:1px solid var(--line);font:600 12px ui-monospace,monospace;opacity:.45;transition:opacity .3s,transform .3s}.backing[data-step="0"] .r2-field-bottom,.backing[data-step="1"] .r2-field-top,.backing[data-step="2"] .r2-field-action{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,var(--surface));transform:translateY(-2px)}.backing[data-step="2"] .r2-field-action{opacity:1}
js
const root=document.querySelector('.r2'),caption=root.querySelector('.r2-caption'),progress=root.querySelector('.r2-progress'),labels=["Store a mutable value","Expose a read-only type","Update inside the class"];let step=0;function advance(){root.dataset.step=String(step);caption.textContent=labels[step];progress.textContent=(step+1)+' / '+labels.length;step=(step+1)%labels.length}advance();const timer=setInterval(advance,1000);root.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})

Kotlin 2.3의 명시적 뒷받침 필드는 프로퍼티의 field에 내부 구현 타입을 직접 선언합니다. 외부에는 읽기 전용 List를 보이면서 내부에는 수정 가능한 ArrayList를 저장하는 식입니다. 별도의 비공개 프로퍼티를 두던 코드를 줄일 수 있습니다.

데모는 외부에서 보는 타입과 내부 저장 타입을 위아래로 분리해 보여줍니다. 이 문법은 실험 기능이며 -Xexplicit-backing-fields 옵션을 켜야 합니다.

언제 쓰나

공개 API는 읽기 전용으로 유지하고 클래스 내부에서 저장값을 갱신할 때 검토합니다.

페이지로 열기 ↗