'ModernC++'에 해당되는 글 12건

  1. 2017.03.22 [2편] Modern C++정리: range based for
  2. 2017.03.22 [1편] Modern C++정리: auto
posted by REDFORCE 2017. 3. 22. 17:20

이번 글에서는 1편의 auto에 이어서


range based for에 대해서 적어보겠습니다.


목차


1. Auto

2. range based for

3. enum class

4. non-static data member initializers

5. initializer lists

6. default / delete definition

7. override / final

8. emplacement

9. constexpr

10. lambda

11. random

12. thread


2. range based for


 A. range based for?? 


번역하자면 범위 기반 For 라고 적고 단순히 이해하자면 반복문을 쉽고 안전하게 쓰기 위한 For~ 라고 보면된다.



간단한 설명

  • C++11 기능 중 'auto'와 더불어 간단하면서 유용한 기능
  • VC의 'for each'와 유사
  • 반복문을 아주 쉽고 안전하게 사용할 수 있다.
  • C++ STL의 컨테이너, 배열 등에 사용할 수 있다.


코드를 먼저 살펴보면 한눈에 이해할 수 있다.




가장 첫번째 부터 


 (1) For (일반적인)

 (2) For each

 (3) range based for  로 되어있다.


여기서 눈여겨 볼 것은 auto를 활용한 range based for 문이다.


(3)에서 결국 auto i  값이 입력받은 배열의 iterator로써 활용이 된다.


편하게 auto i 의 값이 입력받은 배열의 begin 부터 end 까지 반복 수행하게 된다.



마찬가지로 std::vector 와 같은 컨테이너에서도 활용이 가능하다.




일반적인 배열을 입력해줬던 내용대로 똑같이 컨테이너를 넣어주면 된다.




그리고 이 글에서 가장 핵심적인 부분!


1. for문에서 의도치 않은 값 복사를 피하고 싶다면?


2. 그리고 이런 range based for문을 활용하면서 값 변경을 막고 싶다면?


3. 둘 다 하고싶다면?


아래와 같이 코드를 수행하면 된다.




값 복사를 피하고 싶다면 레퍼런스를 받아오도록 하게 하면되고


값 변경을 방지하고 싶다면 const를 이용하여 막을 수 있다.


둘다 하고싶다면 위 내용 둘 다 수행하면 된다.




range based for문은 확실히 반복문을 수행하는데 편리하고 쉬운 방법이면서도 안전하게 사용을 할 수 있는 방안이다!


결론. auto 짱짱맨! |O_ o/ x 256




ps. 내가 자꾸 auto 성애자가 되는 것 같다..하앜..

posted by REDFORCE 2017. 3. 22. 15:49

글을 작성하기에 앞서 아래의 링크에 걸려있는 내용을 참조하였음을 알려드립니다.


[LINK] << Click - New Window

[slideshare] Modern C++ 프로그래머를 위한 CPP11/14 핵심  (저자: 홍배 최 교수)



평상시 공부하면서 지하철을 오갈때 할거 없으면 매번 이 슬라이드를 봤었다..

본거 또 보고 본거 또 보고...

그러나 아직도 공부하면서 스마트 포인터 같은 녀석들은 잘 써먹기가 힘든 것 같다.


-------------------------------------------------


이번 글에서는 그간 공부하면서 활용했던 Modern C++ 항목들에 대해 정리하고자 합니다.


Modern C++에 대한 정리 글은 총 12편으로 나뉘어 작성 될 예정 입니다.


목차


1. Auto

2. range based for

3. enum class

4. non-static data member initializers

5. initializer lists

6. default / delete definition

7. override / final

8. emplacement

9. constexpr

10. lambda

11. random

12. thread



이 글은 [1편] auto에 대한 내용입니다.


1. auto


auto 는 최근 개인적으로 코드를 작성할 때 iterator를 대용하는 목적으로 많이 이용하고 있는 방식이다.


 A. auto란??


auto에 대해서 간단히 설명하자면


 (1) 변수 정의 때 명시적으로 type을 지정하지 않아도 된다.

 (2) auto로 정의한 변수는 초기화할 때 type이 결정 된다.

 (3) 컴파일 타임 때 type이 결정 된다.

 (4) 템플릿 프로그래밍에 사용하면 코딩이 간편해진다.

 (5) 코드 가독성이 향상된다.

  (개인적으로 (5)번은 잘 모르겠다...개인적으로 써보면서 향상 되는건 사실이지만 남발하면.....= _=;;)



auto는 위와 같이 어느 변수타입이든 대용이 가능하다.


마치 c#의 var와 같은 느낌?


C++에는 var가 없기 때문에 위와 같이 auto를 활용할 수가 있다.



기본적으로 타입이 제한되어져서 나올 값들이라면 타입을 지정해서 쓰겠지만


string이나 char* 같은 녀석들을 리턴받고 던진다거나 빠르게 프로그래밍 해야 할 때는 auto로 받는것도 나쁘지 않을 것 같다.

(그래도 왠만하면 습관적으로 명시하여 쓰겠지만...)



위와 같이 포인터 형에 대한 것도 받아서 쓸 수가 있다.



참 편리하다...



구조체나 클래스도 마찬가지로 받을 수 있다.




그리고 본인이 개인적으로 가장 많이 활용하는 iterator의 대용이다.



정말 iterator 자체를 auto로 대용할 수 있다는 게 코드를 얼마나 많이 줄일 수 있는지는 그리고 auto를 알고 있다면


가독성이 얼마나 편해지는지 가늠 할 수 있을거라 봅니다.

(auto 짱짱맨!! |O_ o/)




 B. 일반함수의 반환 값 auto 지정에 의한 형 추론

  • C++ 14의 새로운 기능
  • 일반 함수에서도 반환 값 타임을 추론할 수 있는 기능
  • 반환 값 타입으로 auto를 사용한다.

   

위의 말 중에 반환 값 타입으로 auto를 사용한다가 무슨 말이냐면...


보통 함수의 반환 값으로 bool, int 등을 선언하여 반환 값 타입이 미리 지정하여 사용하지만..



auto를 활용하면!!


위와 같이 function 자체의 return 값을 auto 로 받아서 타입 추론형으로 반환 할 수가 있다.


이 얼마나 편하단말인가!!!

(auto 짱짱맨 |O_ o/)  x 10


근데 실제로 저렇게 반환시키는 코드를 작성해본 적은 없는거 같다.

(왜...?)


음...개인적으로 저런식으로 반환형 타입을 추론형으로 만들어버리면 


다른 클래스에서 저 함수의 리턴 타입이 auto로 나와버려서 대체 무슨 타입을 리턴하는거지? 


하고 한번더 함수를 F12 누르고 들어가게 됐었다.




꼭 필요할 땐 활용해야겠지만, 팀 프로젝트에서는 조금 자중할 필요가 있지 않을까? 하는 생각이 든다.




그리고 끝으로 auto를 사용할 땐 함수에서 리턴 타입을 동결시켜줘야 한다.


코드로 적어보자면 아래와 같다.




결론. auto 짱짱맨 |O_ o/  x 119




다음 글은 range based for에 대해서 적어보도록 하겠습니다.