SK 모바일 주유권 사용하기!!

Posted by ironmask84
2017. 2. 14. 16:33 재테크/깨알꿀팁



자동차를 구입하고 자동차 관련 씨리즈 3번째 포스팅입니다. ^^

#1 중고차 구입하기~ (http://ironmask.net/304)
#2 자동차세 연납제도 (http://ironmask.net/306)


이번엔 SK 모바일 주유권 사용하기 인데요.
사실 얼마전에 SK 모바일 주유권 5천원 짜리가 생겼어요.

모든 SK주유소에서 사용 가능한 건 아니라고 들어서.. 
살짝 검색을 해봤더니...

https://www.couponhappy.co.kr/faq/11stGas.jsp#

위 사이트로 들어가시면 간단하게 조회가 가능합니다. :)


아직 사용 전이라서...
사용 후에 다시 후기 업뎃을 할게요~ ㅎㅎ

 

자동차세 연납제도를 아시나요??

Posted by ironmask84
2017. 1. 31. 20:04 재테크/자동차


얼마전 중고차 구입으로 차도 생겼겠다, (http://ironmask.net/304)

이번엔 자동차세 관련 포스팅 입니다. ㅎㅎ

자동차를 사니 나가는 돈이 줄줄 생기네요 ㅠㅠ


자동차세를 처음 납입해보지만,

6월, 12월에 있는 자동차세 1년치를 미리 1월에 내면 10% 할인을 해주는!!

연납제도라는 것이 있네요.


오늘이 2017년 연납 마지막일 인데, 

운좋게도 오늘 알게되어 바로 신고하고 결제 들어갔습니다!!


첫 번째로, 연납 신청을 사이트인 www.wetax.go.kr 로 들어갑니다.
오늘이 마지막날이어서 그런지 서비스 지연으로 애좀 먹었습니다;;


두 번째로, 연납 신청을 합니다!

보시면 알겠지만, 10% 할인받은 것을 알 수 있습니다.^^

마지막으로 인터넷 납부 하시면 되겠습니다.

신용카드로 결제 가능해서 편리하네요~


 

연말정산 - 추가환급 방법

Posted by ironmask84
2017. 1. 29. 21:49 재테크




2016년 연말정산은 다들 잘하고 계신가요? ^^

저는 회사를 통해서 전산으로 일단 처리를 해서

정산 결과를 기다리고 있습니다. ㅎㅎ (감사하게도 회사 내 담당자가 서류 처리를 해주시네요 ㅠㅠ)


사실 이번에 포스팅 하려는 것은 작년에 2015년 연말정산 후,

제가 빠져먹은 항목이 있어서 그걸 추가환급 받은 경험을 토대로 알려드리겠습니다. ㅎㅎ


저는 주택마련저축용으로 주택청약저축 계좌가 하나 있는데, 이걸 추가로 환급신청하여 받았습니다.

최근엔 1년에 최대 240만원 까지 소득공제 혜택이 있다는 사실!

요 부분에 대해서는 예전에 한번 포스팅 하였는데, 아래 주소 참조하시길 ㅎㅎ

http://ironmask.net/237


우선, 환급받은 환급증을 아래에 보여드립니다. ^^
114,000원 이나 환급받았네요! 

왠지 꽁돈이 생긴 기분이라 좋았습니다. ㅋㅋ




세무소에 직접 찾아가지 않아도 됩니다!!! ㅎㅎㅎ

국세청(홈택스) 사이트에서 "경정청구"로 검색 후 해당 메뉴 들어가면 진행 가능합니다.

필요 파일도 저 같은 경우 연말정산 간소화 사이트에서 받을 수 있는 pdf 파일 하나면 충분하였네요 ㅎㅎ

접수할 때 작성해야할 부분도 그리 복잡하지는 않았습니다.





한국납세자연맹에서는 연말정산을 대리로 더 쉽게 처리해주기도 합니다.

www.koreatax.org

여기서 연말정산 시에 유익한 좋은 팁들을 많이 얻으실 수 있습니다. :)

(다만, 수수료가 조금 있습니다.)


참고하실분을 위해

국세청에서 다운받은 2015년 경구청정 메뉴얼을 올려드립니다.

2015년_귀속_경정청구_매뉴얼.pdf


 

2017년 1월 20일 나의 첫 애마 구입기~

Posted by ironmask84
2017. 1. 25. 16:44 생각과 일상/오늘의 일상


작년 말에 생애 첫 내 보금자리에 이어...

올해 시작은 첫 애마를 구입하였습니다!!

제가 요즘 나오는 말로 소위 '금수저'도 아니고,
지방에 있다가 서울에 와서 그냥저냥 먹고사는 처지라 ^^,
아직 운전 초보이기도 하고,
여러모로 중고차가 좋겠다! 싶어서 중고차를 사기로 마음 먹었답니다.

인터넷과 지인을 통해 여기저기 알아보다가,
중고차 딜러 중 사기꾼이 많다는 얘기가 너무 많다보니
오랜끝에 신중히 믿을만한 업체를 1군데 골랐습니다.
그 와중에 책을 5권이나 구입도 했네요..ㅋㅋ
좀 더 자세한 중고차 구입 요령은 아래에 포스팅~
http://ironmask.net/302

원래 기아 포르테를 사려고 마음먹고 있었습니다..
사실은 경차로 하려다가 포르테 가격이 착하더라구요.. (소형이긴 하지만 ㅎㅎ)
그런 가운데 현대 엑센트에서 맘에 드는 물건이 나와있는 바람에 엑센트로 기울었습니다. ㅎㅎ
옛날 엑센트만 머릿속에 있어서 무시하고 있었는데, 신형 엑센트 디자인 많이 좋아졌네요~~

간단하게 스펙을 소개드리면,
2014년식!  주행거리 4만!  1.4 VVT 모던!  쥐색!
덤으로 아틀란 네비와 후방카메라 그리고 하이패스 단말기..

네고해서 딱 800만원에 맞췄습니다.

여기서 취등록세 + 매도세(매매단지 관리비용) + 알선비(수수료) = 36만 + 27만 + 30만 = 93만
그리고 블랙박스 + 타이어 4짝 교체 = 14만 + 19만 = 33만
신기한건 중고차 시장에선 800만대에서 거래되고 있었지만,
막상 취등록세에서 과세로 잡히는건 516만... 그럼 차 값이 과평가되고 있는 것인지...? ㅜㅜ

800만 + 93만 + 33만 = 총 926만 정도가 되겠습니다.

중고차이지만, 생애 첫 차이니만큼 애정이 많이 가네요~


 

2016년 10월 17일 부천 옥길로 아파트 입주~

Posted by ironmask84
2017. 1. 19. 23:57 생각과 일상/오늘의 일상


늦었지만 새 보금자리 입주 후기를 적어보네요 ㅎㅎ

2014년에 LH 공공임대 보금자리에 당첨되어,
2016년에 당당하게? 부천 옥길지구에 입주하였습니다!!
대단한건 아니지만, 가슴이 벅차고.. 
무엇보다 주님께 감사드립니다. ^^

직장이 서울에 잡혀 2010년 부터 수도권 생활을 
서울 금천 -> 광명 하안 -> 부천 옥길  (서울 서남권 라이프 ㅋㅋ)
이렇게 이동해왔습니다.

서울에서 내집마련이 될까 걱정이 큰 찰나에..
다행이 경기 부천.. 그것도 LH 공공임대로 구하게 되어서 
꽤 저렴하게 가능하게 되었네요 ㅎㅎ

LH 주택청약 요령은 간략하게 포스팅 해두었습니다. ^^
http://ironmask.net/301

앞으로 부천 옥길이 어떻게 발전해 나갈지 기대됩니다. ㅎㅎ


 

본격 중고차 구입하기!!

Posted by ironmask84
2017. 1. 12. 00:05 재테크/자동차



30년 넘게 살면서 아직 차를 구입해본 적이 없습니다.

2017년! 때가 된 것 같습니다.

본의 아니게 시간적 여유도 생겼고 하여, 내 인생 첫 차를 구입하려 합니다.

오랫동안 생각해본 결과, 첫 차로는 중고차가 좋을듯 하여 구입을 위해 이레저레 생각을 해봤습니다만..
워낙에 사기거래가 많다보니 이른바 '호구' 가 되지않기 위해 구입 요령에 대해 공부하려고 합니다.

현재 ing중이며, 여러모로 겪은 후 양질의 유익한 정보로 포스팅 업뎃을 하겠습니다. ^^

아래는 이제 자동차에 대해 공부하기 위해 구입한 책입니다!!

2017년 1월 19일 업데이트
"착한중고차" 책을 읽어보고, 여러 중고차 업체를 알아보며 신뢰 할만한 업체를 찾는데 집중하였습니다.
요즘은 중고차 구매대행 비슷하게 카운셀링을 해주는 곳도 있고,
구매 전 체계적으로 상태점검을 하면서 신뢰감 있게 짜여진 구매절차를 구축해놓은 업체도 있었습니다.

그 중에 저는 "밀알자동차" 라는 업체와 계약을 하였습니다. 
홍보하는 것은 아니고, 개인적으로 신뢰가 가는 업체로 보여 추천하는 업체입니다. ^^

위의 책들을 모두 읽어보기에는 아직 시간이 부족하고,

착한중고차 -> 내 차 사용설명서 -> 자동차 정비교과서 -> 자동차 구조교과서 순으로 읽으면 
중고 자동차 구입/판매 뿐 아니라 자동차 관리까지 정리가 될 것 같습니다.

자동차 운전교과서는 실제 운전 시에 좋은 팁들이 정리되어 있습니다.

 중고차 구입 시 드는 비용을 간략하게 정리하면 

차량가 + 취등록세 + 중고차 관리비용 + 알선 수수료  입니다.
여기서, 취등록세는 공시 차량가의 7%정도이며,
중고차 관리비용은 자동차 매매단지에서 관리비 명목으로 20 ~ 30만 사이 정도 합니다.
알선 수수료도 업체마다 다르지만 10 ~ 50만 정도 합니다.

자동차 보험은 따로겠죠? ㅎㅎ

 

공공임대 주택청약 심플 가이드

Posted by ironmask84
2017. 1. 11. 14:50 재테크


이번엔 주택청약에 대해서 포스트 합니다. ^^

저는 사실 2년 반 전에 LH공사 공공임대 주택청약에 지원하여 당첨이 되었고, 
3달 전에 입주를 하였답니다. ^^

특히, 서울, 수도권은 부동산이 너무 비싸고, 갈수록 집값이 떨어질지도 모른다는 예측도 많은 가운데
이 제도를 잘 이용하면, 재테크로 정말 유용하리라 생각합니다.

공공임대 주택청약.. 조금만 살펴보면 그렇게 어렵지는 않습니다.

우선, 아래 사이트를 참고해보시면 금방 조건이나 요령을 알 수 있습니다.
https://www.apt2you.com : 주택청약에 대한 여러가지 정보를 조회할 수 있습니다. (청약통장 조회, 주택당첨 조회 등)
https://apply.lh.or.kr : LH공사에서 주택계획정보나 청약공고 등을 조회할 수 있습니다.

그리고 네이버까페에서도 도움많이 받았었는데, 아래 까페 추천합니다.
http://cafe.naver.com/8282home
http://cafe.naver.com/kookminlease


임대주택 주택청약에도 종류가 여러가지가 있습니다.
공공임대, 국민임대, 영구임대, 행복주택 등

저는 공공임대에 지원했었고, 이를 기준으로 간단하게 알려드리겠습니다.

일반적 기준에서 지원전형은 다자녀가구, 신혼부부, 생애최초, 노부모부양, 일반 이렇게 있습니다.
일반전형을 제외하곤 전부 특별공급전형입니다.

기본적인 자격 기준은 무주택 세대주여야 하며, 주택청약저축 통장 2년 납입 (월 1회 까지만 인정) 입니다.
그리고 현재 거주지와 비슷하거나 같아야 합니다. (서울, 경기, 인천은 보통 서로 지원이 가능)
보통 경쟁이 치열한 곳은 커트라인 납입금액이 1000만원도 훌쩍 넘어가기도 한답니다;;(월 10만원까지 인정)

특별전형은 각 전형마다 특성이 있기 때문에 다 소개하기는 힘들고,
생애최초와 일반 전형에 대해 알려드리면,

일반전형의 경우 : 사실, 주택청약 공고마다 기준이 조금씩 다릅니다. 하지만, 통상적으로 비슷한 것은
                         주택청약저축 납입기간이 길수록, 무주택 기간이 길수록 가점이 높습니다.
                         주의할 것은 무주택 기간은 결혼 전에는 만30세 이상부터의 기간만 산정됩니다.
                         그리고 납입은 월1회만, 10만원까지만 인정됩니다.

생애최초 전형의 경우 : 청약저축 통장 2년 납입 + 저축액이 600만 이상이어야 함.
                              현재 기혼인이거나 미혼인 자녀가 있어야 함.
                              과거 1년내에 소득세를 납부한 자로서 5년이상 소득세를 납부한 자
                              생애최초는 조건만 만족하면 무조건 추첨제이기 때문에 가점이 적은사람도 도전해볼만 함!!

그리고 공통적으로 적용되는 부분에 본인의 부동산, 자동차, 작년 월평균 소득 기준이 있습니다. (2014년도 기준)

부동산 : 215,500,000원 이하
자동차 : 27,990,000원 이하
월평균 소득 : 3인 이하이면 4,606,216원 이하, 4인 5,102,802원 이하, 5인 5,357,446원 이하

이것 외에도 더 자세한 자격조건은 각 공고문을 읽어봐야 정확하답니다. ^^


 

Container_of 매크로

Posted by ironmask84
2016. 11. 9. 11:01 나는 프로그래머다!/Linux


Linux 소스 스터디 입문을 했습니다.

"리눅스 커널과 디바이스드라이버 실습2" 라는 책을 구입 후 보는 중인데,
리눅스에서 주로 사용하는 자료구조 쪽을 공부하다보니,
(기준 리눅스 커널 버젼은 2.6.31 이라고 합니다.)

소스 내에 container_of(ptr, type, member) 이라는 매크로를 소개하네요..
이름만 봐서는 argument들의 container.. 즉, C언어이니 구조체를 리턴해줄 것으로 보이는데,
container의 주소값을 얻는데 사용하는 것 같습니다.

첫 느낌은 뭔가 디게 복잡하게 주소값을 얻어오는 기분입니다만.. 이게 최선인가;;
매크로는 아래와 같습니다.

#define offsetof(TYPE, MEMBER) ((unsigned long) & ((TYPE *)0)->MEMBER)

#define container_of(ptr, type, member) ({ \

const typeof( ((type *)0)->member ) *_mptr = (ptr); \

(type *)( (char *)_mptr - offsetof(type, member) ); })

실제로 console로 결과값을 돌려보고, 머리를 굴려봐도 머리에 잘 안들어오네요 ㅜㅜ

검색하다가 리뷰가 잘되어있는 주소 링크합니다.
http://rootfriend.tistory.com/197
http://kldp.org/node/58409

주요내용은 아래에 따로 펌~

gcc C 언어 확장 기능으로, (즉, 표준이 아니며, 다른 컴파일러에서 지원하지 않는..) compound statement (중괄호로 둘러싼 여러 statement)를 expression으로 해석하는 기능이 있습니다. 예를 들면:

({ int y = foo(); int z;
if (y > 0) z = y;
else z = - y;
z; })


로 쓴 것처럼, foo() 리턴 값의 절대값을 얻는 코드를 위와 같이 작성할 수 있습니다. 이 것은 C99 표준에서 inline function이 나오기 전에 매우 유용하게 썼던 기능입니다. expression에서 switch, for 등의 statement를 쓸 수 있는 등의 장점을 얻을 수 있었습니다. 실제로 GNU C library에 포함되어 있는 obstack에 관계된 대부분의 함수가 이 compound-statement expression을 써서 macro로 구현되어 있습니다. 물론 맨 마지막 statement의 값이, 이 compound statement의 값이 됩니다.

그런데, 이 기능은 현재 C++에서 쓸 경우, 임시 변수의 destructor가 불리는 순서가 바뀌는 등의 단점이 있기 때문에, C++로 쓸 우려가 있는 코드에서는 이 compound statement expression을 쓰지 말라고 권하고 있습니다.

개인적으로 간단한 수식으로 나올 수 있는 것이 아니라면 do { ... } while (0)을 써서 macro로 만들고, 어떤 값을 리턴할 필요가 있는 macro라면 inline function을 쓰는 것이 좋다고 생각합니다.

 

윈도우 환경에서의 gcc

Posted by ironmask84
2016. 10. 31. 15:24 나는 프로그래머다!/기초 다지기


GCC (GNU Compiler Collection)는 다양한 프로그램 언어의 컴파일을 지원하는 컴파일러 시스템이며, 특히 C와 C++의 컴파일에 활용될 수 있습니다. 리눅스나 FreeBSD 등의 유닉스 계열 OS에서 매우 광범위하게 사용되어 오면서 뛰어난 성능을 검증받았습니다.

 

윈도의 경우, cygwin과 MinGW가 윈도로 포팅된 gcc의 양대산맥이라고 할 수 있는데, 둘의 성격은 꽤 다른 편입니다. cygwin의 경우 윈도에서 리눅스 환경을 느끼면서 코딩할 수 있도록 배려한 라이브러리가 포함되어 있으며, 주로 유닉스 계열에서 쓰이는 POSIX API 집합을 지원합니다. 따라서 cygwin으로 컴파일된 프로그램을 실행하기 위해서는 별도의 라이브러리(cygwin1.dll)가 필요합니다. (cygwin이 GPL 라이센스를 따르므로 라이브러리 사용시 일부 라이센스 문제가 있을 수 있습니다.)

 

한편 MinGW의 경우 MS에서 제공하는 C 런타임 라이브러리(msvcrt)를 기반으로 동작합니다. 따라서 cygwin과 달리 런타임 라이브러리는 필요하지 않으나, msvcrt가 C99의 기능들을 지원하지 않는 관계로 libmingwex라는 추가 라이브러리를 통해 해당 부분에 대한 지원을 시도하는 중입니다. (출처) 해당 문제점은 MinGW에서 갈라져 나온 새로운 가지인 MinGW-w64에서 해결되었는데, C99의 기능 뿐만 아니라 더 다양한 API, 64비트 윈도우 등에 대한 지원이 추가되었으며, 32비트용 컴파일 또한 지원합니다.

 

결론적으로, 기존에 리눅스 환경에서 실행되던 프로그램을 윈도로 포팅하는 경우에는 cygwin을 사용하고, 일반적인 윈도용 어플리케이션을 개발하기 위한 범용 컴파일러는 MinGW-w64를 사용하는 것이 좋을것 같습니다.


http://jscript.blog.me/220084163392 펌


MinGW은 이클립스 플러그인으로도 제공됩니다.

MinGW에 간단 사용기 : http://neuro.tistory.com/32


 

SW 프로그램과 개발환경(리눅스)

Posted by ironmask84
2016. 10. 31. 14:48 나는 프로그래머다!/기초 다지기





컴퓨터 공학 전공으로 졸업하고, 어언 6년이 지났건만.. 
아직 기초가 부족한 부분이 많은 것 같습니다.


학부 때는 단순히 윈도우 환경에서 Visual Studio나 Eclipse 프로그램을 사용하여
자연스런 컴파일 환경을 통해 프로그래밍 언어를 습득하기에만 정신이 없었고...

모바일 폰 개발 회사에서 재직하는 동안에도 선배들이 만들어놓은 개발 환경을 그대로 이용만 하여,
프로그래밍을 해왔기에..  개발 환경에 대해 제대로 개념을 익히는 시간이 거의 없었습니다..

학부 때 잠시나마 배웠던, 컴파일에 대한 개념도 가물가물 해졌습니다. ㅜㅜ (밑에 간단 정리..)


c언어 코딩 부터 실행파일까지의 기본 순서 : *.c -> *.s -> *.o -> *.exe or *.elf 등등

*compiler : 고수준코드(*.c)에서 목적 코드(*.o)로 옮기는 과정을 통합하여 수행하는 프로그램을 가리킨다.

*좁은 의미의 compiler : 고수준 코드(*.c)를 저수준 코드 (*.s)로 옮기는 과정을 수행하는 프로그램.

*assembler : 저수준 코드(*.s)를 목적 코드 (*o)로 옮기는 작업을 수행하는 프로그램.

*linker : 컴파일러가 만든 목적 코드 (*.o)와 library를 모아 기계어인 실행파일 (*.elf or *.exe)로 변환하는 프로그램.


사실 SW 개발자 입장에서 개발 환경은 한 번 셋팅 해놓으면, 크게 신경을 쓰지 않기에 지나치기 쉬운 것 같습니다.


임베디드 SW를 만드는 업을 해왔지만, 주로 윗단을 (Application 단 + Framework 단) 다루다가,
최근에 아랫단를 (펌웨어) 개발해야 할 기회가 왔기에.. 다시금 개발환경에 대해 파악해보려 합니다.


모바일 폰에 사용되는 칩셋(CPU)의 Core는 ARM을 이용합니다.


그리고 펌웨어 개발 환경은 대부분 리눅스 커널 환경을 사용하기에 이에 대해 잠시 집고 가볼까 합니다.

잘 정리해 주신 블로거님이 계시기에 아래에 퍼왔습니다.


일단 결론을 말씀드리자면, 아래와 같습니다.

1. 리눅스 환경에서 개발 시에는 거기서 제공하는 tool chain을 다운로드하여 사용
   (apt-get 툴을 이용해 필요한 버전의 툴 체인 설치)
2. 윈도우 환경에서 개발 시에는 주로 Cygwin(gcc 제공)을 이용하게 됩니다.

** ARM 타깃용 크로스 툴 체인 --> http://linaro.org 참조


우리가 윈도우즈 환경에서 리눅스 ARM 용 프로그램을 빌드하기 위해서는, 그에 맞는 바이너리를 생성해 줄 수 있는 환경( 컴파일러, API 등 )을 구성할 필요가 있다. 윈도우즈에서 이를 가능하게 해 주는 것이 POSIX 기반의 시그윈 개발 환경이다. 
--> Cygwin 에서는 Windows에서 사용가능한 리눅스 환경의 API들을 제공하고,
     tool chain (ARM용 gcc 크로스 툴 체인, 
git 등)을 제공합니다.


우리는  시그윈 환경을 이용해 리눅스 ARM 용 프로그램을 빌드하고, 그것을 안드로이드 장치로 복사하고 설치하게 된다. 이것이 윈도우즈와 리눅스 간의  크로스 플래폼 개발이다. 안드로이드 SDK 를 사용하게 되면 자바 바이트 코드( 플래폼에 독립적인 중간 코드 )를 생성하기 때문에 빌드 환경이 중요하지 않지만, 안드로이드 NDK 는 실제 리눅스 API 를 이용하고 기계어로 컴파일하기 때문에 반드시 올바른 환경에서 개발해야만 한다.



좀 더 자세한 내용은 아래 펌 참고...

http://lifeisforu.tistory.com/132  (안드로이드 NDK 개발환경 예시)



NDK 로 개발을 한다는 것이 의미하는 바가 무엇인지 생각해 볼 필요가 있다. 많이들 알고 있는 사실이겠지만, 어떤 프로그램이 어떤 머신에서 실행되기 위해서는 해당 머신에 맞는 실행가능한 파일( executable )을 만들어야만 한다. 그것이 소위 우리가 알고 있는 '컴파일'과 '링크'라는 작업이다. 이 컴파일 작업과 링크 작업을 합쳐서 '빌드'라고 표현한다.


우리가 열심히 코딩한 라인들은 어셈블리어로 변환되고, 이 어셈블리어들은 다시 기계어로 변환된다. 그리고 CPU 는 이 기계어를 마이크로 명령어로 나누어서 프로그램을 실행하게 된다. 그런데 이 CPU 가 어떠한 명령어 집합 구조( Instruction Set Architecture, ISA )를 제공하느냐에 따라서 다른 기계어를 만들어야 하기 때문에, 프로그램을 빌드할 때는 해당 CPU 에 맞는 구성을 만들어야 한다. 예를 들어 CPU 가 x86 ISA 를 제공한다면 x86 에 맞는 빌드 구성을 해야 하고, CPU 가 x86/64 를 제공한다면 거기에 맞는 빌드 구성을 만들어야 한다.


자 우리가 NDK 를 통해 만든 바이너리를 실행할 플래폼의 환경은 어떠한가? 일반적으로 현재 안드로이드 OS 가 돌아 가는 환경은 ARM 코어를 사용하는 리눅스 환경이다. 이는 어떠한 사실을 내포할까?


    • 우리가 C/C++ 응용프로그램을 개발할 때 CreateFile() 과 같은 Win32 API 를 사용할 수 없다.

    • Visual Studio 를 이용할 수 없다. --> VC++ 컴파일러를 사용할 수 없다.


사실 Visual Studio 의 컴파일러를 GCC( GNU Compiler Collection ) C++ 컴파일러로 연결해 놓고 개발할 수는 있을 것이다. 하지만 기본 환경 자체가 Win32 서브시스템과 x86 혹은 x86-64 아키텍처를 위한 개발에 최적화되어 있으므로 참 어려운 일이 될 것이다. 구글링을 해 보면 여러 가지 자료들이 나오기는 하는데 얼마나 편한 지는 잘 모르겠다. 어쨌든 우리는 리눅스 OS 를 기반으로 ARM ISA 에 맞춰서 빌드해야만 하는 상황이고, 윈도우즈 환경에서 이를 가능하게 만들 수 있는 방법을 찾아야만 한다. 


이때 우리에게 한 줄기 빛을 비춰주는 존재가 있으니, 그것이 바로 시그윈이다.


Cygwin 이란 무엇인가?



일단 시그윈 공식 사이트의 설명을 인용해 보도록 하겠다. 출처 : http://cygwin.com/index.html


시그윈은 :

  • 윈도우즈를 위해 리눅스처럼 느껴지는 환경을 제공하는 도구들의 집합이다.

  • 많은 리눅스 API 기능을 제공하는 리눅스 API 레이어로서 동작하는 DLL( cygwin1.dll )이다.


그리고 다음과 같이 착각하지 말라고 경고하고 있다.


시그윈은  :

  • 윈도우즈 상에서 네이티브 리눅스 앱들을 실행하는 방법이 아니다. 당신이 윈도우즈 상에서 프로그램을 실행하기 원한다면, 소스로부터 앱들을 리빌드해야만 한다.
  • signal, pty 등과 같은 유닉스 기능들을 인지하는 네이티브 윈도우즈 앱들을 마술처럼 만들어 주는 방법이 아니다. 다시 말하지만, 당신이 시그윈 기능의 이점을 취하기 원한다면, 소스로부터 앱들을 리빌드할 필요가 있다.


앞에서도 언급했지만 특정 CPU 아키텍처에 대해 리눅스용으로 빌드된 프로그램은 윈도우즈에서 실행될 수 없다. 당연히 윈도우즈 환경에 맞는 구성으로 다시 빌드해야만 한다. 시그윈은 크로스 플래폼 개발을 가능하게 해주는 환경일 뿐이지, 에뮬레이터가 아니라는 것을 명심해야만 한다.


Cygwin 의 작동 원리.



그렇다면 시그윈은 어떻게 해서 리눅스와 같은 개발 환경을 지원하게 되는 것일까?


여러분은 Visual Sutdio 를 통해 프로젝트 설정을 하다가 '서브시스템' 이라는 항목을 본 적이 있을 것이다. 윈도우즈는 여러 개의 서브시스템을 가지고 있는데, 우리가 주로 사용하는 것이 Win32 서브시스템이다. 아래 그림은 Windows NT 의 시스템 아키텍처에서의 POSIX 서브시스템을 보여 주고 있다.


윈도우즈 NT 시스템 아키텍처( 출처 : 위키피디아 )


이 POSIX 라는 것은 Portable Operating System Interface 의 약자로 IEEE 가 운영체제 간의 호환성을 유지하기 위해서 제정한 표준이다.


POSIX( 대충 '파직스'라고 발음됨 )는 "Portable Operating System Interface" 의 머리글자들이며, 운영체제 간의 호환성을 유지하기 위해서 IEEE 에 의해 제정된 표준 패밀리이다. POSIX 는 다양한 유닉스 및 다른 운영 체제들 간의 소프트웨어 호환성을 위해 응용프로그램 인터페이스( API )와 명령줄 쉘, 그리고 유틸리티 인터페이스들을 정의한다.


중략...


유닉스 같은 운영 체제 환경을 위한 POSIX 명세는 원래 코어 프로그래밍 인터페이스를 위한 단일 문서로 구성되어 있었지만, 결국에는 19 개의 분리된 문서로 늘어 났다( 예를 들면 POSIX1, POSIX2, 등 ). 표준화된 사용자 명령 줄과 스크립팅 인터페이스들은 Korn Shell 에 기반했다. awk, echo, ed 등을 포함하는 많은 사용자 수준 프로그램, 서비스, 유틸리티들도 표준화되었으며, 기본적인 I/O( 파일, 터미널, 네트웤 )을 포함하는 프로그램 수준 서비스들도 포함한다. POSIX 는 표준 스레딩 라이브러리 API 도 정의하는데, 이는 현대의 거의 대부분의 OS 에 의해서 지원된다. 요새는 대부분의 POSIX 파트들이 하나의 IEEE Std 1003. 1-2008 표준에 포하모디었으며, 이는 POSIX 1-2008 로 알려져 있다.


하략...


- 출처 : 위키피디아, POSIX


OS/2 라는 것은 MS 와 IBM 이 초기에 제작한 운영체제로 요새는 별로 의미가 없으므로 관심있는 분들은 위키피디아의 OS/2 라는 글을 따로 읽어 보기 바란다.


POSIX 를 지원하는 OS 리스트는 다음 링크의 'POSIX-oriented operating systems' 절에서 찾아 볼 수 있다 : 위키피디아, POSIXGNU/Linux 같은 경우에는 POSIX 에 대해 '거의 대부분의 호환성' 을 가지고 있다. 시그윈은 POSIX 에 대해 '많은 호환성' 을 가지고 있다고 표현되고 있다. 즉 안드로이드 시스템의 기반이 되는 리눅스가 POSIX 를 거의 완벽하게 지원하고 있기 때문에, 우리는 윈도우즈 상에서 시그윈을 통해 거기에 맞는 환경을 구성할 수 있는 것이다.


위에서 윈도우즈의 POSIX 서브시스템에서 언급을 했는데 여기에서 윈도우즈의 POSIX 를 언급한 것은 그냥 예를 든 것 뿐이다. 시그윈이 윈도우즈의 POSIX 서브시스템의 레이어라는 이야기는 아니다. 왜 그럴까? 윈도우즈의 POSIX 서브시스템은 POSIX 표준을 제대로 지키고 있지 않기 때문이다. 


시그윈은 윈도우즈의 POSIX 와는 개별적으로 동작하는 개발환경이다. 시그윈 환경, 시그윈 서브시스템, 시그윈 플래폼 등의 용어를 사용해도 무방하지 않을까 싶다. 시그윈이 윈도우즈의 POSIX 서브시스템의 레이어로서 동작하지 않는 이유는 다음 글을 보면 좀 더 이해가 가지 않을까 싶다 : The Sad History of the Microsoft POSIX Subsystem. 아래에 일부만 인용해 보았다. 요약하면 윈도우즈 POSIX 가 허접(?)이란 것과 XP 부터는 POSIX 서브시스템을 지원하지 않는다는 것이다. 그 뒤의 이야기가 쭉 나오는데 다 읽어 보지는 못했다.


윈도우즈 NT 가 처음 개발되고 있었을 때, 목표 중의 하나는 커널을 프로그래밍 인터페이스와 분리하는 것이었다. NT 는 원래 OS/2 를 성공시키기 위한 것이었지만, 마이크로소프트는 윈도우즈 3.x 응용프로그램들을 실행하기 위한 호환성을 포함시키고, 방위산업 시장에 판매하기 위한 1980 년대 DoD( 국방성 ) Orange Book 과 FIPS 명세들을 만족시키기 원했다. 결과적으로 윈도우즈 NT 는 복잡한 자유재량에 의한 접근 제어 기능을 가진 멀티유저 플래폼으로서 개발되었으며, 하이브리드 마이크로커널 3 유저랜드1 환경들로서 구현되었다 :


  • Windows( Win32 )
  • OS/2
  • POSIX


마이크로소프트는 Win32 문제를 가지고 IBM 과 다퉜으며, NT 프로젝트는 OS/2 와 갈라섰다. 팀의 초점은 Win32 로 이동했다. 그래서 Win32 API 를 호스트하는 Client Server Runtime Subsystem( CSRSS ) 은 의무적이 되었으며, OS/2 와 POSIX 서브시스템이 실제로 완료되지 않았음에도 불구하고 그것들은 윈도우즈 NT 부터 윈도우즈 2000 까지 5 개의 버전에 포함되었다. OS/2 서브시스템은 단지 OS/2 1.0 명령줄 프로그램들만을 실행할 수 있으며, presentation manager 에 대한 지원이 존재하지 않았다. POSIX 서브시스템은 POSIX.1 명세를 지원했지만, 모든 종류의 쉘이나 유닉스 같은 환경을 제공하지 않았다. Win32 가 윈도우즈 95 의 형태에서 성공하면서, OS/2 와 POSIX 서브시스템의 개발은 중단되었다. 그것들은 윈도우즈 XP 와 윈도우즈 서버 2003 에서 완전히 죽고 사라졌다.


반면에 Softway Systems 는 1996 년 쯤에 OpenNT 라고 불리는 유닉스-윈도우즈 NT 간 포팅 시스템을 개발했다. OpenNT 는 NT POSIX 서브시스템 상에서 빌드되었지만, 그것에 살을 붙여 이용할 수 있는 유닉스 환경을 제공했다. 이는 유닉스 시스템이 매우 비싸진 시점이었다. Softway 는 OpenNT 를 사용해서 US Federal agency 들을 위한 여러 유닉스 응용프로그램들을 윈도우즈 NT 로 변경했다. 1998 년에 OpenNT 는 Interix 라고 이름을 바꿨다. Softway Systems 는, 마이크로소프트 POSIX 서브시스템이 지원하지 않았던 시스템 호출을 구현하고, 풍부한 libc,  파일 시스템에 대한 single-rooted view, 그리고 실용적인 gcc 를 개발하기 위해, 최종적으로 NT POSIX 서브시스템에 대한 완전한 대체물을 만들었다.


하략...


위키피디아에 의하면 Windows Server 2003 R2 부터는 사실은 Interix 의 변형인 SUA( Subsystem for UNIX-based Applications )를 통해서 POSIX 를 지원하고 있다고 한다. 이것은 SFU( Windows Services for UNIX )라고 불리기도 한다. Windows Vista 및 Windows 7 의 Enterprise 에디션과 Ultimate 에디션도 SUA 를 포함하고 있다고 한다. 자세한 내용은 Windows Services for UNIX 를 참조하라.


결론.



우리가 윈도우즈 환경에서 리눅스 ARM 용 프로그램을 빌드하기 위해서는, 그에 맞는 바이너리를 생성해 줄 수 있는 환경( 컴파일러, API 등 )을 구성할 필요가 있다. 윈도우즈에서 이를 가능하게 해 주는 것이 POSIX 기반의 시그윈 개발 환경이다. 


우리는  시그윈 환경을 이용해 리눅스 ARM 용 프로그램을 빌드하고, 그것을 안드로이드 장치로 복사하고 설치하게 된다. 이것이 윈도우즈와 리눅스 간의  크로스 플래폼 개발이다. 안드로이드 SDK 를 사용하게 되면 자바 바이트 코드( 플래폼에 독립적인 중간 코드 )를 생성하기 때문에 빌드 환경이 중요하지 않지만, 안드로이드 NDK 는 실제 리눅스 API 를 이용하고 기계어로 컴파일하기 때문에 반드시 올바른 환경에서 개발해야만 한다.


이제 시그윈이라는 것의 정체에 대해 어느 정도 이해할 수 있게 되었을 것이라 생각한다. 그리고 시그윈을 통해 뭔가를 빌드한다는 것의 의미에 대해서 이해할 수 있게 되었을 것이라 생각한다.



'나는 프로그래머다! > 기초 다지기' 카테고리의 다른 글

컴퓨터 시스템과 임베디드 시스템 개념  (0) 2017.09.25
유니코드 이해 하기  (0) 2017.09.19
디자인패턴  (0) 2017.04.01
윈도우 환경에서의 gcc  (0) 2016.10.31
 

I2C 통신

Posted by ironmask84
2016. 10. 27. 15:11 나는 프로그래머다!/Sensor




센서 연구개발에 첫 발을 떼고 있습니다..

센서와 브레드보드(일명 빵판) 사이에는 I2C로 통신을 많이 하는 것으로 보여,
첫 관심사로 잡았습니다. ㅎㅎ


이미 블로그에 정리를 잘해주신 분들의 자료를 참고하려고 하며,
아래에 간단히 머리에 들어오는 블로그 링크 걸어 둡니다. ^^


* I2C통신으로 검색

http://blog.naver.com/jinoh9272/220578118650  <-- I2C 통신에 사용되는 SCL, SDA 와 레지스터들 기본 설명

http://cubloc.blog.me/220051675031  <-- I2C 통신 예시

http://blog.naver.com/gkf9876/220453341286 <-- MPU6050 가속-자이로 센서 +  ATmega128 PCB 예시
http://playground.arduino.cc/Main/MPU-6050 <-- MPU6050  아두이노 페이지

 

  1. I2C 통신에는 Master가 되는 PCB와 Slave가 되는 것들 (센서 등)이 있다.
  2. RS232에 비해 큰 장점이 1 : N 통신이 가능하다는 점이다. (1이 Master, N이 Slave)


 

나와 상대의 조건에 따라서

Posted by ironmask84
2016. 9. 10. 11:50 생각과 일상/아름다운 글


나와 상대의 조건에 따라서

어떤 학생이 생수를 한 병 건네줬어요.
만져보니 선선한 정도였어요.
만약 열대지방의 사람이 그 병을 만진다면 어떻게 느낄까요.
필경 대단히 차갑다고 느낄 겁니다.
어떤 사람은 선선하다고 하고,
어떤 사람은 차갑다고 해요.
그렇다면 생수병에 ‘차가움’이라는 성질이나
'선선함'이라는 성질이 들어 있다는 걸까요?

- 최진석, 도서 '생각하는 힘, 노자인문학' 중에서 -


현실을 받아들이는 것은
자신이 처한 조건이나 상대의 조건에 따라 달라질 겁니다.
누구에게는 선선한 것이 누군가에게는 차갑고
누군가에게 따뜻한 것이 누군가에게는
그저 미지근한 정도의 것이 되는 것도 그런 이유입니다.
그럼에도 그 조건을 생각지 않고
내 기준으로 말하거나 판단하는 경우가 종종 있습니다.
나뿐만 아니라 상대의 상황을 고려한다면
달라지는 문제들이 참 많습니다.


'생각과 일상 > 아름다운 글' 카테고리의 다른 글

3배로 사는 인생  (0) 2011.01.23
사랑이란  (0) 2008.10.07
 

크롬 - IP 우회 확장 플러그인

Posted by ironmask84
2016. 7. 27. 09:07 Excellent Tips


http://bmking2015.tistory.com/905  참조하자.


 

[안드로이드-API] Layout Traversal

Posted by ironmask84
2016. 7. 8. 10:46 나는 프로그래머다!/Java & Android


Example.java

/* basic usage */

ViewGroup root = (ViewGroup) findViewById(android.R.id.content);

 

LayoutTraverser.build(new LayoutTraverser.Processor() {

  @Override

  public void process(View view) {

    // do stuff with the view

  }

}).traverse(root);


/* traverse multiple hierarchies using the same processing logic */

LayoutTraverser traverser = LayoutTraverser.build(new LayoutTraverser.Processor() {

  @Override

  public void process(View view) {

    // do stuff with the view

  }

});

 

traverser.traverse(root);

traverser.traverse(root2);

traverser.traverse(root3);



/* two static methods: finding views by tag and finding views of a specific type */

// all views tagged "coolView" under "root"

List<View> coolViews = Views.find(root, "coolView");

 

// all ImageView views under "root"

List<ImageView> imageViews = Views.find(root, ImageView.class);


LayoutTraverser.java
package com.androidwtf.android;
 
import android.view.View;
import android.view.ViewGroup;
 
public class LayoutTraverser {
  public interface Processor {
    void process(View view);
  }
 
  private final Processor processor;
 
  private LayoutTraverser(Processor processor) {
    this.processor = processor;
  }
 
  public static LayoutTraverser build(Processor processor) {
    return new LayoutTraverser(processor);
  }
 
  public void traverse(ViewGroup root) {
    final int childCount = root.getChildCount();
 
    for (int i = 0; i < childCount; ++i) {
      final View child = root.getChildAt(i);
      processor.process(child);
 
      if (child instanceof ViewGroup) {
        traverse((ViewGroup) child);
      }
    }
  }
}


Views.java

package com.androidwtf.android;

 

import android.view.View;

import android.view.ViewGroup;

 

import java.util.ArrayList;

import java.util.List;

 

final public class Views {

  private Views() {}

 

  public static List<View> find(ViewGroup root, Object tag) {

    FinderByTag finderByTag = new FinderByTag(tag);

    LayoutTraverser.build(finderByTag).traverse(root);

    return finderByTag.getViews();

  }

 

  public static <T extends View> List<T> find(ViewGroup root, Class<T> type) {

    FinderByType<T> finderByType = new FinderByType<T>(type);

    LayoutTraverser.build(finderByType).traverse(root);

    return finderByType.getViews();

  }

 

  private static class FinderByTag implements LayoutTraverser.Processor {

    private final Object searchTag;

    private final List<View> views = new ArrayList<View>();

 

    private FinderByTag(Object searchTag) {

      this.searchTag = searchTag;

    }

 

    @Override

    public void process(View view) {

      Object viewTag = view.getTag();

 

      if (viewTag != null && viewTag.equals(searchTag)) {

        views.add(view);

      }

    }

 

    private List<View> getViews() {

      return views;

    }

  }

 

  private static class FinderByType<T extends View> implements LayoutTraverser.Processor {

    private final Class<T> type;

    private final List<T> views;

 

    private FinderByType(Class<T> type) {

      this.type = type;

      views = new ArrayList<T>();

    }

 

    @Override

    @SuppressWarnings("unchecked")

    public void process(View view) {

      if (type.isInstance(view)) {

        views.add((T) view);

      }

    }

 

    public List<T> getViews() {

      return views;

    }

  }

}


출처 : https://gist.github.com/gelitenight/7999448

 

[Java] String, StringBuffer, StringBuilder 차이

Posted by ironmask84
2016. 6. 17. 17:18 나는 프로그래머다!/Java & Android


0. 들어가기 전에

 자바에서 String 문자를 더해가는건 큰 이슈가 있습니다. 보통 사람들은 String 에서 +를 이용하여 문자를 결합합니다. 이 방법은 작은 규모의 몇백자 정도로는 그렇게 큰 차이를 보이지 않을지도 모르지만 잘 모르고 쓴다면 작은 규모에서도 큰 차이를 보여줍니다. 이번에는 그 차이를 한번 따져보려고 합니다.  

 

1. 이론적인 차이

 

 1-1. String의 경우 

 

자바에서 String은 Immutable(불변의) 속성을 가지고 있습니다. 우리는 보통 String을 저장할 때 이렇게 합니다.

 

 String name = "펭귄";  

 name="치킨";  // 펭귄을 치킨으로 바꿨습니다.

 

 

위와 같이 한다면 name에 있던 펭귄이라는 치킨으로 수정되는 것 처럼 보이지만 내부적으로는 수정되는 것이 아니라 새로운 메모리를 잡고 치킨이라는 값을 저장한 후 그 곳을 가리키는 방식이 됩니다.

 

 

 

 

 + 연산자로 더하는 작업도 마찬가지입니다.

 

 String name = "펭귄";

 name = "심해"+ name; //결과 값은 심해펭귄이라고 저장됩니다.

 

새로운 메모리를 할당하여 그곳에 심해펭귄 이라는 글자를 저장하고 name이 그곳을 가리키게 한 후 기존의 펭귄이 저장된 메모리를 Garbage Collection이 제거해줍니다. 

 

 

 

단순히 문자를 몇개 더하는 경우도 이 과정을 거치지만 몇번 이내로 끝나는 횟수라면 굳이 다른 것을 쓰지 않으셔도 됩니다. (StringBuilder가 빠르지만 ns 단위의 차이입니다.) 다만 긴 문자를 몇 백번 이상 더할 경우에는 성능이 내려갈 수 있으므로 StringBuilder나 StringBuffer를 써주시는게 좋습니다. 

 

JDK5 이상의 버전부터는 String도 내부적으로 StringBuilder로 바꿔서 컴파일한다고는 하는데 막상 해보면 그다지 차이가 없습니다. 

 

 

 

 

 

1-2. StringBuilder와 StringBuffer의 경우

 

 StringBuilder와 StringBuffer는 String 과 다르게 가변의 속성을 가지고 있습니다. 그래서 할당된 공간에 계속 이어가는게 가능하며, append 메소드를 이용하여 문자를 추가합니다. 또한 할당된 공간이 오버플로우가 발생한 경우에는 자동으로 할당된 공간을 확장합니다. 

(이때 오버해드가 발생하여 속도가 약간 저하되는 듯 합니다.)

 

 StringBuilder의 경우 StringBuffer와 달리 동기화 된다는 보장을 하지 않지만 StringBuffer보다는 조금 빠른 속도를 보여줍니다.

만약 멀티 스레드를 사용하는 경우에는 동기화를 해야하는 경우가 생기는데  이 경우에는 StringBuffer를 이용하여야 합니다. StringBuffer는 멀티 스레드 작업에 대해서 안전하게 만들어져 있습니다. 하지만 일반적인 경우에는 멀티 스레드를 사용할 일이 별로 없으므로 StringBuilder를 사용하시면 되겠습니다.

 

 

 

 

2. 실제 속도 차이

 

속도를 계산하는 간단한 소스를 짜봤습니다. 글자수는 10자를 기준으로 하여 횟수를 조정하여 총 100자부터 10만자까지 더하도록 하겠습니다. 같은 시행횟수라도 시행때마다 값의 차이가 생깁니다. 하지만 그 차이는 그렇게 크지 않으며, 그 흐름 또한 일치하므로 오차가 조금 있을 수 있다 정도는 염두해 두시면 되겠습니다. 추출한 값은 ns로 추출하였지만 후반의 숫자가 매우 크므로 ms로 변환하여 표기하도록 하겠습니다.

 

 public class Main {

public static void main(String[] args) {

final int CYCLE_RATE = 10; //횟수 (10에서 10000까지 올릴겁니다) 

final String TEST_STR = "abcde12345";  //10자

for(int idx = 1; idx <= 10; idx ++){

System.out.print(idx*10*CYCLE_RATE +"\t\t"); //총 횟수

}

System.out.println("\n");

for(int idx = 1; idx <= 10; idx ++){

StringBuilderTest(CYCLE_RATE * idx, TEST_STR);

}

System.out.println("\n================================================================");

for(int idx = 1; idx <= 10; idx ++){

StringBufferTest(CYCLE_RATE * idx, TEST_STR);

}

System.out.println("\n================================================================");

for(int idx = 1; idx <= 10; idx ++){

StringTest(CYCLE_RATE * idx, TEST_STR);

}

}

public static void StringTest(int cycle, String txt){

long before = System.nanoTime();

String testString = "";

for(int idx = 0; idx < cycle; idx++){

testString += txt; //20자

}

long after = System.nanoTime();

System.out.print((after - before)+"\t\t");

}

public static void StringBuilderTest(int cycle, String txt){

long before = System.nanoTime();

String testStringBuilder = "";

StringBuilder builder = new StringBuilder();

for(int idx = 0; idx < cycle; idx++){

builder.append(txt);

}

testStringBuilder = builder.toString();

long after = System.nanoTime();

System.out.print((after - before)+"\t\t");

}

public static void StringBufferTest(int cycle, String txt){

long before = System.nanoTime();

String testStringBuffer = "";

StringBuffer buffer = new StringBuffer();

for(int idx = 0; idx < cycle; idx++){

buffer.append(txt);

}

testStringBuffer = buffer.toString();

long after = System.nanoTime();

System.out.print((after - before)+"\t\t");

}

}

 

 

10개자리 문자를 시행횟수만큼 더한 결과입니다.

문자를 10개 정도 더해도 String이 builder나 buffer보다 3-4배 정도 느린걸 알 수 있습니다. StringBuffer의 경우 처음 버퍼를 생성하는 시간 때문인지 첫 시행때 다소 시간이 걸립니다.

builder와 buffer가 속도가 느려졌다 빨라졌다 하는건 할당한 메모리가 다 차서 메모리를 늘려주는 작업을 하기 때문인 듯 합니다. 

 

 시행횟수

 10

 20

 30

 40

 50

 60

 70

 80

 90

 100

 StringBuilder

 0.009 ms

 0.012 ms

 0.016 ms

 0.027 ms

 0.03 ms

 0.03 ms

 0.039 ms

 0.037 ms

0.076  ms

 0.04 ms

 StringBuffer

 0.048 ms

 0.011 ms

 0.018 ms

 0.021 ms 

 0.023 ms 

0.027 ms  

 0.039 ms

 0.029 ms

 0.032 ms 

 0.04 ms

 String

 0.022 ms

 0.039 ms

 0.059 ms 

0.116 ms

 0.063 ms

0.077 ms 

0.133 ms 

 0.213 ms

0.129 ms

0.149 ms 

 

 

시행횟수가 백번 이상으로 넘어가면 속도차이가 확연하게 벌어집니다. Builder와 Buffer는 그렇게 큰 차이가 나진 않지만 String과의 차이는 40배 이상으로 벌어졌습니다.

 시행횟수

 100

 200

 300

 400

 500

 600

 700

 800

 900

 1000

 StringBuilder

 0.047 ms

 0.09 ms

 0.14 ms

 0.14 ms

 0.19 ms

 0.15 ms

 0.1 ms

 0.056 ms

0.056  ms

 0.076 ms

 StringBuffer

 0.050 ms

 0.021 ms

 0.032 ms

 0.040 ms 

 0.056 ms 

0.066 ms  

 0.052 ms

 0.057 ms

 0.061 ms 

 0.078 ms

 String

 0.15 ms

 0.44 ms

 2.3 ms 

0.85 ms

 2.9 ms

1.9 ms 

1.7 ms 

 2.2 ms

2.8 ms

3.5 ms 

 

 

시행횟수가 1000이 넘어가면 String과의 격차는 몇백배 입니다.

 시행횟수

 1000

 2000

 3000

 4000

 5000

 6000

 7000

 8000

 9000

 10000

 StringBuilder

 0.44 ms

 0.52 ms

 0.19 ms

 0.27 ms

 0.22 ms

0.24 ms

 0.37 ms

 0.45 ms

 0.38 ms

 1.74 ms

 StringBuffer

 0.14 ms

 0.17 ms

 0.18 ms

 0.23 ms 

 0.24 ms 

 0.26 ms  

 0.33 ms

 0.33 ms

 1.65 ms 

 0.4 ms

 String

 5.8 ms

 16.9 ms

35.1 ms 

66.4 ms 

 100.98 ms

138.43 ms 

190.3 ms 

 266.6 ms

331.78 ms 

417.3 ms

 

 

시행횟수가 10만이 되면 String은 너무 느려서 쓸 수 없습니다. 1000ms = 1초인데 62000ms라면 62초나 걸리게 됩니다.

문자가 200만개가 되니 610000 ms가 걸렸습니다. 610초 즉 10분입니다.

 시행횟수

 100000

 200000

 300000

 400000

 500000

 600000

 700000

 800000

 900000

 1000000

 StringBuilder

 9.7 ms

 8.8 ms

 18.6 ms

 15.2 ms

 29 ms

23.7 ms

 29.5 ms

 37.4 ms

 34.7 ms

 56.2 ms

 StringBuffer

 5.6 ms

 13 ms

 15.9 ms

 23.7 ms 

 25.9 ms 

 32.6 ms  

 40.6 ms

 39.5 ms

 48.7 ms 

 60.7 ms

 String

 62024 ms

  613483 ms

 ...ms 

 ...ms 

 ... ms

 ...ms 

 ...ms 

 ... ms

... ms 

... ms

 

 

덤으로 1개짜리 문자를 10000번 더하는 것이 100개짜리 문자를 100번 더하는것보다는 오래 걸리며, 100자짜리 문자를 100번 더하는 것이, 10자짜리 문자를 100번 더하는 것보다 오래 걸립니다.


펌 : http://blog.naver.com/platinasnow/220197411183


** CharSequences 인터페이스

CharSequences는 인터페이스로 String/StringBuffer/StringBuilder 세가지 클래스는 모두 

CharSequences 인터페이스를 상속받고 있습니다.


때문에 Charsequence에는 위 3가지 클래스를 모두 수용할 수 있습니다.(Up-casting)

또한 사용할 때에는 down-casting 해서 사용하시면 됩니다.


String/StringBuffer/StringBuilder 세가지 클래스를 매개변수로사용하는 함수라면 매개변수를 Charsequence로 해주는 좋겠죠?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class CharSequenceTest {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        anythingString("a");
        anythingString(new StringBuffer("a"));
        anythingString(new StringBuilder("a"));
    }
    
    public static void anythingString(CharSequence c){
        System.out.println(c);
    }
   
}
 
 

펌 : http://blog.naver.com/tkddlf4209/220706609022