오늘 공부할 내용은 객체와 클래스야 키보드를 가지고 설명할 거니까 어디 한번 들어나 보시라구요
일단 객체란 무엇이냐. 영어로는 object, 넓게 보면 세상 모든 사물이 객체야. 나도 객체고 우리집 고양이도 객체고 내 키보드도 객체지. 다들 각자 고유한 특성과 행동이 있어. 나는 말을 하고 고양이는 털갈이를 하고 키보드는 wasd를 눌러. 자바에서는 이 개념이 프로그램에 적용된다는 거야.
잠깐 빠져나와서 캡슐화라는 것도 알아보자. 캡슐약 알지? 먹으면 왠지 목에 걸린 것만 같은 그 약의 속을 까본 사람들도 아마 있을 거야. 캡슐약에 캡슐은 안에 있는 약을 담아두기 위해 있어. 그게 있는 한 우리는 캡슐약 안에 약가루가 들었는지 밀가루가 들었는지 알 수 없어. 그리고 가루가 수분과 닿아 변질되는 것도 막아주지. 이런 식으로 외부와 단절된 ‘커버’를 만들어 씌우는 게 캡슐화야. 키보드를 쓸 때는 자판을 누르지 그 안에 어떤 부품이 있는지 굳이 신경쓰지 않잖아. 키보드가 하나의 객체고 자판이 그 객체를 감싼 캡슐이 될 수 있어.
이건 좀 다른 얘기이긴 한데 나는 저 캡슐화가 추상화랑도 연관이 있다고 생각해. 추상화는 복잡한 것을 단순하게 보이게 만드는 거야. 게임이 어떤 소스코드로 만들어졌는지는 개발자만 알면 되고 플레이어는 내 캐릭터만 잘 움직이면 그만이잖아? 이럴 때 플레이어를 위해 소스코드는 보이지 않고, 게임의 화면이 보이고 조작도 쉽게 할 수 있도록 하는 게 추상화야. w를 누르면 앞으로 간다, 라고 하는 건 플레이어에게 보이는 추상화된 프로그램이고 개발자는 이걸 코드로 써둔 거지. 잘 전달이 됐을까 모르겠네 이건 원래 설명하려던 내용은 아니니까 여기서 끊자.
지금까지 객체와 캡슐화(+추상화)에 대해 설명했어. 이번엔 클래스에 대해 말할 거야.
클래스는 객체의 모양을 정한 틀이야. 키보드가 키보드 모양인 건 만드는 사람이 그렇게 정하고 틀을 만든 거지? 키보드의 틀(클래스)대로 만들어진 실제 상품이 키보드(객체)인 거야. 자바에서는 여기에 ‘필드‘와 ‘메소드‘라는 것이 들어가는데, 이건 각각 키보드 자판 하나하나의 이름과 그 자판들로 누르는 단축키가 수행하는 기능이라고 생각하면 돼. 예를 들어, 엔터키는 게임에서 주로 확인키로 사용되지? Enter라는 이름이 필드고 이걸 눌렀을 때 확인키로 작동하는 게 메소드야. 메소드는 파이썬이나 C++에서는 함수라고 불러. 난 파이썬을 가장 먼저 배워서 함수라는 말이 더 이해하기 쉬웠어.
여기서 다시 캡슐화가 등장해. 키보드에 키캡이 다 끼워진 상태에서는 내부를 볼 수 없고 손 댈 수도 없지? 이 키캡이 키보드의 캡슐화인 거야. 키캡은 사용자가 직접 분해할 수 있지만 이건 예시이고 비유일 뿐이니까 거기까지는 생각하지 말자.
사실 내가 공부한 객체와 클래스에 대한 설명은 이게 끝이야. 근데 아직 공부할 게 남아서 조금만 더 설명할게. 이번엔 상속이라는 거야. 어렵지 않으니까 봐봐.
상속은 <상속자들>의 그 상속이야. 사전적 정의는 그렇다고. 어떤 방식인지 설명하기 전에, 생물의 분류에 대해서는 알고 있어? ‘동물 >> 포유류 >> 사람’ 이런 분류 말이야. 상속은 이렇게 연결되는 여러 개체 사이에서 적용되는 거야. 저 예시로 설명해볼게.
(1) 동물은 종속영양생물*이야. 뜻은 몰라도 되고(각주 추가했어) 동물이 갖는 특징이라고만 생각하면 돼. (2) 포유류는 새끼에게 젖을 먹이는 동물이야. (3) 사람은 언어를 사용해. 이 세 가지 사실(1 ~ 3)을 놓고 상속관계를 생각해보자. 일단 동물이 이 중에서 가장 큰 범주에 있지? 그러니까 동물은 나머지 둘보다 상위 개체야. 포유류는 “동물이고 포유류”인 거니까 동물의 특성도 함께 가져. 이때 포유류가 동물의 하위 개체야. 하위 개체는 상위 개체의 특성도 모두 가져. 하지만 사람에 대해서는 상위 개체가 되기 때문에 사람의 특성은 갖지 않아. 사람은 셋 중 가장 하위에 있는 개체야. 그러므로 내가 서술한 세 가지 특성을 모두 가져. 이렇게 특성이 위에서 아래로 내려가는 걸 상속이라고 하는 거야. 자바에서도 클래스로 이런 관계를 구현할 수 있어.
다형성까지만 설명하고 끝낼게. 사람이라고 해서 모든 사람이 똑같지는 않지? ‘사람’이라는 클래스에 속하면서도 각자 가진 이름이 다르고 할 수 있는 것도 다를 거야. 홍길동과 고길동이라는 사람에 대해 생각해보자. 홍길동은 ‘사람’ 클래스에 속하고 아마도 조선시대의 한국어를 했겠지? 이 ‘한국어‘가 홍길동이 갖는 메소드이고 그 구현 방식은 ver.조선시대라고 할 수 있어. 고길동은 ‘사람’ 클래스에 속하고 현대의 ‘한국어‘를 해. 고길동도 ‘한국어’라는 메소드를 갖지만 구현은 ver.현대로 된 거야. 여기서 메소드는 똑같이 ‘한국어’인데 그게 조선시대 말과 현대의 말로 다르게 구현된 게 다형성이야. 같은 메소드가 클래스나 객체에 따라 다르게 작동하고 나타나는 거야. 내가 설명할 수 있는 건 여기까지. 남은 공부 하러 갈게… 다음 기회에 또 보자구요.
* 종속영양생물 : 스스로 영양소를 만들지 못하고 외부로부터 흡수하는 생물
참고문헌
- 황기태, 명품 자바 에센셜, 경기: 생능출판사, 2014.
교수님보다 잘 가르쳐 관심 있고 돈도 있으면 사봐
사담 : 설명을 약간 수정하고 다듬었음. 내가 요새 또 자바가 많이 어려워서.. 이거라도 봐야겠더라고..
원본 : 내 트위터(삭제됨)
https://twitter.com/dapin1490/status/1448508851108544515?s=20