안드로이드 개발 재개 from 2020 #1

Posted by ironmask84
2021. 1. 18. 18:16 나는 프로그래머다!/Java & Android




컴퓨터공학을 전공하면서 Java를 배웠고..

직장인이 되어 휴대폰 SW개발을 하면서.. C로 시작해서..

안드로이드 스마트폰이 유행하면서 다시 Java를 하다가..


이제는 프로그래밍과는 관련없는 업계의 IT직군? 으로 이직을 해있어서..

근 2년 동안은 겨우겨우 노력해서 2019년엔 자바로 프로그램 하나 개발해서

직장 내 자체 공모전에 출품하고..

2020년엔 안드로이드 앱 하나 해보자 해보자 하면서...

감각도 잃고, 의지도 좀 없어서 힘든 가운데 있지만...

11월 부터 계획을 세우고, 내가 좋아하는 도서관에서 책 3권 빌렸다.

항상 이렇게 뭔가 도전할 때는 시작할 때가 많이 설레인다.. ㅎㅎ


그리고 앞으로의 내 커리어와 직장 생활에 있어서

IT는 계속 되어야 하기에..

꾸역꾸역 안드로이드 개발 책을 펼쳐보고 있는 중이다..

이번 앱 개발 목표는 광고까지 심어서 구글플레이에 출품하여, 수익 도전해보기...


3년전만 해도 어느정도는 알았는데.. 아니 5년 전인가 ㅜㅜ

안드로이드 개발에 손땐지 5년쯤은 되었구나;;;

안드로이드 스튜디오가 막 나올 때쯤 이클립스를 계속 사용하다가,

개발 경험이 끊긴 것 같다..


그래서 이제 다시 살포시 해보려고..

안드로이드 스튜디오를 설치하고...

그 때 기억에도 안드로이드 스튜디오가 너무 기능이 많고, 무겁기도 했고..

그런데 익혀두면, 확실히 능률적인 부분도 많긴 할듯...


Do it! 안드로이드 앱 프로그래밍 책이 제법 설명이 잘되어 있는듯 하다.

따라 해보기가 수월함.. ㅎㅎㅎ

그리고, 처음으로 구글플레이에 앱을 등록해보기도 함.

우선, 개발자 등록을 play.google.com/console 에서 25달러 주고 해야함.

평생 앱 업로드가 가능하니까 25달러 쯤이야!





위 과정으로 개발 계정이 만들어지고!

다음 포스팅은,

앱 하나 만들어서 구글플레이에

업로드하는 과정을 보여주겠다!



 

Java 프로그램 jar를 exe로 만들기

Posted by ironmask84
2019. 10. 1. 22:55 나는 프로그래머다!/Java & Android


올해 8월부터 해서 아주 오랜만에 자바 프로그램을 하나 만들었네요..

프로그래밍 감각 유지 및 회사에 실적도 쌓을 겸.. ㅋㅋ


꼭 프로그램 개발 회사가 아니더라도,

프로그램을 개발해서 회사 업무에 효율화를 가져다주는 Tool 개발은

회사 업무에도 유용하고, 본인의 평가도 높일 수 있습니다.


만드는 김에 실행용 Jar로 만들어 보자 하고 있다가

아주 예전에 어렴풋이 남아 있던 기억에서 

exe로도 만들어주는 tool 이 있다는 것을 떠올렸네요..


혹시나 JRE가 설치 되어 있지 않는 윈도우 PC에서도 

실행이 될까하는 마음에 알아보고 만들어 보았지만..

역시나 JRE 설치 없이는 안되네요 ㅋㅋ


우선 사용한 Tool은 "Launch4j" 라는 툴입니다.

http://launch4j.sourceforge.net/index.html  를 참조해주세요.

인터넷에 검색해보면 exe 만드는 툴로 Jsmooth가 많이 소개되어 있지만,

저는 그 툴로는 만들어지지가 않았습니다...

저처럼 Jsmooth가 안되는 분들은 "Launch4j"  추천 드립니다.

https://blog.naver.com/cigus/120128400630  에 설명 잘되어 있으니 추천!




그래도 exe로 만들어줄 뿐 아니라,

JRE가 설치되어 있지 않으면,

JRE 다운로드 페이지로 안내해주는 기능까지 추가 된다는 점이 돋보입니다!!


또 개발에 좋은 팁이 있으면 공유할게요~




 

안드로이드 기본개념 면접대비 정리

Posted by ironmask84
2019. 7. 15. 22:31 나는 프로그래머다!/Java & Android



안드로이드가 나온지도 10년이 지났다.

우리나라에 막 나타나기 시작한 것이 2009년 쯤이니..

아직도 스마트폰은 안드로이드가 우세다.

아이폰 OS를 제외하면 견줄 것이 없다.


구글의 무서움은 모바일폰에서 그치지 않는다.

LTE, WiFi, Bluetooth 등을 활용한 무선통신이 가능한 기기들

모두의 시장을 점유하기 위해, 즉 IoT 시장을 차지하기 위한

다양한 용도의 OS들을 만들어가고 있다.


어찌되었든 아직까지도 기본은 안드로이드로 시작한다.

안드로이드는 리눅스를 기반으로해서 C, C++, Java 등

다양한 언어를 활용해 구성되어있는 플랫폼이다.

WiFi, LCD, LTE 등 다양한 HW를 구동시키는 드라이버단,

그 위에 이를 컨트롤하는 Hal단,

그 위에 이를 컨트롤하는 Framework단

그 위에서 움직이는 다양한 App과 Service 들...


너무나 방대하기에 이 플랫폼을 활용하는 것도 

그때 그때 찾아보고 공부하지 않으면 힘이 든다.

구글은 이렇게 방대한 플랫폼을 오픈형으로 키웠고

이러한 생태계를 형성함으로써 

IT 시장의 점유율을 높인 무서운 정책을 펼친 회사다.


각설하고...

안드로이드를 활용한 취업시장은
아직 유효할 듯 하다는 것이 포인트!!

이러한 안드로이드를 조금 안다고 면접장에서 방귀를 끼려면

아래에 정리한 것들을 참고하시라.
어디서 본 정보를 취합하고 내 생각도 더한 자료 이다.


보충이 필요한 부분은 댓글로 언제나 환영이다.

Q0. 안드로이드의 실행환경에 대해서 간단하게 설명하시오.

안드로이드는 크게 4가지 실행환경으로 구성되어있습니다. 가장 하단부터 리눅스 커널, 라이브러리, 어플리케이션 프레임워크, 어플리케이션 순서입니다. 리눅스 커널은 OS로 안드로이드 스마트폰의 다양한 하드웨어(화면, 카메라, 블루투스, GPS, 메모리 등)를 관리합니다. 라이브러리는 안드로이드에 있는 다양한 기능(UI 처리, 미디어 프레임워크, 데이터베이스, 그래픽 처리, 웹 킷 등)을 소프트웨어적으로 구현해 놓은 환경 뿐만 아니라 안드로이드 앱을 구동해주는 dalvik 가상머신과 코어 라이브러리까지 포함하는 영역입니다. 어플리케이션 프레임워크는 사용자의 입력(액티비티, 윈도우, 컨텐츠, 뷰, 노티피케이션 등) 또는 특정한 이벤트에 따라 출력을 담당하는 환경을 말합니다. 마지막으로 실제로 동작하는 앱이 설치되는 환경인 어플리케이션이 있습니다.


Q1. 안드로이드는 다른 플랫폼에 비해 어떤 장점이 있는가?

첫째로 안드로이드를 구성하는 모든 소스가 오픈소스로 무료로 개방되어있어 비용적인 부담이 없습니다. 또한 전 세계의 수많은 개발자로부터 피드백을 받아 수정되기 때문에 안정성과 버그 수정이 빠릅니다. 그 밖에도 원한다면 소스를 다운 받아 수정해서 쓰기 편리합니다. 둘째로 자바를 주 언어로 사용하고 있기 때문에 많은 세계적으로 점유율이 높은 자바 개발자들이 쉽게 개발할 수 있습니다. 셋째로 리눅스 커널을 OS로 채택했기 때문에 다양한 하드웨어에 대한 드라이버 소스가 풍부합니다. 마지막으로 구글의 다양한 앱과 연동이 매우 편리하며 다른 플랫폼에 비해 앱간 연동에 너그러운편입니다.


Q2. 안드로이드 프로젝트 구성요소에 대해서 설명하시오.

libs : 프로젝트에서 사용하는 다양한 라이브러리 소스가 저장되는 공간입니다.

androidTest : 앱의 일부 코드를 테스트하기 위한 소스를 저장하는 공간입니다.

java : 자바 코드를 저장하는 공간입니다. 표준 자바와 동일하게 패키지를 이용한 하위 디렉토리 생성 방식을 사용합니다.

res : 리소스(이미지, xml 레이아웃, 메뉴, 값)를 저장하는 공간입니다.

AndroidManifest.xml : 앱에 대한 전체적인 정보를 담고있는 파일입니다. 앱의 구성요소와 실행 권한 정보가 정의되어있습니다.

project > build.gradle : 프로그래머가 직접 작성한 그래들 빌드 스크립트 파일입니다.

gradle > build.gradle : 앱에 대한 컴파일 버전정보, 의존성 프로젝트에 대한 정의가 되어있는 파일입니다.


Q3. 안드로이드에서 다국어 지원을 위해 해야할 작업에 대해서 설명하시오.

다국어 지원을 위해서는 value resource file을 따로 생성해주는 방식으로 사용합니다.

'values > 마우스 오른쪽 버튼 클릭 > value resource file > 리소스 파일 이름을 strings로 입력 > available qualifiers 탭에서 locale 선택 > language 탭에서 언어 선택 > specific region only에서 세부 국가 선택'

파일을 생성하면 디렉토리의 이름은 values-국가코드(예를 들어 values-kr) 형식으로 생성되며 내부에 strings.xml 파일이 생성됩니다. 해당 파일에 string의 name 값은 동일하게 유지한 후 해당 국가의 언어로 번역하여 추가하면됩니다.


Q4. 안드로이드 매니페스트(android manifest) 파일에 대해서 설명하시오.

안드로이드 매니페스트는 앱의 이름, 버전, 구성요소, 권한 등 앱의 실행에 있어서 필요한 각종 정보가 저장되어있는 파일입니다. 반드시 존재해야하는 xml 형식의 파일로 안드로이드 프로젝트의 최상위에 위치하고 있습니다.

가장 최상위는 manifest 태그가 위치하고 있습니다. manifest 태그에는 패키지명, 앱 버전 코드, 앱 버전 이름을 정의합니다.

application 태그에는 앱 아이콘, 앱 이름을 정의합니다.

activity 태그에는 액티비티의 클래스명과 액티비티 이름을 정의합니다. 하위에는 intent-filter 태그를 이용하여 액티비티에 대한 인텐트 작업시 필요한 action과 category를 정의합니다.

service, receiver, provider 태그에는 각각 서비스, 리시버, 프로바이더에 대한 내용을 정의합니다.

permission 태그에는 앱에서 필요한 권한에 내용을 정의합니다.

그 밖에 최소 안드로이드 SDK 버전을 지정하는 uses-sdk와 다른 패키지를 등록할 수 있는 uses-library 태그 등이 존재합니다.


Q5. 디스플레이(display), 윈도우(window), 서피스(surface), 뷰(view), 뷰 그룹(view group), 뷰 컨테이너(view container), 레이아웃(layout)에 대해서 설명하시오.

디스플레이 : 안드로이드 단말기가 가지고 있는 하드웨어 화면을 의미합니다.

윈도우 : 안드로이드에서 실행되는 앱이 그림(뷰)을 그릴 수 있는 영역을 의미합니다. 사용자로부터 입력(터치, 키) 이벤트를 받아 앱에 전달합니다.

서피스 : 윈도우에 그림(뷰)을 그릴 때 그림이 저장되는 메모리 버퍼를 의미합니다.

뷰 : 사용자 인터페이스를 구성하는 최상위 클래스를 말합니다. 윈도우의 서피스를 이용하여 화면에 어떤 모양으로 그림을 그릴지와 발생하는 이벤트를 어떻게 처리할 것인지에 대한 기능을 구현하고 있습니다. 뷰 중에서 일반적인 제어 역할을 하고 있는 것들을 위젯이라고 합니다.

뷰 그룹 : 여러개의 뷰를 포함하고 있는 뷰를 의미합니다.

뷰 컨테이너 : 다른 뷰를 포함할 수 있는 뷰를 의미합니다. 대표적으로 리스트 뷰(list view), 스크롤 뷰(scroll view), 그리드 뷰(grid view) 등이 있습니다.

레이아웃 : 뷰 그룹 중에서 내부에 뷰를 포함하고 있으면서 해당 뷰를 어떻게 윈도우에 배치할지 정의하는 관리자 역할을 하는 클래스 말합니다.


Q6. 인플레이션(inflation)이란 무엇인가?

xml 레이아웃 파일로 정의한 정보를 런타임에 setContentView 메소드가 호출됨에 따라 메모리 상에 객체로 만들어주는 과정을 말합니다. 이 과정에서 xml 레이아웃 파일에서 뷰에 id를 설정하고 해당 id가 R.java 파일에 주소 값으로 환원되며 findViewById 메소드와 id를 이용하여 코드 상으로 뷰 객체를 가져와 제어할 수 있습니다.


Q7. 안드로이드에서 색상을 지정하는 다양한 방식은 어떤 것들이 있는가?

#RGB, #ARGB, #RRGGBB, #AARRGGBB 총 4가지 방식이 있습니다. R은 붉은색, G는 초록색, B는 파란색의 정도를 나타내며 A는 알파 값 즉 투명도를 나타내는 수치입니다. 각각의 요소는 16진수(0부터 F까지)로 표현합니다.


Q8. 안드로이드의 크기를 표현하는 다양한 표현방법에 대해서 설명하시오.

픽셀(px) : 화면의 픽셀을 의미합니다.

밀도 독립적 픽셀(dp, dip) : 160dpi(160인치에 들어가있는 픽셀 수) 화면을 기준으로 한 픽셀을 의미합니다.

축척 독립적 픽셀(sp, sip) : 가변 글꼴을 기준으로 한 픽셀을 의미합니다. 글꼴의 설정에 따라 차이가 있습니다.

텍스트 크기(em) : 글꼴과 상관없이 동일한 텍스트 크기를 표시하기 위한 단위입니다.

그 외 인치(in), 밀리미터(mm)가 있습니다.


Q9. 안드로이드의 4대 컴포넌트(component)에 대해서 간단하게 설명하시오.

안드로이드의 4대 컴포넌트는 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더입니다. 첫 번째로 액티비티는 안드로이드에서 화면을 관리하고 사용자가 발생시키는 다양한 이벤트를 처리하는 컴포넌트입니다. 두 번째로 서비스는 화면에서 보이지 않지만 특정한 기능을 백그라운드에서 수행하는 컴포넌트입니다. 세 번째로 브로드캐스트 리시버는 특정 안드로이드에서 발생하는 특정 브로드캐스트 메세지를 처리하기 위한 컴포넌트입니다. 네 번째로 콘텐트 프로바이더는 앱간 데이터의 공유를 위해 표준화된 인터페이스를 제공하는 컴포넌트입니다.


Q10. 안드로이드 MVC 모델은 어떻게 구성되어있는가?

안드로이드에서 뷰는 화면에 실제로 보이는 구성을 만드는 영역으로 View 클래스를 상속하는 클래스를 이용하여 구성할 수 있습니다. 다음으로 컨트롤러는 뷰와 모델을 서로 연결하며 제어하는 영역으로 액티비티, 서비스, 브로드캐스트 리시버, 프래그먼트로 구성됩니다. 마지막으로 모델은 앱의 다양한 데이터를 저장하는 역할로 SQLite를 이용한 DB, SharedPreference를 이용한 파일 시스템, 콘텐트 프로바이더가 있습니다.


Q11. 액티비티(activity)가 무엇인지와 액티비티 생명주기에 대해서 설명하시오.

안도르이드에서 화면을 관리하며 사용자가 발생시키는 다양한 이벤트를 처리하는 컴포넌트입니다.

부모 액티비티에서 새로운 자식 액티비티를 실행하고자 한다면 먼저 매니페스트 파일에 해당 자식 액티비티를 추가 해줘야합니다. 다음으로 부모 액티비티에서 startActivity 메소드에 인텐트를 파라미터로 넘겨 실행하거나 startActivities 메소드를 이용하여 여러개의 액티비티를 한꺼번에 실행할 수 있습니다.

액티비티의 실행과정은 첫 번째로 부모 액티비티에서 자식 액티비티를 생성 및 호출합니다. 두 번째로 액티비티 매니저 서비스가 해당 앱 프로세스에서 인텐트를 복사해온 후 매니페스트 파일에서 해당 인텐트에 명시되어있는 액티비티를 찾고 어떻게 실행시켜야할지 결정합니다. 세 번째로 찾아낸 액티비티를 실행하고 다시 해당 앱 프로세스에 인텐트를 복사하여 넘겨줍니다. 그 외 자식 액티비티 내의 onCreate 메소드에서 setContentView 메소드에 레이아웃의 아이디를 파라미터로 넘겨 해당 액티비티의 화면을 구성하게됩니다.

액티비티는 크게 3가지 상태가 존재합니다. 먼저 실행(running) 상태는 액티비티 스택의 최상위에 있으며 포커스를 가지고 있어 사용자에게 보이는 상태입니다. 다음으로 일시 중지(paused) 상태는 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태를 말합니다. 예를들어 대화상자가 위에 있어 일부가 가려져 있는 경우를 말합니다. 마지막으로 중지 (stopped) 상태는 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태를 말합니다.

액티비티가 처음 만들어지면 onCreate 메소드가 호출되어 레이아웃을 구성합니다. 이후 onStart 메소드가 화면에 보이기 직전에 호출됩니다. 다음으로 onResume 메소드가 사용자 상호작용(화면이 포커스를 얻었을 때)하기 바로 전에 호출됩니다. 이 3가지 메소드가 호출되어 액티비티는 실행 상태를 갖게됩니다. 이후 포커스를 잃었을 때 onPause 메소드가 호출되고 일시 중지 상태가 됩니다. 일시 중지 상태에서 다시 포커스를 획득하면 onResume 메소드가 호출되거나 다른 액티비티에 의해서 완전히 화면이 가려졌는지 여부를 확인하여 가려져 보이지 않는 경우 onStop 메소드가 호출되어 중지 상태가됩니다. 정지 상태에서 다시 화면이 보이기 직전에 onRestart 메소드가 호출되고 onStart 메소드가 차례로 호출됩니다. 그 외 finish 메소드가 실행되어 해당 액티비티가 종료되기 직전에 onDestroy 메소드가 실행됩니다.

가끔은 일시 중지나 중지 상태에서 시스템이 메모리가 부족하다고 판단될 경우 onCreate 메소드부터 다시 해당 액티비티를 구동합니다. 이 경우 onStop, onResume 메소드 호출이 생략됩니다. 따라서 onSaveInstanceState, onRestoreInstanceState 메소드를 이용하여 액티비티가 갑자기 죽을 것을 대비해서 상태를 저장하고 복원하기 위한 작업을 정의해줄 수 있습니다.


Q12. 액티비티간 데이터 전달에서 임의의 클래스 객체를 바로 전달하지 못하는 이유는 무엇이고 전달하기 위해서는 어떤 처리가 필요한가?

액티비티간 전달할 수 있는 데이터의 type은 보통 기본형으로 정해져있습니다. 그 이유는 인텐트를 이용하여 액티비티의 데이터를 전달하는 과정에서 현재 실행중인 앱 프로세스가 시스템 프로세스로 실행중인 액티비티 매니저 서비스 프로세스에게 인텐트를 전달합니다. 이 경우 프로세스간 통신이기 때문에 인텐트에 있는 값들을 복사하여 넘기는 방식으로 처리되기 때문에 객체 주소를 바로 넘기지 못하는 문제가 발생합니다. 따라서 이 문제를 해결하기 위해 자신이 임의로 만든 클래스 객체를 전달하기 위해서는 Serilizable이나 Parcelable 인터페이스를 상속받아 객체를 직렬화하여 넘기는 방식을 사용해야합니다.


Q13. 부모 액티비티에서 자식 액티비티의 결과 값을 받아오기 위해 어떻게 해야하는가?

먼저 부모 액티비티에서 startActivityForResult 메소드를 이용하여 인텐트와 리퀘스트 코드를 파라미터로 넘깁니다. 이후 자식 액티비티에서 setResult 메소드에 결과 코드와 데이터를 파라미터로 넘깁니다. 다시 부모 액티비티에서 onActivityResult 메소드를 오버라이딩하여 자식 액티비티에서 보낸 결과 코드와 데이터를 받아 처리하는 코드를 작성할 수 있습니다. 이후 실행과정에서 자식 액티비티의 finish 메소드가 호출되면 부모 액티비티가 다시 화면에 나타나면서 onResume 메소드가 실행됩니다. 이때 onActivityResult 메소드가 작동하게 됩니다.


Q14. 안드로이드가 리소스(resource)를 접근하는 방식에 대해서 설명하시오.


Q15. 서비스(service)가 무엇인지와 서비스 생명주기에 대해서 설명하시오.

서비스는 백그라운드에서 실행되는 구성 요소입니다. 서비스는 사용자에게 보이는 화면이 존재하지 않으며, 정해지지 않은 시간 동안 운영됩니다. 각각의 서비스는 매니페스트 파일에 서비스 태그를 이용하여 선언해야합니다. 서비스는 Service 클래스를 상속받아 onStartCommand 또는 onBind 메소드를 재정의하여 구현할 수 있습니다.


서비스는 다른 구성 요소들처럼 메인 쓰레드에서 동작합니다. 따라서 CPU를 많이 사용하거나 대기 상태를 필요로 하는 경우 새로운 쓰레드를 이용하여 생성해야합니다. 또한 서비스의 객체는 단말에서 오직 1개만 생성되어 관리합니다.


먼저 서비스가 startService 메소드로 실행되는 경우 서비스가 생성될 때 onCreate 메소드가 실행됩니다. 이후 서비스가 실행을 시작할 때 onStartCommand 메소드가 호출되며 서비스의 상태가 실행중으로 변경됩니다. 이후 stopService 메소드가 실행되면 서비스가 종료되며 onDestroy 메소드를 호출하며 서비스의 상태가 종료로 변경됩니다.


다음으로 서비스가 bindService 메소드로 실행되는 경우 서비스가 생성될 때 onBind 메소드가 호출됩니다. 다음으로 unbindService 메소드가 호출되어 바인딩이 해제되면 onUnbind 메소드가 호출됩니다. 이후 완전히 종료될 때 onDestroy 메소드가 호출됩니다.


Q16. 브로드캐스트 리시버(broadcast receiver)가 무엇인가?


Q18. 인텐트(intent)와 인텐트 필터(intent filter)에 대해서 설명하시오.

Intent : 어떤 Activity에 데이터를 보낼 때 값들을 지정하기 위해 사용

인텐트필터 : AndroidManifest.xml에서 설정하는 암시적 인텐트 (받는 쪽에서 설정 함)

             즉, 인텐트를 보내는 앱에서는 받는 앱의 이름을 알 필요가 없다.


Q19. 어플리케이션(application)과 컨텍스트(context)에 대해서 설명하시오.

어플리케이션 앱 프로세스가 실행되면 가장 먼저 생성되는 객체로 하나의 어플리케이션 객체는 하나의 앱 프로세스와 대응됩니다. 앱이 백그라운드로 내려가도 앱 프로세스는 계속 살아있기 때문에 어플리케이션 객체도 살아있다고 할 수 있습니다.


컨텍스트는 안드로이드의 컴포넌트들이 동작하기 위해 필요한 정보를 담고 있는 객체를 말합니다. 각각의 컴포넌트들(액티비티, 서비스, 브로드캐스트 리시버 등)은 자신만의 컨텍스트를 가지고 있습니다. 컨텍스트 내에는 어플리케이션의 정보(패키지명 등), 컨텍스트가 실행되는데 필요한 정보(테마 등)를 얻거나 시스템 서비스(윈도우 매니저, 레이아웃 인플레이터 등)를 구동하는데 사용됩니다.


Q20. 노티피케이션(notification)은 무엇인가?

Q21. 안드로이드에서 로그(log)를 출력하는 방법과 종류를 설명하시오.

Q22. 스타일(style), 테마(theme)에 대해서 설명하시오.

Q23. 프레그먼트(fragment)가 와 프레그먼트 생명주기에 설명하시오.

프레그먼트는 액티비티의 일부분에만 배치되는 화면 및 동작을 조작하기 위한 객체입니다. 안드로이드 3.0(허니콤)에서 화면이 비교적 큰 태블릿의 등장으로 작은 단위의 화면의 생명주기 관리할 필요가 있어 추가되었습니다. 프레그먼트 매니저를 통해서 여러개의 프레그먼트를 조작할 수 있습니다. 레이아웃 xml 파일에서 다른 뷰들과 함께 배치될 수 있습니다.

액티비티가 생성되면 프레그먼트 매니저는 초기화(initializing) 상태가 됩니다. 프레그먼트가 매니저에 의해 추가되면 onAttach, onAttachFragment, onCreate 메소드가 차례로 실행됩니다. 다음으로 액티비티의 onCreate 메소드 호출 이후 매니저는 생성(created) 상태로 변경됩니다. 이때 onCreateView, onViewCreated, onActivityCreated 메소드가 차례로 호출됩니다. 다음으로 액티비티의 onStart 메소드가 호출되면 매니저는 시작(started) 상태로 onStart 메소드를 호출합니다. 이후 액티비티의 onResume 메소드가 호출되면 매니저 역시 재시작(resume) 상태로 변하며 onResume 메소드를 호출합니다. 그 외 액티비티가 화면에서 보이지 않을경우 호출되는 onStop 메소드 호출 이후 매니저는 중지(stop) 상태가 되며 액티비티의 onDestroy 메소드 호출 이후 매니저는 onDestroyView 메소드를 호출합니다.


Q24. 뷰 홀더 패턴(view holder pattern)에 대해서 설명하시오.

Q25. 나인패치(9patch)란 무엇인가?

Q26. 태스크(task)란 무엇인가?

예를들어 어떤 앱에서 앨범 앱을 실행하는 기능이 있다면 이 앱은 두개의 앱을 실행하는 형태가 되지만 사용자 입장에서는 하나의 앱에서 화면이 전환된다고 판단합니다. 이와 같은 사용자 입장에서 논리적인 화면 구성의 단위를 태스크라고 말합니다.


Q27. 안드로이드의 메모리 관리 방식에 대해서 설명하시오.

안드로이드는 액티비티, 서비스, 리시버, 프로바이더를 실행하기 위해 앱이 실행되는 과정에서 프로세스를 생성합니다. 실행중인 모든 앱은 컴포넌트가 모두 종료되어도 다음에 이 앱을 다시 실행할 가능성이 높기 때문에 프로세스를 바로 제거하지 않습니다. 바로 종료하지 않는 이유는 앱을 실행하기 위해 프로세스를 생성하는 과정에서 딜레이가 발생하는데 이 딜레이를 줄이기 위함입니다. 따라서 사용자에 의해 다시 앱이 실행되면 남아있던 프로세스가 존재하는 경우 바로 실행됩니다. 이 과정에서 쌓여있던 많은 프로세스로 인해 메모리가 부족해지는 경우 프로세스의 우선순위(사용빈도)에 따라 프로세스를 종료하여 메모리를 확보합니다.




 

[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

 

[Java] Collection Framework 간단 정리

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




Collection Framework는 크게 3가지 형태로 분류할 수 있다.
  - Map  : key와 Value를 가지는 자료구조입니다. HashMap, Hashtable, TreeMap 등
  - List  : 순서가 있고 중복이 허용되는 자료구조입니다. ArrayList, LinkedList, Vector 등
  - Set   : 중복을 허용하지 않습니다.  HashSet, TreeSet 등



인터페이스에 대한 hierarchy관계를 이해하고 사용예제를 통해 각 인터페이스에 대한 특성을 확인해 보도록 한다.

[그림 3] Collection Interface 구성도


기본적으로 Collection의 경우 연속된 순서의 선형 자료형을 구현한 인터페이스이며, MAP은 Key, Value를 다루는 자료형을 구현한 인터페이스 이다. 기존에 구현된 Vector와 Hashtable의 경우, Synchronized를 지원하도록 설계되었기 때문에 다중 스레드 접근 시 병목현상을 유발할 수 있기 때문에 유의해서 사용하도록 한다.

** Collections Synchronized 

import java.util.*;

public class SynchronizedCollectionTest {
   public static void main(String[] args) {
       // create vector object
       List<String> list = new ArrayList<String>();

       // populate the list
       list.add("1");
       list.add("2");
       list.add("3");
       list.add("4");
       list.add("5");

       // create a synchronized list
       List<String> synlist = Collections.synchronizedList(list);
       System.out.println("list :"+synlist);
   }
}



참고 : http://rocksea.tistory.com/336
        http://whosnext.blog.me/100037993078




 

[JAVA] Primitive type과 Reference type 그리고 Object 클래스

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


Primitive type과 Reference type 그리고 Object 클래스





Primitive type (원시타입)


● 자바 언어에 내장된 기본 유형 
● 자바는 정수, 실수, 논리, 문자 방식의 primitive type을 지원한다. 
● wrapper class는 각 primitive type을 클래스로 만든 것이다. 
● stack 메모리에 저장됨. 

■ byte 

  • 8 비트 크기에 부호있는 정수
  • 표현할 수 있는 범위는 -128 ~ 127
  • 2의 보수로 메모리에 저장됨
  • 기본값 : 0
  • wrapper class : Byte

■ short 

  • 16 비트 크기에 부호있는 정수
  • 표현할 수 있는 범위는 -32,768 ~ 32,767
  • 2의 보수로 메모리에 저장됨
  • 기본값 : 0
  • wrapper class : Short

■ int 

  • 32 비트 크기에 부호있는 정수
  • 표현할 수 있는 범위는 -2,147,483,648 ~ 2,147,483,647
  • 2의 보수로 메모리에 저장됨
  • 주로 사용
  • 기본값 : 0
  • wrapper class : Integer

■ long 

  • 64 비트 크기에 부호있는 정수
  • 범위는 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • 2의 보수로 메모리에 저장됨
  • 기본값 : 0L
  • wrapper class : Long

■ float 

  • 32 비트 크기에 실수
  • IEEE 754 표준을 따릅니다.
  • 부동소수점 방식으로 메모리에 저장됨
  • 화폐와 같이 정확한 값을 요하는곳에 double을 사용하면 안됨
  • 기본값 : 0.0f
  • wrapper class : Float

■ double 

  • 64 비트 크기에 실수
  • IEEE 754 표준을 따릅니다.
  • 부동소수점 방식으로 메모리에 저장됨
  • 화폐와 같이 정확한 값을 요하는곳에 double을 사용하면 안됨
  • 기본값 : 0.0d
  • wrapper class : Double

■ boolean 

  • true와 false의 두 가지 값을 가지는 논리형
  • 참 / 거짓 상태를 판별하기 위한 간단한 flag로 boolean을 사용합니다.
  • 1bit의 정보를 표현하지만, 사용하는 메모리 크기는 정확히 정해져 있지 않습니다.
  • 기본값 : false
  • wrapper class : Boolean

■ char 

  • 16 비트 유니 코드 문자
  • 범위는 0 ~ 65,535 혹은 '\ u0000' ~ '\ uffff'
  • 기본값 : ‘\u0000’
  • wrapper class : Character

Reference type


  • 클래스 타입(class type), 인터페이스 타입(interface type), 배열 타입(array type), 열거 타입(enum type)
  • Ball 클래스의 참조형 변수를 선언 : Ball b; → Ball 클래스 인스턴스를 생성 후 참조형 변수에 할당 : b = new Ball(); → heap 메모리에 저장.
  • 힙 메모리에 생성된 인스턴스는 메소드나 각종 인터페이스에서 접근하기 위해 JVM의 Stack 영역에 존재하는 Frame에 일종의 포인터(C의 포인터와는 다르다.)인 참조값을 가지고 있어 이를 통해 인스턴스를 핸들링한다.
  • 그래서 참조형 클래스 사용 시 아래의 변수 할당 방식을 사용시 할당된 변수가 변경되는 원소스에 해당되는 변수도 같이 변형된다. 그래서 원소스에 해당되는 인스턴스와 별개로 할당 변수를 사용하기 위해서는 clone 내지 별개의 힙 메모리에 복사를 하여 사용하는 것이 안전하다.
1
2
3
4
5
6
7
UserTypeCls cls = new UserTypeCls();  // 원소스 참조형 변수(클래스) 생성
UserTypeCls refCls = cls;             // 새 변수에 원소스 변수 할당
refCls.changeValue(234);           // 새 변수를 변경하면 원소스 참조형 변수도 변경된다.
 
// 원소스는 변경하지 않고 새 변수만 변경하기 위해서는 clone된 인스턴스를 사용해야 한다.
UserTypeCls newRefCls - cls.cloneInscance();
newRefCls.changeValue(5678);   // 새 변수만 변경되고 원소스 변수는 변경되지 않는다.


Object Class


  • 클래스 계층구조의 루트 클래스
  • Primitive type이 아닌 모든 type(배열 포함)이 Object 클래스를 직접, 간접적으로 상속합니다.
  • Object 클래스는 JVM(특히 Execute Engine / Garbage collector)에서 클래스 인스턴스의 생성과 소멸 등의 생명주기(life cycle)을 관리할 수 있게 한다.
  • 클래스의 생성자 Object 클래스의 finalize(), wait() 등 대부분의 메소드가 JVM에서 클래스를 핸들링하기 위해 사용되는 메소드다.
  • 참조형 변수(클래스)들은 기본적으로 Object를 상속하기 때문에 모든 클래스의 인스턴스의 라이프사이클을 관리할 수 있게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
 *  생명주기 확인 예제
 */
public class LifeCycleTest {
    // 생성자
    public LifeCycleTest() {
        super();
        System.out.println("생성자 호출 : 시스템 자원을 할당 받습니다.");
    }
    void use(){
        System.out.println("use 호출 : 시스템 자원을 사용합니다.");
    }
    // Object 클래스의 finalize() 메소드 오버라이드
    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalize 호출 : 시스템 자원의 할당을 해제 합니다.");
        super.finalize();
    }
}
 
public static void main(String[] args) {
        /**
         * gc를 호출 한다고 해서 가비지 컬렉터가 즉시 실행 된다는 보장은 없다.
         * finalize를 정상적으로 출력되려면 JVM 프레세서를 가능한 한 빨리 실행되도록 OS스케쥴을 조정한다.
         * (윈도우의 경우 작업관리자에서 실행되고 있는 java 프로세서의 우선순위를 높게 설정하면 된다.)
         */
        LifeCycleTest obj = new LifeCycleTest();
        obj.use();       // ResourceUser 객체를 사용한다.
        obj = null;     // ResourceUser 객체를 더이상 필요치 않은 상태로 만든다.
        System.gc();   //System  클래스의 gc(garbage collector 메소드를 호출한다.
}


실행 결과
생성자 호출 : 시스템 자원을 할당 받습니다. 
use 호출 : 시스템 자원을 사용합니다. 
finalize 호출 : 시스템 자원의 할당을 해제 합니다.



  • Object 클래스의 메소드
- clone() - 객체와 동일한 클래스의 새로운 객체를 작성합니다.- equals(Object) - 두 객체의 동일성을 비교합니다. 
- finalize() - 객체에 대한 참조가 더 이상 없다고 판별되면 메모리를 회수하면서 호출됩니다. 
- getClass() - 객체의 런타임 클래스를 리턴합니다. 
- hashCode() - 객체의 해시 코드 값을 리턴합니다. 
- notify() - 해당 객체의 모니터에 대기중인 단일 스레드를 깨웁니다. 
- notifyAll() - 해당 객체의 모니터에 대기중인 모든 스레드를 깨웁니다. 
- toString() - 객체를 표현하는 문자열을 리턴합니다. 
- wait() - 객체에 있는 다른 변경의 스레드에서 통지할 것을 기다립니다.



String 클래스


  • 문자열을 primitive type 처럼 사용할 수 있도록 String 클래스를 특별하게 처리함. 즉, String 클래스는 일종의 Primitive 타입(원시타입)처럼 사용 가능하지만 원시타입에는 속하지 않는다.
  • String 클래스는 값이 변경되지 않으며, 값을 변경하는 함수가 있지만, 이 함수는 값이 다른 String 클래스 객체를 생성한다. (immutable object)
  • String s = “aaa”; 와 같이 큰따옴표를 사용하여 생성자를 호출할 수 있다.
  • String 클래스만이 + 연산자를 통해 문자열 연결
  • String 비교시 equals() 함수 사용
  • String class의 사용 예제 : 첨부 소스 참조



링크 목록


http://www.gliderwiki.org/wiki/79  펌


 

Eclipse 에서 Tap을 Space로 변경하기

Posted by ironmask84
2016. 3. 31. 09:13 나는 프로그래머다!/Java & Android


보통 안드로이드 프로젝트를 개발할 때는 git이란 형상관리도구를 사용합니다.


git에 소스를 반영할 때는 여러 사람이 반영하게 되므로, 보통 Code Rule을 몇 가지 정해놓고 반영하도록 하는데요..

그 중에 에러를 최소화하기 위해 tab 대신에 space로 반영하도록 하는 사항이 있습니다.


코드 가독성을 위해 tab으로 들여쓰기를 보통 사용하는데,

Eclipse에서 이 tab을 누르거나, 자동 들여쓰기 기능을 할 때, Space로 바꿔주는 기능이 있습니다.


아래 2가지 방법 중 1번으로 안될 경우, 2번까지 적용하시면 됩니다.

1. Window -> Preferences -> General -> Editors ->Text Editors ->Insert spaces for tabs 체크, 

                                                           -> Displayed tab width를 4로 설정


2. Window-> Preferences -> Java -> Code Style -> Formatter
  [
Edit] 버튼을 누르고 < Indentation > 텝에서 Tab policy을 Space only 로 변경, Profile 이름을 적당히 변경


 

문자열을 SHA-512 방식으로 암호화(단방향 암호화 방식 : 예 로그인)

Posted by ironmask84
2013. 2. 4. 09:03 컴퓨터공학/Security


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

import java.security.*;
 
// 문자열을 SHA-512 방식으로 암호화
 
public String encrypt(String input) throws NoSuchAlgorithmException {
 
    String output = "";
 
   
 
    StringBuffer sb = new StringBuffer();
 
    MessageDigest md = MessageDigest.getInstance("SHA-512");
 
 
 
    md.update(input.getBytes());
 
    byte[] msgb = md.digest();
 
 
 
    for (int i = 0; i < msgb.length; i++) {
 
        byte temp = msgb[i];
 
        String str = Integer.toHexString(temp & 0xFF);
 
        while (str.length() < 2) {
 
            str = "0" + str;
 
        }
 
        str = str.substring(str.length() - 2);
 
        sb.append(str);
 
    }
 
   
 
    output = sb.toString();
 
   
 
    return output;

}