기글 하드웨어 질문 게시판
각종 질문을 올릴 수 있는 곳입니다. 먼저 검색해 보고 질문을 올리는 것이 더 효율적입니다. 충분한 정보와 예의를 갖춰 글을 작성해 주시고 문제가 해결되면 꼭 댓글을 달아 주세요.
제목을 어떻게 지어야 할 지 모르겠는데... 현재 학부생으로 1학년에서 C++의 기초를 배웠습니다.
보통 인터넷 블로그들에서 C++을 가르친다! 하는 그런 문서들은 대부분 알고있는 내용이더라구요.
근데 분명 이게 끝은 아닐거란 말이에요. 그래서 더 알아보고는 싶은데... C++을 검색해도 기초만 나오거나 그렇네요..
물론 지금도 C++의 기초를 완벽하게 아는건 아니지만 (포인터, &d 와 같은걸 잘 활용하지 못합니다) 그래도 이 뒤의 내용을 배우고 싶은 욕구가 되게 큽니다.
자바, 파이썬을 손대봤는데... 묘하게 C++만큼의 만족감을 주지 못한 것 도 한 몫 하는 것 같아요.
그래서 이 다음 공부를 어떻게 해야하나 하고 올려봅니다 (...)
2016.04.28 08:29:43
http://codingdojang.com/ 이런 거나 http://www.jungol.co.kr/ 이런 거, 혹은 http://euler.synap.co.kr/ 이런 거 풀어보시면서 내공을 기르시는 건 어떠신가요?
2016.04.29 06:41:08
Cpp stl에선 C++ Standard lIbrary 라는 책이 가장 유명합니다. 우리나라에도 번역판이 있고 더 싸던데 사실 가격빼고는 메리트가 없으니(번역 질이 안 좋습니다...) 왠만하면 원판을 보는게 더 좋을 것 같더라구요.
Opengl이나 dx 공부하기전에 배워야할 건 사실 C말곤 딱히 없어요. 수학을 잘 해야 한다는데 쓰다보면 이해가 되게 되어있고... 아마 win32나 다른 운영체제 api 같은걸 알아두는 건 나쁘지 않을 것 같아요.(특히 dx 같은 경우) 언제까지나 glfw같은 걸 사용할 수는 없으니까요...
2016.04.28 18:54:24
C++ 에 크나큰 만족감을 느끼셨다면 Rust 를...
C++ 의 정의되지 않는 사항들을 모두 없애는 것을 추구해서 programming style 의 변형을 요구하지만 C++ 의 power 를 모두 갖추고 있다고 말할 수 있거든요.
Pointer 의 끝판왕을 느낄 수 있습니다.
C++ 의 정의되지 않는 사항들을 모두 없애는 것을 추구해서 programming style 의 변형을 요구하지만 C++ 의 power 를 모두 갖추고 있다고 말할 수 있거든요.
Pointer 의 끝판왕을 느낄 수 있습니다.
2016.04.28 20:45:00
Rust 사용자들이 까는 Google 의 Go 언어도 국내 발간 도서도 있고, 국내 기업 (특히 게임회사) 에서 사용하고 있는 사례들이 있는데 Rust 는 미비하죠. 무슨 뜻이냐하면 국내 사용자 그룹들이 워낙 geek 들이라는 점을 유의해야 하고, 국내 자료 찾는게 쉽지 않을 수 있다는 점을 극복할 수 있다면 문제없다고 봅니다. 사실 Rust 공식 문서는 매우 훌륭합니다. Rust 개발진들이 문서화를 대단히 중요하게 생각했다고 하더군요.
원래 처음 배우는 언어들은 기존 언어 사용 경험이 오히려 방해가 될 때가 많습니다.
원래 처음 배우는 언어들은 기존 언어 사용 경험이 오히려 방해가 될 때가 많습니다.
2016.04.28 20:52:48
C/C++ 를 사용하면서 정의되지 않는 부분을 만나게 하는 부분이 많은 경우 pointer 입니다. 따라서 말씀하신 방식은 문제가 일어날 소지를 줄이는 좋은 습관일 수 있습니다. 구체적으로는 보지 않아서 모르겠지만요.
Rust 의 pointer 는 C/C++ 의 그런 정의되지 않는 부분을 없애도록 pointer 를 잘 다듬어 놓은 것입니다. 그러다보니 pointer 를 세가지로 분류하고, 상황에 맞춰 선택해서 쓰도록 하고 있습니다. 상황에 맞지 않으면 compilation 오류가 발생해서 미연에 사고를 방지하죠. 그리고 그 사용방식도 약간 독특해서 답답하게 느껴질 수 있기에 pointer 의 끝판왕이라고 말씀드린 겁니다. Pointer 가 존재하는 이유는 분명히 있으니 그걸 제대로 익힐려고 한다면 Rust 를 사용해보는게 좋다고 생각하시면 됩니다. 참고로 저는 C++ STL 의 반복자를 사용하면서 C 의 pointer 가 배열 횡단에도 사용되어서 너무 저수준 접근을 하게 되고, 혼란과 실수를 유발한다고 판단했습니다. 반복자는 container 의 횡단기법에서 pointer 사용을 분리한 좋은 새로운 개념이라고 생각한거죠. Go 언어도 그런 생각에 동의해서 pointer 는 좋지만 pointer 산술연산은 좋지 않다고 판단하여 pointer 산술연산을 없앴습니다.
VS 가 좋다고 생각하신 거라면 C# 을 추천합니다. VS 의 C# 지원능력에 비하면 C++ 는 아쉽기 그지없을 정도이거든요.
Rust 의 pointer 는 C/C++ 의 그런 정의되지 않는 부분을 없애도록 pointer 를 잘 다듬어 놓은 것입니다. 그러다보니 pointer 를 세가지로 분류하고, 상황에 맞춰 선택해서 쓰도록 하고 있습니다. 상황에 맞지 않으면 compilation 오류가 발생해서 미연에 사고를 방지하죠. 그리고 그 사용방식도 약간 독특해서 답답하게 느껴질 수 있기에 pointer 의 끝판왕이라고 말씀드린 겁니다. Pointer 가 존재하는 이유는 분명히 있으니 그걸 제대로 익힐려고 한다면 Rust 를 사용해보는게 좋다고 생각하시면 됩니다. 참고로 저는 C++ STL 의 반복자를 사용하면서 C 의 pointer 가 배열 횡단에도 사용되어서 너무 저수준 접근을 하게 되고, 혼란과 실수를 유발한다고 판단했습니다. 반복자는 container 의 횡단기법에서 pointer 사용을 분리한 좋은 새로운 개념이라고 생각한거죠. Go 언어도 그런 생각에 동의해서 pointer 는 좋지만 pointer 산술연산은 좋지 않다고 판단하여 pointer 산술연산을 없앴습니다.
VS 가 좋다고 생각하신 거라면 C# 을 추천합니다. VS 의 C# 지원능력에 비하면 C++ 는 아쉽기 그지없을 정도이거든요.
2016.04.28 21:03:45
a라는 변수를 쓸 때 b라는 변수를 새로 지정해서 b=a; 를 하나 추가한 다음 b를 주물럭거립니다. 그게 보통 제가 사용하는 방식이에요. 대학교 과제에선 포인터를 사용하라 가르쳤지만 전 아무리해도 포인터가 와닿지가 않더라구요. 그래서 대부분의 과제를 저렇게 처리한게 많습니다 (...)
좋게 말하면 의도치 않은 결과를 차단하지만 좋지않게 말하면 쓸데없는 줄이 늘어나는 경우이기도 하지요.
VS가 좋기도 하고...eclipse 보니 모르겠더라구요. src쪽에 추가해야하는데 그게 한두개가 아니라 쫘르륵 있으니까 뭘 추가해야 난 소스코드를 짤 수 있나- 부터 막막하기도 하구요.
C#한번 알아보겠습니다 추천 감사드려요
좋게 말하면 의도치 않은 결과를 차단하지만 좋지않게 말하면 쓸데없는 줄이 늘어나는 경우이기도 하지요.
VS가 좋기도 하고...eclipse 보니 모르겠더라구요. src쪽에 추가해야하는데 그게 한두개가 아니라 쫘르륵 있으니까 뭘 추가해야 난 소스코드를 짤 수 있나- 부터 막막하기도 하구요.
C#한번 알아보겠습니다 추천 감사드려요
2016.04.28 21:21:09
통상적으로 함수 매개변수들의 용량의 총 합이 16 bytes 이하라면 복사시간을 회피하기 위해 pointer 를 사용하는 것은 오히려 최적화를 방해해서 성능을 떨어뜨릴 가능성이 높다고 합니다. Pointer 가 필수적으로 쓰일 필요가 있는 곳은 별칭을 통해서 변화를 공유하기 위한 것이죠.
만일 공유해야 하는 결과가 기존 공간 (그러니까 객체) 에서 만들어질 필요가 없다면 새로운 공간에서 결과를 도출하는게 좋을 때가 많고, 성능도 그게 좋을 때가 많습니다. 다시 말씀드리지만 충분히 거대한 공간이 아니라면 복사시간 회피를 위한 pointer 사용은 compilation 최적화에 방해가 되어 성능을 떨어뜨리는 사례가 많습니다.
그 외에 대입연산의 병렬처리가 불가능하기 때문에 그걸 극복하기 위해서 pointer 를 쓰기도 하죠. 이건 Java 나 C# 도 마찬가지이긴 합니다. 예를 들어 Python 처럼 a, b = b, a 나 a, b = array 같은 것이 안 되기 때문에 우항이 함수의 결과일 경우 쪼개는 작업을 별도로 해주어야 해서 그냥 함수에 pointer 로 넘기는 거죠. 언어적 표현의 한계라고 볼 수 있습니다. C 는 Assembly 언어가 주로 사용하던 시절에 만들어진 언어니까 굳이 저런 표현까지 필요하냐고 주장하면서 문법의 간결성을 위해 그냥 pointer 로 해라라고 말할 수도 있겠지만요.
만일 공유해야 하는 결과가 기존 공간 (그러니까 객체) 에서 만들어질 필요가 없다면 새로운 공간에서 결과를 도출하는게 좋을 때가 많고, 성능도 그게 좋을 때가 많습니다. 다시 말씀드리지만 충분히 거대한 공간이 아니라면 복사시간 회피를 위한 pointer 사용은 compilation 최적화에 방해가 되어 성능을 떨어뜨리는 사례가 많습니다.
그 외에 대입연산의 병렬처리가 불가능하기 때문에 그걸 극복하기 위해서 pointer 를 쓰기도 하죠. 이건 Java 나 C# 도 마찬가지이긴 합니다. 예를 들어 Python 처럼 a, b = b, a 나 a, b = array 같은 것이 안 되기 때문에 우항이 함수의 결과일 경우 쪼개는 작업을 별도로 해주어야 해서 그냥 함수에 pointer 로 넘기는 거죠. 언어적 표현의 한계라고 볼 수 있습니다. C 는 Assembly 언어가 주로 사용하던 시절에 만들어진 언어니까 굳이 저런 표현까지 필요하냐고 주장하면서 문법의 간결성을 위해 그냥 pointer 로 해라라고 말할 수도 있겠지만요.
2016.04.28 22:26:42
네, 그 부분이 Java 가 C/C++ 에 비해서 느리게 만드는 중요한 사안 중 하나입니다. 비교적 무겁지 않은 복사되는 군집객체를 만들 수 없어, 무조건 class 에 기반한 참조방식을 써야 하거든요. 그래서 C# 은 class 는 참조방식으로, struct 를 복사방식으로 구별했죠. C++ 는 참조방식이 필요하면 pointer 나 참조를 사용하고, struct 와 class 는 무조건 복사방식.
참조방식은 최적화를 방해하고, Java 와 C# 의 경우 쓰레기 수집기에 의해서 자동으로 기억수명이 조절되기 때문에 쓰레기 수집기 부하가 존재합니다.
참고로 Go 언어는 class 는 없고, struct 가 복사방식이면서 pointer 를 통해 struct 요소를 참조할 수 있는데 그래서 가끔 struct 가 골 때리게 커지거나 쓰레기 수집기가 참조 추적을 조금 더 복잡하게 해야 합니다.
그러니까 모든 것이 다 장단점이 있고, 좋은 것은 나름대로 다 대가가 있다는 이야기...
참조방식은 최적화를 방해하고, Java 와 C# 의 경우 쓰레기 수집기에 의해서 자동으로 기억수명이 조절되기 때문에 쓰레기 수집기 부하가 존재합니다.
참고로 Go 언어는 class 는 없고, struct 가 복사방식이면서 pointer 를 통해 struct 요소를 참조할 수 있는데 그래서 가끔 struct 가 골 때리게 커지거나 쓰레기 수집기가 참조 추적을 조금 더 복잡하게 해야 합니다.
그러니까 모든 것이 다 장단점이 있고, 좋은 것은 나름대로 다 대가가 있다는 이야기...
2016.04.29 08:09:25
포인터 = 주소 타입 심볼. 끝이죠. 주소를 표현하는 타입이 지정되어 있는 저장 공간. 끝..
프로그래밍 많이 안해보셨으면 포인터 쓸일이 없으셨을 것이니 그렇게 짜는 것 뿐이고, 쓰다보면 그냥 써 집니다.
생각보다 별거 아니라서....
C++ 언어 자체도 C++11 나온지 얼마 되지도 않은것 같은데 개정작업 또 들어가서 C++14 나오더니 C++17도 나온다죠. 이런 새로운 흐름 따라가는것도 좋겠습니다.
제 생각엔 프로그래밍 언어론 관련 서적 (대학교 "프로그래밍 언어" 강의 교재에 쓰일 것 같은 책들) 보는것도 좋을 것 같네요.
프로그래밍 많이 안해보셨으면 포인터 쓸일이 없으셨을 것이니 그렇게 짜는 것 뿐이고, 쓰다보면 그냥 써 집니다.
생각보다 별거 아니라서....
C++ 언어 자체도 C++11 나온지 얼마 되지도 않은것 같은데 개정작업 또 들어가서 C++14 나오더니 C++17도 나온다죠. 이런 새로운 흐름 따라가는것도 좋겠습니다.
제 생각엔 프로그래밍 언어론 관련 서적 (대학교 "프로그래밍 언어" 강의 교재에 쓰일 것 같은 책들) 보는것도 좋을 것 같네요.
작성된지 2주일이 지난 글에는 새 코멘트를 달 수 없습니다.
직방으로 교수님에게 가시는 방법도 있습니다.