디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

C++ 초보를 위한 강좌. 5. 까막눈 뜨기는 이름이 어딘지 아는것 부터

codesafer갤로그로 이동합니다. 2016.10.13 18:56:52
조회 1644 추천 12 댓글 21

보통 초보들이 제법 구조를 갖춘 소스코드들을 보면서 당황하게 되는 것이,

난생 처음 보는 장황한 이름들에 당혹감을 느끼기 때문일듯 하다.

어디까지가 이름인지 어디까지가 연산인지도 구별하기 힘들지도.

그래서 까막눈을 트이게 해 주기 위해 먼저 코드 읽는 법을 설명해 주려 한다.

그러기 위해선 "왜? 이렇게 표기해야 하는가" 또한 설명되어야 겠지.



함수의 다형성 ( Polymorphism )

이름은 거창하지만 함수의 이름에 대한 재사용성을 높이기 위한 것이다.


1.  이게 없던 시절엔 이렇게 코딩해야 했다.

    print_char( char )

    print_int( int )


동어 반복아닌가? 이런건 좋지 않다.


2.  다형성이 지원되고 부터 다음의 표현이 가능해졌다.

    print( char )

    print( int )


같은 이름으로 함수를 불러도 전달한 인자의 타입에 따라 어떤 함수가 실행될지 결정 되는 것.

굿~


사실 별거 없고

컴파일러가 내부적으로 만들어 내는 함수의 이름에 인자의 타입의 접미사를 자동으로 붙여준다고 생각하면 된다.

( 즉 내부적으론 1의 예시대로 만들어지는 셈 )


하지만 리턴타입으로는 구별이 되지 않는다. 때때로 아쉽지만 때때로 편하다.



namespace

폴더 개념을 떠올리면 된다.

같은 이름을 가진 파일이 같은 폴더에 두 개 이상 존재할 수 없는 것 처럼,

충돌을 피하기 위해서는 이름을 바꾸든 다른 폴더에 배치하는 방법 밖에 없는데,

여러개의 이름을 바꾸려면 당연히 불편하다. ( 폴더를 만들고 집어 넣어버리는게 상책 )


이럴 때 그냥 namespace 로 싸 주면된다.


가령 어떤 똘똘한 프갤 루키가 코세에게 알고리즘 성능 최적화로 도전을 했다 치자.

두 사람이 구현한 strlen 함수 따위가 공교롭게도 이름이 겹친다.


namespace cose

{

    std::size_t strlen( const char* str )

    {

    ...

    }

};


namespace rookie

{

    std::size_t strlen( const char* str )

    {

    ...

    }

};


이렇게 해주면 C-Library 에 내장된 strlen 과 다음과 같이 구별된다.

( 앞으로 그냥 clib 라고 부르겠다 )


strlen( str );         // clib 의 strlen 을 호출

cose::strlen( str );   // 설명 안해도 알겠쥬?

rookie::strlen( str );


여기서 :: 를 scope 연산자 라고 부른다. 파일의 경로를 나눌 때 사용하는 / 랑 같은 의미다.

도스 콘솔창에서 파일을 복사하고 실행하고 하는 작업을 해보면,

매번 경로명을 다 붙이는게 불편해서 현재 경로를 이동시키고 싶을 때가 있고,

그냥 path 를 지정해서 지정된 디렉토리에서 자동으로 찾고 싶을 때가 있다.

그런 용도로 사용하는 것은


using namespace cose; 같은 표현이다.


단 이경우 strlen 이 이미 존재하기 때문에

strlen 과 cose::strlen 중 어느것을 호출하고 싶은건지 의도를 알 수 없다.

strlen 을 호출하기 위해서는 ::strlen 이라고 명시할 수 있고 ( 부모 폴더를 가리키는 셈 )

cose::strlen 을 호출하고 싶다면 어쩔 수 없이 풀네임을 불러줘야 한다.


똑같은 함수나 이름들이 가장 많이 사용되는 경우가 무엇일까?

바로 버전별로 코드를 유지해야 할 경우나, 비교가 필요한 테스트 / 최적화 등의 경우다.

namespace 를 활용해 버전관리를 편하게 해주기 위한 문법이 추가되었으니 관심 있으면 찾아보기 바란다.

( 뭐 딱히 편하진 않더라 )


구조체, 클래스, 공용체 들도 결국 폴더명을 지정하는 것과 같은 이름 형식을 갖는다.

그래서 어떻게 보면 namespace 가 특별한 기능없는 구조체들 처럼 보일수도 있다.

하지만 구조체 따위와 달리, 언제 어느때고 원하는 폴더에 코드를 밀어 넣을 수 있다는 것이 장점.


namespace A

{

    ...

};


namesapce B

{

    ...

};


namespace A

{

    ...

};


위와 같이 표현될 수 있다는 것이다.


이게 왜 장점이냐고?

가끔 무거운 헤더파일을 다른 헤더파일에 집어 넣는게 낭비처럼 여겨질 때가 있다.

어차피 구체적인 정의는 뒷단에서 이루어지고 namespace 가 정의된 객체의

포인터 정도 갖고 있으면 되는 경우,

포인터 타입이야 32비트에서 4바이트 64비트에서 8바이트 고정이 아닌가?

실제 내부가 사용될 때 말곤 그냥 4바이트나 8바이트 자료형으로 접근하면 되는데

내부를 꼭 알아야 할 필요는 없잖아?

그럴때 헤더파일을 포함시키지 않고 다음 처럼 쓸 수 있다.


namespace some_path

{

}; // 빈 껍데기만 선언 ( 컴파일러한테 걍 이런게 있어~ 자세히 알려고 하지마 라고 말해주는 거임 )


class ...

{

    some_path::some_class*           hehe;

    ...

};


프로젝트가 커지면 컴파일 속도를 최적화 하기 위해 여러가지 테크닉이 필요하다.

컴파일 시간이 몇 분 걸리면 당연히 개발 소요시간이 늘어나고 테스트 비용이 증가한다.

그런 이유에서도 아무곳에서나 동일한 이름으로 추가 선언될 수 있는 namespace 의 문법이 유용하다고 한 것이지~


다음 시간엔 template 과 class 의 문법에 대해 구체적으로 알아보겠다.

추천 비추천

12

고정닉 0

5

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 며느리, 사위되면 시댁, 처가에 잘할 것 같은 스타 운영자 25/10/13 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47947 65
2896554 엠마❤+트젠 [5] ♥덩냥이♥갤로그로 이동합니다. 09:33 27 0
2896553 맞네 캄보디아로 시끄러운거 보니 이거 생각나네 ㅇㅇ갤로그로 이동합니다. 09:14 28 0
2896552 난 직장이랑 집이 가까워서 [2] 루도그담당(211.184) 09:03 29 0
2896551 난 소비쿠폰 의미 없다고 생각해..ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 08:50 26 0
2896550 요즘 국비 신입 연봉 얼마정도 줘야됨? [1] 프갤러(118.235) 08:49 25 0
2896549 빨간 대가리..ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 08:45 23 0
2896548 지하철 탈때마다 창년소리 뭐냐? [2] 헬마스터갤로그로 이동합니다. 08:44 39 0
2896547 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:42 12 0
2896545 하루 한 번 헤르미온느 찬양 (마지막) 헤르 미온느갤로그로 이동합니다. 08:40 12 0
2896543 내 겜순이 여친인데 어떠니 ㅇㅇ갤로그로 이동합니다. 08:09 24 0
2896542 내 겜순이 여친인데 어떠니 ㅇㅇ갤로그로 이동합니다. 08:09 22 0
2896540 자동 로그인이 되는 남자 모니터 세션에 따라 드라이버 쇼트가 키 열거형 넥도리아2024(220.74) 07:27 16 0
2896539 생각해보니 앱히키.. 캄보디아 간거 아녀??? 프갤러(39.7) 07:24 22 0
2896538 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 07:23 24 0
2896537 Make Korea Great Again ! ♥덩냥이♥갤로그로 이동합니다. 07:11 16 0
2896536 강간 성범죄자 엌ㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅇㅇ(118.235) 06:02 44 0
2896535 그냥 써야되지 근데 컵에다가 케찹 스파게티 끓여서 넣으니 맛있네... 넥도리아(220.74) 05:52 39 0
2896534 모모 닮은듯? ♥덩냥이♥갤로그로 이동합니다. 04:34 19 0
2896533 에로미온느 ㅋㅅㅋ ♥덩냥이♥갤로그로 이동합니다. 04:24 24 0
2896532 여름모기보다 가을모기가 쌔.. 쌔당 ! ♥덩냥이♥갤로그로 이동합니다. 04:22 19 0
2896531 요즘 모기는 물리면 시간차 공격들어오는듯? ♥덩냥이♥갤로그로 이동합니다. 04:12 46 0
2896530 가을 모기 왤케 쎄냥.. ♥덩냥이♥갤로그로 이동합니다. 04:07 20 0
2896528 먼가 플머의 행동습성중에 수집본능이 있는거같지 않음? [1] 공기역학갤로그로 이동합니다. 03:49 24 0
2896526 심리공작원같아서 댓글 다니 삭제된 글 발명도둑잡기(118.216) 03:46 49 0
2896524 음기 충전 발명도둑잡기(118.216) 03:25 47 0
2896520 화폐 발행의 독점적 성격에 대해 명시한 연구 발명도둑잡기(118.216) 03:05 25 0
2896519 외노자의 수제번역, あたらよ - 10月は無口な君を忘れる。 프로외노자갤로그로 이동합니다. 02:54 20 0
2896518 외노자의 수제번역, やなぎなぎ - 約束をしよう 프로외노자갤로그로 이동합니다. 02:54 22 0
2896516 외노자의 수제번역, 貴方の夜が明けるまで [1] 프로외노자갤로그로 이동합니다. 02:43 21 0
2896515 입법부가 행정부, 사법부 부패 감시하는 것은 고유임무이자 권한 발명도둑잡기(118.216) 02:13 13 0
2896512 수년 전에 역학 갤러리 모니터링 할 때 내가 관심있던 여성 [2] 발명도둑잡기(118.216) 01:56 34 0
2896511 진보당과 당 근처에 경기동부연합이란 조직이 아예 없는데 언론이 [1] 발명도둑잡기(118.216) 01:49 30 0
2896510 AI 뭔가 항상 느끼지만 애니메이션 로직은 영 구현 못하네 ㅆㅇㅆ(124.216) 01:44 31 0
2896509 Ada에서의 객체(Object)란 무엇인가? 나르시갤로그로 이동합니다. 01:37 27 0
2896508 MS 보안 빡세네... 이거 핸드폰 못 팔겠네.... ㅠㅠㅠ 넥도리아2025(220.74) 01:33 26 0
2896500 캄보디아 대포통장 살인사건은 은행 책임도 있다 발명도둑잡기(118.216) 01:18 26 0
2896488 후스넘버 허위 내리는법 (106.102) 00:56 35 0
2896485 캄보디아 이거 진짜 무섭네 [4] 노력갤로그로 이동합니다. 00:54 87 0
2896484 ( ㅇ ㅅ ㅇ )a [1] 노력갤로그로 이동합니다. 00:54 64 0
2896483 냥덩아 발명도둑잡기(118.216) 00:53 22 0
2896482 지듣노 발명도둑잡기(118.216) 00:44 15 0
2896480 나르시 에이다 빠는거 보니까 예전에 클로저 빠는 아재 있었는데 [2] 박민준갤로그로 이동합니다. 00:35 51 0
2896478 패턴 매칭(Rust) vs. 직접 접근(Ada): 공정한 비교 나르시갤로그로 이동합니다. 00:30 21 0
2896477 제미니의 편향: Ada는 상대적으로 복잡한 것처럼 서술했네 ㅎㅎ 나르시갤로그로 이동합니다. 00:29 19 0
2896475 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 00:28 17 0
2896473 인터넷에서 싸우지 마라 [2] 박민준갤로그로 이동합니다. 00:26 59 0
2896472 "대통령님, '소비쿠폰' 저도 할 말 있습니다" 발명도둑잡기(118.216) 00:26 30 0
2896471 제미니의 러스트 편향성: Addr.Addr_V4'Image 이거 아니잖 나르시갤로그로 이동합니다. 00:25 21 0
2896469 와.. 일본은 브라질 이겻넹 ㄷㅅㄷ ♥덩냥이♥갤로그로 이동합니다. 00:23 25 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2