교재 516페이지에 있는 string_pointer.c 예제를 보면,
printf("%s\n", s1); // Hello
Hello 가 나오는 이유를 모르겠습니다. 포인터 변수 s1에는 메모리상에서 문자열 Hello가 저장된 공간의 주소값이 담겨있는데, printf를 사용해서 %s 서식 지정자로 문자열을 출력한다는 발상 자체가 이해가 안갑니다.
printf("%p", s1); // 이 문장은 포인터 변수 s1에 담겨있는 값, 즉 s1은 가리키는 대상의 주소값을 담고있는 변수이므로, 그 주소값을 %p 형태로(주소 형태로) 출력하라는 문장이니 이해가 갑니다.
그런데, printf("%s\n", s1); // 이 문장은 도대체가 이해가 안갑니다. 변수 s1에 담겨있는 값은 애초에 주소값인데, 왜 그 주소값을 %s 지정자로 문자열 형태로 출력하라는 건지도 이해가 안가고 또 그 결과값으로 문자열 "Hello"가 출력되는지도 이해가 안갑니다. 그냥 "변수 s1이 가리키는 대상에 들어있는 값(문자열 Hello)를 %s(문자열) 형태로 출력하라" 라고 이해하면 되나요? 그 원리가 궁금합니다...
C 언어는 문자열을
char *s1 = "Hello";
이렇게 선언하고 쓴다.
출력은 %s로 한다.
printf("%s\n", s1);
이렇게 외우면 끝입니다.
더 깊이 외우고 말고 할 것도 없고, 이해할 것도 없습니다.
일단은 문법이나 외워서 열심히 잘 쓰면 됩니다.
프랑스 여행 가서 현지 인사한다면 봉주르 하면 그만이고, 그게 철자가 무엇인지, 각 철자의 발음 규칙은 무엇인지, 그런 건 언어학자나 하라고 하면 됩니다.
프로그래밍에도 그런 게 있나요? <프로그래밍 언어론>이라고 있습니다.
컴퓨터 공학 전공 과목이고, 인터넷에서 무료로 수강할 수 있습니다.
<프로그래밍 언어론>을 전공으로 삼아서 석사, 박사과정으로 진학하시면 프로그래밍 언어를 설계하거나 컴파일러를 만들거나 분석하겠지요.
자전거는 탈 줄 알면 그만입니다. 자이로스코프 원리, 캐스터 앵글을 수식으로 써 가면서 왜 자전거는 넘어지지 않는가?를 설명하는 건 공학자나 하면 됩니다.
C 언어는 문자열 타입이 없고, char* 포인터로 문자열을 저장한 메모리 위치를 가리킬 뿐입니다.
char는 문자이고, char*은 문자열입니다.
물론, char*은 pointer to char이니 '문자'만 있는 위치를 가리킬 수도 있습니다. 대신 그런 건 %c인지 %s인지에 따라 프로그래머가 알아서 잘 가려서 쓰라가 C 언어의 기본 방침입니다.
자바의 기본 방침은 프로그래머도 인간이고, 인간은 멍청하니까 포인터 쓰지 마. 포인터 쓸 줄 아는 애들 없더만 하고 포인터를 없앴습니다.
char *을 문자열로 썼는데 그거 대신 String 타입 줄게, 이걸로 문자열 써...
그냥 문법만 잘 외우고, 원하는 코드 잘 작성할 수 있으면 됩니다.
안녕하세요 출력하고 싶으면
char *msg = "안녕하세요";
printf("%s\n", msg);
이렇게 작성하면 된다. 여기까지 학습하면 됩니다.
더 깊이 알고 싶으면 <프로그래밍 언어론> 수강하시면 됩니다만, 전공자가 비전공자 씹을 때 외에는 쓸 일이 많지 않을 겁니다(프롤로그, 알골, 포트란, C, C++, Java, 스몰토크, 리스프를 동시에 쓰고, 구구단을 출력하는 프로그램을 10가지 언어로 작성해오세요. 라는 과제를 받았다면 <프로그래밍 언어론>을 수강 중인 거 맞습니다). 그러나 앞으로 40년 동안 프로그래밍을 해도 스몰토크, 리스프, 하스켈 등의 언어로 실무를 할지는 모르겠습니다.
메모리 동작을 이해하고 싶습니다. 네, <컴퓨터 구조론> 수강하세요. kocw.net에서 검색하면 대학 강의 그대로 다 올라와 있습니다.
숫자 3은 컴퓨터 비트로 어떻게 저장되는지, -3은 컴퓨터 비트로 2의 보수로 어떻게 저장되는지 공부할 수 있습니다.
-3.14는 비트로 어떻게 표현하는지 2진수 비트로 계산하여 문제를 풀고 있다면 제대로 <컴퓨터 구조론>을 듣고 있는 겁니다.
그러나 자동차 공학을 연구해서 자동차 엔진을 만들 게 아니므로 핸들을 오른쪽으로 돌리면 오른쪽으로 차가 간다는 사실만 알면 됩니다.
double pi = 3.14;
이렇게 쓸 줄만 알면 됩니다. 실수는 double 타입을 사용하면 된다. 이것만 알면 됩니다.
걱정하지 마세요. 전공자도 -3.14를 2진수로 어떻게 표현하는지 시험 기간에만 기억하고 까먹었으니까요.
초등학생도 pi = 3.14라고 저장하고 잘 코딩합니다.
과거 C 언어 입문서는 하드웨어 개발이 많아서 하드웨어, 컴퓨터 구조 지식을 입문서에 넣어서 설명하는 안 좋은 습성이 있습니다.
직업 진로가 임베디드 하드웨어 개발자가 아니면 안 하는 게 좋습니다.
10년차 프로그래머 100명 뽑아서 -3.14를 비트로 바로 표현해주세요. 5분 이내에 못 풀고 탈락할 사람이 90명은 될 겁니다. 다시 전공 교과서 보고 인터넷 검색해서 이해하고, 옛날 기억을 복원해서 풀어낼 사람이야 많겠지만, 30분은 걸리겠죠. 5분 이내에는 못할 텐데요.
하물며 이제 입문하는 사람은 문법만 익히고 제대로 코딩만 할 줄 알면 됩니다. 그것만 익히기도 바쁩니다.