The common trick: a proxy contract holds the state and a fixed address, and delegatecalls to a separate logic contract you can swap. Variants: Transparent proxy, UUPS (upgrade logic lives in the implementation), and the Diamond standard (many logic facets). Upgrades introduce risk (storage-layout clashes, malicious upgrades), so they're guarded by governance/timelocks.