2018년 2월 5일
이번주 월요일에 나는 마이크로소프트 한국지사로 TIPS 10차시 수업을 들으러 갔습니다. 강사는 Tipssoft의 대표이사 김성엽 이사님 이십니다. 대표님은 마이크로소프트 C++프로그래밍 부문 MVP로 활동 하고 계십니다.
이번 수업에서는 C++처음부터 객체생성자까지 배웠습니다.
C++의 탄생
C언어는 c++언어의 부모와 같습니다. C++는 C언어와 조금은 다르게 프로그래머에게 이 길로 가라는 방향을 제시 합니다. 따라서 C언어공부가 어느정도 끝난상태에서 C++언어를 공부할 경우 시너지 효과가 일어나며 동시에 더 많은 부분에서 발전을 할 수 있을 것 입니다.
C++언어가 C와 가장 다른 부분은 객체라는 개념을 도입하였다는 점 입니다. 따라서 C와 가장 비슷한 언어이면서 프로그래밍에 대한 철학은 완전히 다른 새로운 패러다임이 제시 되어져있는 언어 입니다. 물론 C를 아주 잘한다면 이러한 것은 무시하고 C에서도 C++에서 할 수 있는 모든 것을 할 수 있지만 보통의 경우는 불가능 하기 때문에 이렇게 말 할 수 있습니다. C의 경우는 여러 함수를 조합해서 사용자가 원하는 기능을 만들어 내는 것 이라면, C++은 객체라는 개념을 통해 원하는 기능을 하나의 제품으로 만들어 놓는 방식입니다. 이는 객체의 개념이자, 프로그래밍의 기준이 됩니다.
클래스(class)
C++는 위에서 말한 객체를 정의하기위해 class라는 것을 사용합니다. 이는 C언어의 구조체(structure)과도 비슷하지만, class안에서는 함수를 정의할 수 있다는 점이 독특합니다. 우리는 이를 멤버함수라고 정의하고, 같은 클래스 안에있는 변수에 접근하거나 행동을 합니다. 구조체와 또 다른점은 접근 제한자 라는 개념을 사용하는 것입니다. 접근 제한자란 외부에서 클래스내부의 어떤 요소를 무슨 방식으로 접근할지에 대한 정보를 알려주는 것입니다. 접근 제한자는 크게 3가지로 나뉘는데, 아래와 같이 나뉩니다.
그렇다면 왜 멤버함수개념이 생겼을까??에 대한 의문을 하시게 될텐데요 모두 public으로 선헌 하면 될것인데 하면서 말이죠. 그 질문에 대한 답은 C++언어의 철학에 담겨져있습니다. 철저히 내부과정은 숨기고, 사용자에게 필요한 기능만 제공을 하기 위함이 그 답이죠, public클래스를 사용하게되면 그에 대한 변수를 사용자가 직접 설정해주게 됩니다. 그렇게 되면 예상치 못한 버그등이 생기게 되므로, 값만 넣으면 사용자가 원하는 것을 해주는 것입니다. 얼핏보면 사용자를 바보로 생각한다는 의미이기도 하구요. 접근 제한자를 생략하고 변수선언을 한다면 private가 자동 적용되니 이 점도 꼭 참고하세요.
오버로딩
C++는 문법과 함수의 더 다양한 표현을 위해 오버로딩(overloading)이라는 기술을 제공합니다. Overload의 뜻은 과적하다, 초과적재의 뜻을 가지고 있습니다. 그렇듯 C언어에서는 연산자, 함수이름 하나에 하나의 의미만 가지고 있습니다. 하지만 C++에서는 C언어의 규칙을 파괴하고 overload라는 기능을 통해 다른 기능을 가질 수 있게 하였습니다.
객체 생성자와 객체 파괴자
객체를 만듦과 동시에 객체는 사용할 준비가 되어야합니다. 그렇기 위해서는 몇몇 객체에는 초기화 과정이 필요합니다. 기준값을 설정해주는 과정이라고 이해할 수 있겠습니다. 개개체를 초기화 하는데는 여러가지 방법이 있습니다. 매뉴얼만 주는 방법, 매뉴얼을 주고 함수를 선언하라는 방법, 자동으로 초기화 하는방법등이 있습니다. 하지만 유저들은 절대로 초기화를 하지않을 것입니다. 안할걸 알기에 스트로스트롭(C++언어 제작자)은 조금 더 고생을 해서 자동으로 초기화 하는 방법을 선택했습니다. Init함수 같은 것을 별도로 이름짓지않고, 클래스안에 클래스 이름과 똑 같은 이름의 함수를 선언하면 바로 생성 되도록 설정 하였습니다. 이로써 프로그래머들은 유저들의 사용 문제점을 프로그래밍 선에서 해결할 수 있게 되었습니다. 또한 객체내부의 내용을 굳이 밝히지 않아도 되는 일석이조의 장점을 가지게 되었죠.
객체생성자가 있으면 파괴자도 있어야 겠죠?? 객체는 사용후에 파괴가 꼭 되어야 합니다. 보통 자신이 선언된 중괄호가 끝나면 변수도 사라지듯이 객체도 사라져야 하기 때문에 객체 파괴자가 필요합니다. 하지만 유저들은 파괴함수를 선언하지 않기 떄문에 위와 같은 이유로 객체파괴자또한 자동 생성되게 프로그래밍 되어있습니다. 파괴자함수의 이름은 ~(클래스이름) 으로 객체가 사용되는 함수 내부에 선언은 안되어있고, 숨겨져 있습니다. 이것을 강제로 호출한다해도, 그저 호출하는 것 일뿐 한번 더 파괴자가 직접 나타나서 파괴됩니다. 객체 파괴자는 생성자와 다르게 특정 형태를 취할 수 없습니다.(변수를 집어넣는등)