상속

부모님의 튼튼한 요리 비법 노트에 나만의 특제 소스 조리법을 덧붙여 새로운 시그니처 메뉴를 완성하는 요리책이에요.

정의 부모님이 쓰시던 튼튼한 자전거를 물려받아 바구니와 전조등만 새로 달아 나만의 자전거로 만드는 것처럼, 프로그래밍에서도 이미 잘 만들어진 설계도를 물려받아 새로운 기능을 덧붙이는 기술이에요. 이를 '상속(Inheritance)'이라고 불러요. 기존에 만들어 둔 클래스(프로그램 설계도)의 모든 속성과 동작을 그대로 가져와서, 중복 작업 없이 필요한 부분만 추가하거나 수정해 새로운 설계도를 손쉽게 만들 수 있어요.

뼈대를 그대로 물려받아 새로 만들기

스마트폰 게임에서 수많은 몬스터를 만든다고 상상해 볼게요. 슬라임, 드래곤, 좀비 등 모든 몬스터는 기본적으로 '체력'과 '이동 속도'를 가지고 있고, '이동하기'나 '공격받기' 같은 공통 동작을 수행해요.

새로운 몬스터를 만들 때마다 똑같은 기초 코드를 처음부터 다시 작성한다면 시간도 오래 걸리고 실수로 오타를 낼 확률도 높아져요. 이때 공통 기능만 깔끔하게 모아둔 '기본 몬스터' 설계도를 먼저 하나 만들어 두면 모든 문제가 간단하게 해결돼요.

드래곤 설계도를 만들 때 기본 몬스터 설계도를 물려받으면, 기초 기능은 이미 완성된 상태로 시작해요. 개발자는 여기에 '불 뿜기'나 '하늘 날기'처럼 드래곤만의 독특한 기능만 덧붙이면 되죠. 이렇게 기존 설계를 그대로 물려받아 중복을 없애는 것이 코드의 재사용을 극대화하는 상속의 핵심 원리예요.

상속의 개념: 부모 클래스의 기능을 물려받고 새 기능을 추가하는 드래곤 자식 클래스 기본 몬스터 (부모) 체력 • 이동하기 상속 (기능 물려받기) 드래곤 (자식) 체력, 이동하기 (물려받음) + 불 뿜기 (새로운 기능)

물려받은 기능을 내 방식대로 바꾸기

부모에게 물려받은 물건을 내 몸에 맞게 고쳐 쓰듯, 상속받은 기능도 자식 설계도에서 새롭게 뜯어고칠 수 있어요. 프로그래밍에서는 이를 '메서드 오버라이딩(기능 재정의)'이라고 불러요.

예를 들어 기본 몬스터의 '이동하기' 기능이 뚜벅뚜벅 걷는 동작이었다고 해볼게요. 하지만 거대한 날개가 달린 드래곤이 땅바닥을 천천히 걸어 다니면 어색하겠죠?

이럴 때 상속받은 '이동하기'라는 명령 이름은 그대로 유지하면서, 실제 내용물만 날아다니는 움직임으로 덮어쓰기할 수 있어요. 명령하는 입장에선 어떤 몬스터든 똑같이 '이동해!'라고 시키면 되지만, 각 몬스터는 자신에게 맞게 재정의된 방식으로 개성 있게 움직이게 돼요.

조금 더 정확히 말하면: 무조건 물려받는 게 능사는 아니에요

조금 더 정확히 말하면, 상속이 언제나 정답인 것은 아니에요. 상속을 너무 깊고 복잡하게 사용하면, 부모 설계도의 작은 변화 하나 때문에 자식 설계도 수십 개가 줄줄이 망가지는 치명적인 문제가 발생할 수 있어요.

프로그래밍에서는 부모와 자식이 너무 단단히 얽혀 있어서 떼어내기 어려운 상태를 '결합도가 높다'고 표현해요. 부모 설계도가 바뀌면 자식 설계도까지 예측하기 힘든 영향을 받기 때문에, 나중에 코드를 고치기가 무척 까다로워져요.

그래서 최신 소프트웨어 설계에서는 무조건 상속을 쓰기보다, 필요한 기능 부품을 레고 블록처럼 가져다 끼워 넣는 조합(Composition) 방식을 더 추천하기도 해요. 상속은 'A는 B의 진짜 한 종류다'라는 관계가 확실할 때만 신중하게 써야 프로그램이 튼튼해져요.

🤔 흔한 오해

✕ 오해

상속을 많이 사용할수록 코드가 항상 깔끔해지고 훌륭한 프로그램이 된다.

✓ 사실

상속을 지나치게 겹쳐 쓰면 부모와 자식 간의 연결이 너무 끈끈해져요. 나중에 부모 코드를 조금만 수정해도 자식 프로그램들이 연쇄적으로 고장 나는 큰 문제가 생길 수 있어요.

🧺 일상에서 만나요

1 기본 캐릭터 설계도를 상속받아 마법사, 전사, 궁수 캐릭터를 만들 때 사용돼요.
2 기본 버튼 기능을 상속받아 클릭할 때 반짝이는 애니메이션 효과를 더한 특수 버튼을 만들 때 쓰여요.
💡 그러니까 한마디로

상속은 이미 만들어진 설계도의 기능과 속성을 물려받아 중복 없이 빠르고 안전하게 새로운 프로그램을 만드는 객체 지향 프로그래밍 기술이에요.