brunch

You can make anything
by writing

C.S.Lewis

by Moai Nov 07. 2020

 클래스 상속, 은닉화

객체지향의 꽃

C++ 언어로 초등학교 수준의 문제집(덧셈, 곱셈) 클래스를 구현했다.


우선 클래스 선언할 때 public 기호와 private 기호를 볼 수 있는데 이를 클래스의 은닉화 기능을 위해서이다. 귀찮다면 모두 public 아래에다가 작성해줘도 상관없다. 그런데 일반적으로 변수나 밖에서 호출되지 않고 클래스 내부에서만 사용된 함수는 private 아래에다가 작성해준다.


private 아래다가 작성한 변수나 함수는 main 함수에서 클래스로 객체를 만들었을 때 호출하거나 읽을 수 없다. 그렇다면 질문이 생길 것이다. 클래스 객체를 만들었는데 클래스에 속한 변수는 어떻게 읽나요? 이럴 때는 public 아래에다가 'get변수명'이라는 함수를 만들고 return으로 값을 돌려줘야 한다. 위에 getScore함수처럼 말이다. 아니 이럴 거면 public 아래에다가 작성해주지 왜 private에다가 작성해서 번거롭게 해줘야 할까?


클래스는 어떤 기능을 위한 변수와 함수의 집합이다. 어떤 기능을 위해 클래스 내 변수를 여러 함수가 참조하는데 개발자가 실수로 그 값을 바꿔버린다면 엄청난 문제를 불러일으킬 것이다. 절대로 클래스 내에 선언된 이 변수는 밖에서 건드릴 수 없도록 하고 클래스 내 함수들만 참조할 수 있도록 하고 싶을 때 private 아래에다가 선언해주면 된다. 참고로 파이썬에서는 private가 존재하지 않고 모두 public이다.


다시 코드로 돌아가서 개정판 문제집(뺄셈 추가) 클래스를 추가로 구현해야 한다면 위의 코드를 그대로 복사해서 추가해서 작성해야 할까? 그럴 필요 없다. 상속을 이용하면 된다.

상속은 기존의 클래스에 무언가를 추가하거나, 변경하고자 할 때 사용된다.


위 클래스에 뺄셈 함수를 넣고 스코어를 반환할 때 *10 해서 반환하는 클래스를 만들어보자

우선 상속 후 score 변수를 다시 사용하고 싶다면 private가 아닌 protected로 변경해줘야 한다. 그 이유는 private로 하면 현재 클래스에서만 사용 가능하고 상속받으면 사용이 불가능하기 때문이다.


이후 클래스를 선언할 때 : 기호를 이용한 뒤 상속받으려는 클래스명을 적어주면 된다.

그리고 원래 클래스에서 내가 필요로 하는 부분만 다시 작성해주거나 추가해준다.


이후 메인 함수는 그대로 사용해주면 된다.


어찌 보면 쉽고 어찌 보면 어렵다. 어렵다면 아직 클래스에 익숙하지 않기 때문일 것이다.




매거진의 이전글 C++ 포인터
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari