2022년 1월 31일 월요일

[JAVA] hashMap에서 key값으로 Value값 찾기, Value값으로 key값 찾기


Java프로그램을 작성하다가 Color값 배열을 만들고 인덱스로 배열 값을 가져오다가 그 반대로 배열 값을 가지고 인덱스를 구해야 하는 상황이 발생하였다. 참고하려고 정리한다. 


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
import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
 
public class HashMap_Get_Key_Data {
 
    public static void main(String[] args) {
        Map<Color, Integer> mapColor = new HashMap<>();
        
        // HashMap 데이터 추가
        mapColor.put(Color.RED, 0);
        mapColor.put(Color.ORANGE, 1);
        mapColor.put(Color.YELLOW, 2);
        mapColor.put(Color.GREEN, 3);
        mapColor.put(Color.BLUE, 4);
        
        // Key값으로 Value값을 얻는다.
        System.out.println("key Color.ORANGE's Value : " + mapColor.get(Color.ORANGE));
        System.out.println("key Color.GREEN's Value  : " + mapColor.get(Color.GREEN));
 
        // Value값으로 Key값을 얻는다.
        System.out.println("Value 0's Key : " + getKey(mapColor, 0));
        System.out.println("Value 4's Key : " + getKey(mapColor, 4));
    }
 
    // hashmap에서 value로 key 찾기
    private static <K, V> K getKey(Map<K, V> map, V value) {
 
        for (K key : map.keySet())
            if (value.equals(map.get(key)))
                return key;
 
        return null;
    }
}
 
 
cs


------------------------ 출력 결과 ---------------------
key Color.ORANGE's Value : 1
key Color.GREEN's Value  : 3
Value 0's Key : java.awt.Color[r=255,g=0,b=0]
Value 4's Key : java.awt.Color[r=0,g=0,b=255]


2021년 6월 10일 목요일

안드로이드(Android) SDK 메뉴 위치, 단축키 및 SDK 설치 방법

  안드로이드(Android)에서 Android SDK 플랫폼 버전을 추가로 설치하거나 확인해야 하는데 어디에 있는지 기억나지 않는 경우가 있습니다. Android SDK 메뉴 위치는 버전마다 조금씩 다를 수 있는데, 아래는 안드로이드 스튜디오 4.1.1 기준 설명입니다.



  Android SDK Manager에 접근하기 위해서, 먼저 Android Studio메뉴에서 File > Settings... 을 선택하여 Settings화면을 띄웁니다. 단축키는 Ctrl+Alt+S 입니다


  Settings화면에서 Apperance & Behavior > System Settings > Android SDK 를 차례로 선택합니다.


  현재 설치된 Android SDK의 경로는 Android SDK 설정 화면의 상단에서 확인할 수 있습니다.



  SDK Platforms 탭에서 설치하고자 하는 SDK버전에 체크하면 아래와 같이 Apply버튼이 활성화되는데 이 때 Apply버튼을 누르면 설치가 진행됩니다.


  Android SDK 화면의 우측 하단의 Show Package Details를 체크하면 아래와 같이 세부 설정 화면이 나타나는데 여기서 설치될 시스템 이미지를 확인할 수 있으며, 추가로 다른 옵션을 선택하여 설치를 진행할 수도 있습니다. 


SDK Tools 탭에는 안드로이드 스튜디오 관련 도구들이 포함되어 있습니다.

안드로이드 스튜디오를 사용하기 위해서 다음 항목들은 반드시 설치되어야 합니다.
  - Android SDK Build-Tools
      Android 앱을 빌드하는 데 필요한 Android SDK의 구성요소입니다.
      SDK가 설치된 경로의 build-tools 폴더에 버전별로 설치되어 있습니다.
  - Android SDK Platform-Tools
      adb 도구 및 Android 플랫폼에 필요한 다양한 도구들이 포함되어 있습니다.
      SDK가 설치된 경로의 \platform-tools 폴더에 위치합니다.
  - Android SDK Tools
      Android용 개발 및 디버깅 도구가 포함되어 있습니다.

Android Emulator 설치는 권장사항입니다.
  실제 Android 런타임 환경에서 애플리케이션의 디버그 및 테스트에 사용할 수 있는 QEMU 기반 기기 에뮬레이션 도구입니다.






2021년 6월 1일 화요일

[안드로이드] 개발 테스트시 로그 출력 효율적으로 사용하기

 안드로이드 스튜디오에서 앱을 작성하고 테스트하다 보면 디버그를 하기 위해서 로그를 출력할 때가 많이 있습니다. 조금 복잡해지다 보면 내가 로그를 어디에 넣었는지, 어느 곳의 로그가 출력된 것인지 헛갈릴 때가 종종 있습니다.

 그리고 테스트가 종료되어 릴리즈를 할 경우에는 로그가 출력되지 않도록 해야 하는데 이럴 때 아래와 같이 로그 출력 클래스를 작성하여 사용하면 좀 더 효율적으로 작업을 할 수 있습니다. 

로그 출력 클래스: 

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
public final class DLog {
 
    public static void v(String msg) {
        linkLog(Log.VERBOSE, msg);
    }
 
    public static void d(String msg) {
        linkLog(Log.DEBUG, msg);
    }
 
    public static void i(String msg) {
        linkLog(Log.INFO, msg);
    }
 
    public static void w(String msg) {
        linkLog(Log.WARN, msg);
    }
 
    public static void e(String msg) {
        linkLog(Log.ERROR, msg);
    }
 
    private static void linkLog(int priority, String msg) {
        // Build Config설정이 Debug모드일때만 로그를 출력한다.
        if (BuildConfig.DEBUG) {
            StringBuilder strBuilder = new StringBuilder();
            // Thread에서 4번째 stacktrace를 가져오는데 
             // 클래스 설계에 따라 달라질 수 있다.
            StackTraceElement trace = Thread.currentThread().getStackTrace()[4];
 
            String classPath = trace.getClassName();
            // .위치를 찾아서 .뒷부분의 문자열(확장자)을 가져온다.
            String className = classPath.substring(classPath.lastIndexOf("."+ 1);
 
            strBuilder.append(className)
                    .append(".")
                    .append(trace.getMethodName())
                    .append("(")
                    .append(trace.getFileName())
                    .append(":")
                    .append(trace.getLineNumber())
                    .append(")");
            // priority, tag, msg
            Log.println(priority, strBuilder.toString(), msg);
        }
    }
}
 
cs
위의 클래스를 프로젝트에 포함시키고 
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        DLog.d("onCreate started!");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        int number = 1 + 2;
        DLog.d("number is " + number);
    }
}

cs
위와 같이 DLog.d로 로그를 출력해 보면
< 우선순위/클래스명.메소드명(로그출력 위치 링크): msg > 와 같이 출력되어
'로그출력 위치 링크'를 눌러 로그를 출력한 곳으로 이동할 수도 있고
보다 효율적으로 작업이 가능할 것이라 생각됩니다.
... D/MainActivity.onCreate(MainActivity.java:11): onCreate started!
... D/MainActivity.onCreate(MainActivity.java:16): number is 3

2021년 5월 30일 일요일

두뇌 훈련을 통한 집중력 향상 수학 퍼즐 게임 모음

1. 하파고(Hapago) - 합하고   


동영상:


 하파고('합하고'에서 유래)는 덧셈, 뺄셈을 통한 두뇌 훈련을 통하여 집중력 향상에 많은 도움을 줄 수 있는 수학 퍼즐 게임입니다. 특히 게임의 후반부로 갈수록 다중 계산 능력순간 대처 능력이 필요하므로 한참 성장하고 있는 아이들의 두뇌 발달 뿐 아니라 어른들의 집중력 유지와 치매 예방에도 많은 도움을 줄 수 있을 것으로 기대합니다.

 게임의 기본 규칙은, 하강하는 블럭을 회전시키고 좌우로 움직여서 보드에 있는 셀의 숫자와 더하여 10을 만드는 것입니다. 보드의 한 라인이 전부 숫자 10으로 채워지면 해당 라인은 사라지면서 점수가 올라갑니다.

세로 방향 블록은 셀들이 한 블록처럼 같이 움직이면서 보드에 있는 셀과의 합계가 10을 넘지 않을 때까지 내려가다가 더 이상 움직일 수 없으면 합해져 보드에 기록됩니다.

가로 방향 블록은 셀들이 같이 움직이면서 보드에 있는 셀과의 합계가 10을 넘지 않을 때까지 내려가다가 각 셀의 어느 한쪽이라도 움직일 수 없으면 합해져 보드에 기록되고 나머지 하나는 계속 내려갑니다.



2. 2D 롤링 퍼즐 게임 (2D Rolling Puzzle Game) 



2D 롤링 퍼즐 게임은 블럭을 좌우 또는 위아래로 밀어서 그림을 맞추는 게임으로 공간지각 능력, 입체적 사고력 향상에 도움을 줄 수 있는 게임입니다. 블럭을 밀면 미는 방향으로 그대로 미끄러져 이동하며 뒷면으로 갈 때도 둥근 원통처럼 같은 방향으로 블럭이 미끄러져 이동하게 됩니다. 따라서 블럭이 같은 방향으로 한바퀴 돌아서 원래의 위치에 오게 되면 원래의 모양과 똑 같은 모양을 갖게 됩니다.

게임 방법:

1. START 버튼을 눌러 퍼즐 그림을 섞고 게임을 시작합니다.
2. 블록을 가로방향 또는 세로방향으로 swipe하여 블록을 이동시킵니다
3. Flip 버튼을 누르면 블록의 뒷면을 확인할 수 있습니다.
4. 설정 버튼을 이용하여 보드 이미지를 바꾸거나 퍼즐의 조각수를 바꿀 수 있으며, 소리재생 여부, 퍼즐조각에 숫자 표시 여부 등을 설정할 수 있습니다.






2021년 5월 21일 금요일

[안드로이드] 플랫폼 버전별 API 레벨 및 버전코드

   개발을 진행하다 보면 사용자 단말의 안드로이드 버전에 따라 지원되는 기능과 지원되지 않는 기능이 있어 이를 버전별로 달리 처리해주어야 할 때가 있다. 이러한 경우를 대비하여 안드로이드 플랫폼 버전별 AP I레벨과 버전코드를 알아보고 버전별로 다른 동작을 수행하도록 하는 방법을 정리해 두고자 한다.

1. 안드로이드 플랫폼 버전별 API 레벨 및 버전코드 (2021.5)

플랫폼 버전

코드 명

API 레벨

버전 코드

Android 11

Android 11

30

R

Android 10.0

Android 10

29

Q

Android 9

Pie

28

P

Android 8.1

Oreo

27

O_MR1

Android 8.0

Oreo

26

O

Android 7.1.1

Nougat

25

N_MR1

Android 7.1

Android 7.0

Nougat

24

N

Android 6.0

Marshmallow

23

M

Android 5.0

Lollipop

22

LOLLIPOP_MR1

Android 5.0

Lollipop

21

LOLLIPOP

Android 4.4W

KitKat Wear

20

KITKAT_WATCH

Android 4.4

KitKat

19

KITKAT

Android 4.3

Jelly Bean

18

JELLY_BEAN_MR2

Android 4.2, 4.2.2

Jelly Bean

17

JELLY_BEAN_MR1

Android 4.1, 4.1.1

Jelly Bean

16

JELLY_BEAN

Android 4.0.3, 4.0.4

IceCreamSandwich

15

ICE_CREAM_SANDWICH_MR1

Android 4.0, 4.0.1, 4.0.2

IceCreamSandwich

14

ICE_CREAM_SANDWICH

Android 3.2

Honeycomb

13

HONEYCOMB_MR2

Android 3.1.x

Honeycomb

12

HONEYCOMB_MR1

Android 3.0.x

Honeycomb

11

HONEYCOMB

Android 2.3.4

Gingerbread

10

GINGERBREAD_MR1

Android 2.3.3

Android 2.3.2

Gingerbread

9

GINGERBREAD

Android 2.3.1

Android 2.3

Android 2.2.x

Froyo

8

FROYO

Android 2.1.x

Eclair

7

ECLAIR_MR1

Android 2.0.1

Eclair

6

ECLAIR_0_1

Android 2.0

Eclair

5

ECLAIR

Android 1.6

Donut

4

DONUT

Android 1.5

Cupcake

3

CUPCAKE

Android 1.1

Base

2

BASE_1_1

Android 1.0

Base

1

BASE


2. 버전코드별 다른 동작 수행 방법
1) 조건문을 통한 처리 방법

  ① API레벨 숫자를 쓰는 방법
    if (Build.VERSION.SDK_INT >= 26) {
        // 처리해야 할 코드
    }

  ② 버전 코드를 쓰는 방법
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        // 처리해야 할 코드
    }

 이렇게 조건을 주어 처리를 하면 minSdkVersion을 낮게 잡을 수 있고, 하위 안드로이드 버전을 쓰는 사용자들에게도 앱을 배포할 수 있다.

2) @TargetApi(version)

  Lint에러를 발생시키지 않는 역할만 한다. 예를 들어 minSdkVersion에 21을 설정하고 이보다 높은 API Level 26에 선언된 API를 사용할 경우 'requires API level 26(current min is 21)' 와 같은 Lint에러가 발생하는데 아래와 같이 TargetApi annotation을 선언해주면 Lint에러는 발생하지 않는다. 따라서 버전에 상관없이 호출 및 동작은 되지만, 버전에 따라 문제가 발생하는 API가 있다면 '1. 조건문을 통한 처리 방법'을 통하여 에러를 방지해야 한다.

@TargetApi(Build.VERSION_CODES.O)
public void Func(String text, int term) {
    ....
}

3) @RequireApi(version)

 minSdkVersion에 지정한 버전보다 낮은데 바로 호출할 경우 컴파일 에러가 발생하도록  호출조건을 강제하는 역할을 한다.

@RequiresApi(Build.VERSION_CODES.O)
private void Func() {
    ...
}

 위와 같이 RequireApi annotation이 선언되어 있다면 아래와 같이 조건을 주고 호출해야 컴파일 에러가 발생하지 않는다.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    Func();
}


[JAVA] hashMap에서 key값으로 Value값 찾기, Value값으로 key값 찾기

Java프로그램을 작성하다가 Color값 배열을 만들고 인덱스로 배열 값을 가져오다가 그 반대로 배열 값을 가지고 인덱스를 구해야 하는 상황이 발생하였다. 참고하려고 정리한다.  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...