분류 전체보기

    탬플릿

    함수 탬플릿 인자로 들어오는 변수타입이나 지역변수타입, 리턴타입을 특정할 수 없을때, 혹은 특정하고 싶지 않을때 쓰인다. typename을 통해 타입을 추상적으로 지정하여 작성한 함수의 형틀이라고 볼 수 있다. (함수 템플릿은 어디까지나 함수를 만들기 위한 형틀에 지나지 않으며 그 자체가 함수인 것은 아니다.) (컴파일러는 함수 템플릿 정의문으로부터 앞으로 만들어질 함수의 모양만 기억하며 실제 함수가 호출될 때 타입에 맞는 함수를 작성한다.) 예를들어 더하기 연산을 하는 함수를 작성하고 싶은데 int, float, double등 모든 자료형에 대응하려면 각 자료형마다 함수를 작성해야한다. 만약 모든 자료형을 받는 함수를 만들면 이 불편함을 해결할 수 있을 것이다. 그 때 쓰이는 것이 함수 탬플릿이다. 하..

    인라인함수, 매크로함수

    인라인 함수 함수를 호출하는 코드를 함수의 몸체로 치환하는식으로 동작한다. 인라인 함수가 될지 안될지는 컴파일러 마음이다. 매크로 함수의 장점. 1. 단순 치환이므로 빠르다. 2. 메모리 공간을 차지하지않는다. 3. 다양한 타입을 인자로 받을 수 있다. 매크로 함수의 단점. 1. 복잡한 함수를 만들기 어렵다.(역슬래쉬로 개행) 2. 디버깅이 불가능하다. 인라인 함수의 장점 1. 단순 치환이므로 빠르다. 2. 메모리 공간을 차지하지않는다. 3. 디버깅이 가능하다. 4. 타입을 인식하기 때문에 실수할 일이 적어짐. 5. 복잡한 함수를 만들기 용이하다. (그냥 함수랑 똑같이 작성하면 됨) 인라인 함수의 단점. 1. 호출되는 곳마다 함수의 본체가 삽입되므로 실행파일의 크기가 커진다. 인라인 함수가 일반함수가 되..

    타입 캐스팅

    타입을 변경하는 것. C스타일 형변환 강제 형변환이다. (int)'A' 처럼 쓴다. 형변환이 불가능해도 경고가 나지 않으니 주의해야한다. 만약 잘못쓰면 힙이 오염된다. static_cast 컴파일타임에 확인할 수 있는 요소를 고려해 캐스팅을 하는 것.(정적) 논리적인 형변환을 해준다. 예를들어, 1. int* 를 int로 형변환하는 것을 막아준다. 2. 부모와 자식사이가 아닌 클래스끼리의 형변환을 막아준다. (상속확인) 하지만 2번에서, 뭐가 부모고 뭐가 자식인지는 신경쓰지 않고 형변환을 진행한다. 즉, 위험한 상황이 발생할 수 있다. 왜냐하면 부모는 A,B의 기능을 가지고 있고 자식은 A,B,C,D의 기능을 가지고 있는데 부모를 자식으로 형변환한다하면, 부모에게 없는 기능인 C,D를 사용하려고 했을때 ..

    비트연산으로 flag주기

    프로그램을 개발하다보면 enum이라는 녀석을 사용하게된다. 주로 무언가를 구분하거나 옵션을 제공할때 쓰이는데 여기서는 옵션을 제공할때를 살펴보자. MOVABLE(움직일 수 있는), ATTACKABLE(공격할 수 있는) 이라는 두가지 옵션을 한꺼번에 제공해야한다면 어떻게할까? enum STATE { MOVABLE, ATTACKABLE, MOVABLE_AND_ATTACKABLE, END } 이렇게 사용할 수는 있다. 그러나 매번 이렇게 따로 항목을 추가하는건 번거롭다. 이럴때 사용할 수 있는게 비트연산이다. #define DT_TOP 0x00000000 #define DT_LEFT 0x00000000 #define DT_CENTER 0x00000001 #define DT_RIGHT 0x00000002 #de..

    라이브러리는 이해하고 사용하자.

    라이브러리는 이해하고 사용하자.

    틴더처럼 스와이프로 게시물을 탐색하는 앱을 만들고있다. 이는 swipeCardView라는 어댑터뷰를 통해 구현되고, 그 어댑터뷰에 연결할 어댑터는 ArrayAdapter를 상속받는다. 그렇게 잘 개발하다가 스와이프시에 카드뷰를 생성하는데 버벅거리는 이슈가 발생했다. 처음에는 카드에 들어갈 사진을 서버로 http요청하는게 잦아서 그런 줄 알고, 한번 요청할때 좀더 많은양의 데이터를 받아놓는 방식으로 최적화했는데 그래도 여전히 이슈가 해결되지 않았다. 그래서 나는 호출스택을 타고들어갔다. 그리고 라이브러리의 어댑터뷰가 ArrayAdapter의 getView의 convertView를 아예 null로 하드코딩해서 넣고있는걸 발견했다. 도대체 왜 이렇게 만들었는지 모르겠다. 이말은 어댑터의 최대이점인 ‘뷰를 재활..

    매니지드언어의 메모리누수 (memory leak in managed language)

    매니지드언어의 메모리누수 (memory leak in managed language)

    가비지컬렉터가 있는 언어라고 해도 메모리누수는 생긴다. 대표적인예가 상호참조가 이루어졌을때이다. 예를들어 A라는 클래스가 B클래스를 참조하고 B라는 클래스가 A클래스를 참조할때이다. 가비지컬렉터는 작동방식이 다양하기는 하지만, 기본적으로는 reference count 방식을 사용한다. 즉, B클래스를 참조하는 포인터가 A클래스에 있으면 B클래스는 참조카운트가 1인 것이다. 이 참조카운트가 0이 되었을때 가비지컬렉터는 해당 객체를 쓰레기라고 판단하게 되고 지운다. 하지만 상호참조가 있을경우 A,B두 객체가 서로 참조하고 있기때문에 참조를 수동으로 끊지 않는이상 둘다 지우지 못한다. 왜냐하면 A를 지우려고 해도 B가 참조하고 있고 B를 지우려고 해도 A가 참조하고 있기 때문이다. 해결법은 C++의 경우에는 ..

    액티비티(Activity)와 인텐트(Intent)

    액티비티(Activity)와 인텐트(Intent)

    액티비티(Activity) 안드로이드 스튜디오에서는 왜 화면을 액티비티 단위로 구성할까? 데스크톱과는 다르게 모바일 환경에서는 A라는 앱이 B라는 앱을 호출 할 수 있다. 이 때 A라는 앱이 B라는 앱을 호출할때 B앱 전체를 호출하는게 아니라, 액티비티 단위로 호출하게된다. 예를들어서 홈화면에서 이메일앱을 열면 이메일 목록을 표시하는 액티비티가 열린다. 하지만 SNS 앱에서 친구를 추가하기 위해 이메일앱을 호출하면 이메일을 작성하기 위한 액티비티를 실행할 수 있다. 이런 환경의 특성상 모바일 앱은 액티비티 단위로 구성된다. 즉, 호출하는 목적에 따라 다른 앱을 액티비티 단위로 호출하는게 가능하기 위해서다. 이렇게 다른 액티비티를 호출하는 것은 Intent를 이용해 구현된다. 인텐트(Intent) Inte..

    보트보트 개인정보 고지사항

    ('https://blackmanta.tistory.com/'이하 '댕글링포인터')은(는) 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원활하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다. ('댕글링포인터') 은(는) 회사는 개인정보처리방침을 개정하는 경우 웹사이트 공지사항(또는 개별공지)을 통하여 공지할 것입니다. ○ 본 방침은부터 2020년 10월 20일부터 시행됩니다. 1. 개인정보의 처리 목적 ('https://blackmanta.tistory.com/'이하 '댕글링포인터')은(는) 개인정보를 다음의 목적을 위해 처리합니다. 처리한 개인정보는 다음의 목적이외의 용도로는 사용되지 않으며 이용 목적이 변경될 시에는 사전동의를 구할 예정..