안드로이드는 주로 자바를 이용해 개발합니다. 그래서 자바에 대해 잘 알면 좋습니다.


오늘 다룰 주제는 기본 데이터 타입입니다. Primitive data type 이라고 불리는, 자바에서 제공하는 기본 타입입니다.


레퍼런스:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


1. boolean

boolean 타입은 true 또는 false 두 가지의 값 중 하나를 가집니다. 즉 1비트의 정보를 나타냅니다.

사이즈는 대략 1바이트로 가정합니다.


즉, 공식 문서에 따르면 그 "사이즈"는 정확히 정의되지 않았습니다. Java Virtual Machine 의 구현에 따라 다릅니다.


// boolean boolean1 = 0; // ERROR.
boolean boolean2 = false;
boolean boolean3 = true;
// boolean boolean4 = 1; // ERROR.


C 언어에서는 숫자를 입력할 수 있었지만 (0 이 false, 1이 true), Java 에서는 그렇게 할 수 없습니다. 다만 아래와 같이 수식을 이용하여 입력할 수 있습니다.


boolean boolean4 = (1 == 1);


boolean 의 사이즈를 측정해 보기위해서는 아래 링크에 나오는 방법을 한 번 시도해 보세요. (스택 오버플로우 내공 1위 존 스킷 이 답변한 내용입니다!)

https://stackoverflow.com/questions/383551/what-is-the-size-of-a-boolean-variable-in-java



2. byte

8 비트, 즉 1 바이트 크기를 가지는 데이터 타입입니다.

하드웨어, 펌웨어에서는 1바이트 크기 계산을 자주하기 때문에, 임베디드 통신에서 자주 보게 될 타입입니다.

하드웨어에서는 0x 로 시작되는 16진수를 이용하는 경우가 많은데, 바이트를 다룰때는 16진수가 편하기 때문입니다.


// byte byte1 = -129; // ERROR
byte byte2 = -128; // 최소값.
byte byte3 = (byte) 0x80; // 최소값. 16진수 표기법 Hexadecimal 로 표기가능.
byte byte4 = Byte.MIN_VALUE; // byte 최소값을 표현할 때 제일 많이 쓰는 표현.

byte byte5 = 127; // 최대값.
byte byte6 = 0x7F; // 최대값. 16진수 표기법 Hexadecimal 로 표기가능.
byte byte7 = Byte.MAX_VALUE; // 최대값.
//byte byte8 = 128; // ERROR


3. char

2 바이트이고, 보통 유니코드 한 글자를 담는데 이용할 수 있습니다.

숫자도 당연히 입력할 수 있지만, 글자 하나를 다루는데 주로 쓰입니다.

byte 와 유사하게 hexadecimal 값을 쓸 때가 많습니다.


// char char1 = -1; // ERROR

// 최소값.
char char2 = 0;

// char 최소값을 표현할 때 제일 많이 쓰고, 명확하며, 적절한 표현.
char char3 = Character.MIN_VALUE;

// 최소값. 유니코드 표기법으로, 유니코드의 제일 작은 문자.
char char4 = '\u0000';

// 최대값.
char char6 = 65535;

// char 최대값을 표현할 때 제일 많이 쓰고, 명확하며, 적절한 표현.
char char7 = Character.MAX_VALUE;
char char8 = '\uFFFF'; // 최대값. 유니코드 표기법으로, 유니코드의 제일 큰 문자.
char char9 = 0xFFFF; // 최대값. hexadecimal 표기법.
// char char10 = 65536; // ERROR.

// 곁다리 short.
// 제 경험상 잘 안쓰입니다. 임베디드에선  byte 나 char 를 많이 썼고, 메모리 부족할 일 없는 요새 환경에선
// 그냥 int 를 쓰기 때문에 잘 안쓰입니다.

// short short1 = -32769; // ERROR
// 최소값
short short2 = Short.MIN_VALUE;
short short3 = -32768;
short short4 = 0xFFFF8000;

// 최대값
short short5 = Short.MAX_VALUE;
short short6 = 32767;
short short7 = 0x7FFF;
// short short8 = 32768; // ERROR


4. int

4바이트 크기를 가지고 있습니다. 숫자, 정확하게는 음의 정수와 양의 정수를 표현할 수 있습니다.

제일 흔하게 쓰이는 데이터 타입입니다.


// int int1 = -2147483649; // ERROR

// 최소값
int int3 = -2147483648;
int int4 = Integer.MIN_VALUE;
int int5 = 0x80000000;

// 최대값
int int6 = Integer.MAX_VALUE;
int int7 = 0x7FFFFFFF;
int int8 = 2147483647;
// int int9 = 2147483648; // ERROR



5. float

float 는 소수점을 다룰 수 있는 기본 타입입니다. 32비트, 즉 4바이트입니다.

소수점 = 플로팅 포인트 floating point 연산을 할 수 있어 float 이라고 불립니다.


// 최소값. 이런 표현은 존재하지만, 잘 안쓰이지는 않을 겁니다. 이 범위 한계까지 가는 경우가 드물기 때문이죠.
float float1 = Float.MIN_VALUE;

// 최대값. 마찬가지로 이런 표현 역시 잘 안쓰입니다.
float float2 = 0x0.000002P-126f;

// 최대값. float 의 최대값을 나타내는 가장 적절한 표현이지만, float 에는 이런 연산을 하는 경우가 드뭅니다.
float float3 = Float.MAX_VALUE;

// 최대값.
float float4 = 0x1.fffffeP+127f;


// 참고로 숫자 뒤에 F 또는 f를 붙여주면 자동으로 float 로 인식합니다.
// 하지만, 소수점 계산에는 문제가 있습니다. 자바에서는 IEEE 754 표준방식으로 소수점을 구현했기 때문에,
// 소수점 계산에 오차가 생깁니다.
// https://ko.wikipedia.org/wiki/IEEE_754

float float5 = 1.33f;
float float6 = float1 * 0.33f; // 0.4389 값이어야 하지만, 0.4389002 값이 나옵니다.


// 소수점 문제를 해결하고 싶다면, BigDecimal 타입을 이용하세요.
// 숫자, 소수점 합쳐 자릿수가 Integer.MAX_VALUE 인 경우까지 처리 가능합니다.
BigDecimal bigDecimal = new BigDecimal("0.3123456789012345678901234567890");


// 나눗셈 문제도 있습니다. int 를 int 로 나눈 값은 int 타입으로 캐스팅 됩니다.
int float7 = 20;
float float8 = float7 / 3; // ERROR. 값이 6입니다.
float float9 = float7 / (float) 3; // 값이 6.6666665입니다.
float float10 = float7 / 3f; // 값이 6.6666665입니다.



6. double

float 의 두배, 64비트, 즉 8바이트입니다.

배 정밀도 = 두배의 정밀도를 가지고 있다고 해서 double 입니다.

숫자 뒤에 D 또는 d를 붙이면 자동으로 double 로 인식합니다.


// 최소값.
double double1 = Double.MIN_VALUE;
double double2 = 0x0.0000000000001P-1022;

// 최대값.
double double3 = Double.MAX_VALUE;
double double4 = 0x1.fffffffffffffP+1023;


// 소수점 정밀도, 그리고 int를 나눴을 때 문제 역시 동일하게 발생합니다.
double double5 = 0.10d;
double double6 = double5 * 3d; // 0.30000000000000004F

int double7 = 20;
double double8 = double7 / 3; // ERROR. 값이 6입니다.
double double9 = double7 / (double) 3; // 값이 6.6666665입니다.
double double10 = double7 / 3d; // 값이 6.6666665입니다.


7. long

int 의 두 배인 64비트형 정수입니다. 즉 8바이트 입니다.

실제 코딩에서는 unix time 형태로 표현된 현재 시간을 나타내는데 주로 쓰입니다.

숫자 뒤에 L 또는 l 을 붙이면 long 타입으로 인식합니다.


// long long1 = -9223372036854775809L; // ERROR
long long1 = Long.MIN_VALUE;
long long2 = 0x8000000000000000L;
long long3 = -9223372036854775808L;

long long4 = Long.MAX_VALUE;
long long5 = 0x7FFFFFFFFFFFFFFFL;
long long6 = 9223372036854775807L;

// long long7 = 9223372036854775808L; // ERROR


Posted by StanleyKou





스택 오버플로우 ( https://www.stackoverflow.com )는 개발자, 특히 앱/웹 개발자라면 누구나 친숙하게 여기고 질문을 (가끔) 올리며, 답을 구하는 곳입니다.


대부분 사람들은 주로 검색만 하고 질문도 잘 하지않고, 답글을 달지는 않는 모양입니다. 하지만 답글을 달다보면 실력도 오르고 (영어실력도!) 재미도 있습니다.


오늘은 올해 목표였던 SO Rep 1000점을 달성한 기념 포스팅입니다.




그래프를 보면 올해 목표를 이루기 위해 연말에 열심히 달린 흔적을 볼 수 있습니다.....!


1000점을 달성하면 좋은 점은:


https://stackoverflow.com/help/privileges



1. 질문글/답글의 점수를 클릭하면  Up과 Down이 각각 몇 표인지 볼 수 있게 됩니다.


예를 들어 아래와 같은 글이 있다면


https://stackoverflow.com/questions/2706500/how-do-i-generate-a-random-int-number-in-c




점수를 클릭 해 봅니다!




일반인(?)들에게는 숫자 1227만 보이지만,  점수가 1000점 이상인 사람들은 점수 클릭 시 +1254 와 -27이 각각 보이게 됩니다.


2. 그리고... 별 건 아니지만, 네임카드에 마우스를 올리면 확대되어 보입니다.

예를 들어 이런 네임카드에 마우스를 올리면....




짜잔!





3. 스택 오버플로우 채팅방 ( https://chat.stackoverflow.com/ )에서 특정 인원 여러 명을 지정해서 채팅을 할 수 있습니다. (갤러리 채팅방) 채팅의 종류에는 채팅참여 (20점 이상), 누구나 들어올 수 있는 채팅방 생성 (100점 이상), 그리고 1000점 이상이면 특정 인원을 지정해서 채팅방을 만들 수 있습니다.




스택 오버플로우 활동을 많이 하다보면, 점수가 오를수록 권한이 늘어나지만 책임도 따르는 것을 볼 수 있습니다.


500점이 되면 얻을 수 있는 리뷰 권한이라는 것이 있는데요,




다른 사람의 글을 리뷰해 주는 겁니다. 리뷰 대상은 1) 처음 글을 올린 사람, 2) (광고로 의심되는) 오래된 질문에 댓글을 단 경우, 3) 수정이 필요해 보이는 글에 대해, 그 글에 대한 상세한 정보를 코멘트나 플래그로 남기는 겁니다.


리뷰를 많이 한 사람은 다음 스택오버플로우 선거에서 중재자로 선출될 수 있는 권한을 얻게 됩니다! 모두모두 화이팅!





Posted by StanleyKou





RAR 압축을 푸는 프로그램, cRARk를 써봅시다.


자매품(?) zip 파일 암호 크랙하는 방법도 있습니다.

http://stanleykou.tistory.com/entry/Zip-암호풀기-GUI-프로그램-johnny



모든 암호는 해제 가능합니다. 시간이 미친듯이 걸리는게 문제죠.

현대의 암호는 누구나 알고있는 문제를 누구나 아는 방식으로 풀면 답이 나오는 수학적인 구조입니다. 단, 수학적으로 수백만년이 걸리게 설계되어 있습니다.


자세한 내용은 대학교 컴공 1학년이나 2학년 때 배우는 이산수학, 정수론, 정보 보안 수업 등에서 알 수 있습니다.


오늘 주제는 그게 아니고...


전에 zip 암호를 해제하는 법을 포스팅 했었는데, 이번에는 RAR 암호를 해제하는 법을 포스팅 해 봅니다.


cRARk 이라는 프로그램을 이용하면 됩니다.

이 프로그램은 윈도우, 맥 OS, 리눅스를 모두 지원합니다. 이 포스팅에서는 윈도우에서 하는 방법만을 다루겠습니다.


주의사항: 이 프로그램은 컴퓨터의 모든 자원을 남김없이 끌어다 쓰는 프로그램입니다. 암호를 해제할 때는 다른 작업을 하는 것이 현실적으로 불가능하다는 것을 유념하시기 바랍니다.





방법 1. 제일 간단하게 암호를 해제 해봅시다. 1분이면 됩니다. 아래 파일을 다운로드 받아, 적당한 경로에 압축 해제 하세요. (예: C:\test)


crark52.zip



그리고 암호 해제를 원하는 파일을 그 경로에 복사하세요. (위 압축파일 안에는 제가 테스트 용으로 "password_zz.rar"이라는 파일을 넣어놓았습니다. 패스워드가 zz 인 RAR 압축파일입니다.)




그 다음, 커맨드 창 (윈도우키 + R, 그다음 cmd [엔터키])을 열고, 



아까 그 경로로 이동하세요. (예: cd c:\test [엔터키])


그 다음 아래와 같이 입력합니다.


    crark.exe -c [암호해제를 원하는 파일]


예를 들어 암호해제를 원하는 파일 명이 password_zz.rar이라면, 아래와 같이 입력합니다.


  crark.exe -c password_zz.rar

  


그리고 엔터를 치면, 암호 해제를 시작합니다. 저는 패스워드가 두 글자인 것으로 테스트를 해봤습니다. 그랬더니......




화면 아래서 네 번째 줄, "zz - CRC OK" 가 보이시나요? 패스워드는 zz 이고 찾았다는 뜻입니다. 그 아래 정보를 읽어보면 시간은 19.69초가 걸렸다고 되어 있네요. 제 CPU가 i5 750 (꽤 오래 됐습니다)이니, 그래도 아직은 쓸만하군요.




방법 2. 원본 사이트에서 다운로드 받아서 이용 해 봅시다. 방법 1과 별 차이점은 없습니다.


crark 다운로드

http://www.crark.net/#download



rar 파일이 다운로드 받아지는데 그냥 압축을 풀면 됩니다. 패스워드를 입력하라고 나오는데, 입력하지 않아도 됩니다.


중요한 것이 하나 있는데, 폴더 내에 있는 english.def 파일의 이름을 password.def로 변경하세요. 이렇게 하면 패스워드 범위를 영문 범위로 줄입니다. 


마지막으로, 아까와 동일하게 아래와 같이 입력 해 줍니다.


    crark.exe -c [암호해제를 원하는 파일]



사족으로, 

password.def 파일을 메모장으로 열어보면 패스워드 범위를 더 줄일 수 있는 법이 나옵니다. 다만 특수기호를 제외했다가 진짜로 패스워드에 특수기호가 들어있다면, 패스워드를 못찾을 수도 있습니다. 


그리고, 만약 패스워드 범위가 러시아어나 스페인어, 한글... 이런 식이라면 패스워드를 찾을 수 없습니다. 영문 범위에서 찾으라고 해놓았기 때문이죠. password.def 파일의 내용을 아래와 같이 설정하면, 모든 글자 범위에서 모든 경우의 수를 다 찾으라는 뜻이 됩니다. 미친듯이 느려지지만, 놓칠 가능성은 없어집니다.


[?] *





방법3. NVIDIA 그래픽카드를 쓰고 있다면, CUDA 라이브러리를 이용하여 초고속으로 검색할 수 있습니다. 


제 경우에는 아래와 같이 시간이 걸렸습니다. CPU: i5 750, GPU: Geforce 1050


"전 범위 패스워드 검색"에 19.69초

"영문 대소문자 특수기호 패스워드 검색"에 2.60초

"GPU 이용영문 대소문자 특수기호 패스워드 검색"에 0.64초


세팅에 꽤 시간이 걸리지만, 할 만한 가치가 있는 방법입니다.


1. NVidia CUDA 라이브러리 다운로드 및 설치. 

(용량도 크고, 시간도 총 20분여분 걸림)

https://developer.nvidia.com/cuda-downloads


적절한 운영체제와 OS 버전을 선택한 뒤 exe [network]를 클릭합니다



2. 설치된 프로그램 중 NSight를 관리자권한으로 실행(우클릭 - 관리자권한으로 실행)




오른쪽 하단 트레이에 나오는 NVidia 아이콘을 우클릭 한 뒤 option을 선택

General 탭에서 WDDM TDR enabled항목을 false로 설정.




그리고 재부팅합니다.


참조: https://stackoverflow.com/questions/497685/cuda-apps-time-out-fail-after-several-seconds-how-to-work-around-this



그 다음, 커맨드 라인에 아래와 같이 입력합니다.


    crark.exe [암호해제를 원하는 파일]



이렇게 하면 GPU를 이용하기 때문에 해제 속도가 급격하게 늘어납니다. 5자리 패스워드 정도는 5분 내에 해제할 수 있습니다. 단지 자리수가 한 자리 늘어날 때마다 시간이 끔찍하게 더 많이 늘어날 뿐... 아마 8자리 정도면 하루이틀이면 해제할 수 있을 겁니다.



Posted by StanleyKou