본문 바로가기
유희지왕/개발단상

[C++] 자바 프로그래머를 위한 권고 사항 - 바야네스트롭스트룹

by 하늘의흐름 2017. 8. 9.
반응형

1.7.4 자바 프로그래머를 위한 권고 사항


 C++와 자바는 유사한 문법을 가졌지만 꽤나 다른 언어다. 이 둘의 목적은 상당히 다르며, 그들의 응용 역시 상당 부분 다르다. 후계자란 단어를 전임자와 똑같은 일을 더 잘할 수 있고 추가로 더 많은 것을 할 수 있는 의미로 본다면 자바는 C++의 직접적인 후게자라고 볼 수 없다. C++를 잘 활용하기 위해서는 C++로 자바를 짜려고 노력할 것이 아니라 C++에 적합한 프로그래밍과 설계기법을 채택해야 한다. 이는 가비지 컬렉터가 존재하리란 보장이 없기 때문에 new로 생성한 객체를 반드시 delete해야 하는 것을 잊지 말아야 한다는 이슈 같은 것만은 아니다.

 

[1] C++로 자바 스타일을 단순 흉내내지 말기 바란다. 그렇게 하면 유지 보수성과 성능 측면에서 상당히 좋지 않은 경우가 많다.

[2] C++ 추상화 매커니즘(클래스와 템플릿 등)을 이용한다. 낯설다는 느낌이 들어서 C 프로그래밍 스타일로 후퇴하면 안 된다.

[3] C++ 표준 라이브러리를 새로운 기법과 프로그래밍 스타일의 표본으로 활용하기 바란다.

[4] 자신의 모든 클래스에 대한 고유의 기본 클래스(object 클래스)를 즉흥적으로 만들지 않는다. 대개는 그것이 없어도 대부분 상당수 클래스에 잘 대처할 수 있다.

[5] 참조자와 포인터 변수의 활용을 최소화한다. 지역 변수와 맴버 변수로 활용한다. (3.2.1절, 5.2절, 16.3.4절, 17.1절)

[6] 변수는 암시적으로 참조자가 될 수 없다는 점을 명심한다.

[7] 포인터를 C++에서 자바 참조자와 같은 것이라고 생각한다. (C++의 참조자는 좀 더 제한적이다.)

[8] 함수는 자동으로 virtual이 되지는 않는다. 모든 클래스가 상속되지는 않는다. 

[9] 추상 클래스를 클래스 계층 구조에 대한 인터페이스로 활용한다. '불확실한 기본 클래스', 즉 데이터 맴버를 가진 기본 클래스는 사용하지 않는다.

[10] 가능한 경우에는 언제나 유효 범위를 가진 자원 관리를 사용한다.

("자원 획득은 초기화다 RAII, Resource Acquisition is Initializtaion")

[11] 생성자를 이용해서 클래스 불변속성을 극복한다 (그리고 그렇게 할 수 없다면 예외를 던진다)

[12] 객체가 소멸될 때(예를 들어 유효 범위를 벗어날 때) 정리 작업이 필요하다면 해당하는 소멸자를 이용한다. finally를 흉내 내지 않는다. (그렇게 하는 건 더 즉흥적이고, 결국에는 소멸자를 이용할 때보다 휠씬 더 많은 손이 갈 것이다.)

[13] '무방비'로 new와 delete를 사용하지 않는다. 대신, 컨테이너(vector, string, map 등)와 핸들 클래스(lock과 unique_ptr 등)를 이용한다.

[14] 자립적인 함수(맴버가 아닌 함수)를 이용하고, 네임스페이스(2.4.2절, 14장)를 이용해서 자립적인 함수의 유효 범위를 제한한다.]

[15] 예외 지정을 사용하지 않는다. (noexception를 제외하고, 13.5.1.1절)

[16] C++ 중첩 클래스는 자신을 포함하고 있는 클래스의 객체에 접근하지 못한다.

[17] C++ dynamic_cast와 typeid(22장)로 가장 최소한의 런타임 리플렉션 run-time reflection만을 제공한다. 컴파일 타임 기능에 좀 더 많이 의존한다 (예를 들어 컴파일 타임 다형성, 27장, 20장) 이런 충고 대부분은 C# 프로그래머에게도 똑같이 적용된다. 


-<The C++ Programming language fourth edition> 44~45p


반응형

댓글