안드로이드 스튜디오 딜레이(Delay) 구현

728x90

앱을 구현하다 보면 병렬 처리가 필요할 경우 스레드를 사용하면 되지만 상황에 따라서 일정시간 뒤에 전체 로직을 수행해야 할 경우가 있다.

 

필자 같은 경우 현재 구현하고 있는 카드 뒤집기 게임에서 일정시간 전체 카드를 보여주고 다시 뒤집는 로직을 수행하거나 두 번째 오픈한 카드가 일치하지 않을 때 일정시간 이후 다시 뒤집어야 되는데 여기서 딜레이가 필요했기 때문에 정리하기로 마음먹었다.

 

결론부터 말하자면 Handler의 postDelayed 메서드를 사용하면 된다.

new Handler().postDelayed(new Runnable(){
        @Override
        public void run(){
            //구현하고 싶은 코드
        }
    }, 5000);	//5초

 

Handler의 postDelayed 메서드에 Runnable 인터페이스를 파라미터로 주고 run을 실행시키는 형태이다.

 

이때 두 번째 파라미터는 딜레이하고 싶은 시간인데 기준이 ms(미리 세컨드)이므로 1초당 1000ms로 계산해서 넣으면 된다.

 

new Handler().postDelayed(new Runnable(){
        @Override
        public void run(){
            for (int i = 0; i < idIndex; i++){
                animator = ObjectAnimator.ofFloat(findViewById(i),"rotationY",0,180);
                animator.start();
            }
            clickControl(true);
            if(player == 1){
                stt = new SoloTimerThread();
                t = new Thread(stt);
            }else{
                dtt = new DuoTimerThread();
                t = new Thread(dtt);
            }
            t.start();
        }
    }, 5000);

위 코드는 5초의 딜레이를 주고 모든 카드들을 y축을 기준으로 180도 뒤집은 다음, 모드에 따라 해당하는 스레드를 실행시키는 예제이다.

 

의외로 스레드만큼 딜레이는 유용하므로 코드를 참고하여 적절히 사용하면 좋을 것 같다.

728x90

댓글()

안드로이드 스튜디오 스레드(Thread) 구현하기

728x90

카드 맞추기 앱을 구현하면서 타이머 때문에 스레드를 다루게 되어 정리할 겸 포스팅하기로 했다.

 

하나의 동작하는 프로그램을 프로세스(Process)라고 하며 하나의 프로세스는 한 가지 일밖에 하지 못한다.

 

하지만 프로세스 안에 있는 스레드를 이용한다면 두 가지 이상의 일을 동시에 할 수 있다.

 

물론 보다 정확히 말하자면 동시에 하는 것처럼 보이게 할 수 있는 것이다.(스레드에 대해 자세한 정리는 기회가 되면 포스팅하겠다.)

 

이를 병렬 처리라 하며 안드로이드의 자바 코드로 스레드를 구현하는 방법은 두 가지가 있다.

 

첫 번째는 Thread 클래스를 상속받는 방법이고 두 번째는 Runnable 인터페이스를 구현하여 Thread 객체에 전달하는 방법이다.

 

Thread 클래스


public class MyThread extends Thread {
    // run() 메소드를 오버라이드
    public void run() {
    	// 수행할 로직
        System.out.println("Hello from a thread!");
    }

    public static void main(String[] args) {
        // MyThread 객체를 생성한 후, start() 메소드를 호출하여 실행
        MyThread thread = new MyThread();
        thread.start();
    }
}

위 내용은 스레드를 상속받아 사용하는 코드이다.

 

start() 메서드를 실행하면 Thread 클래스 내부에서 run() 메서드를 실행하기 때문에 꼭 thread.run()이 아닌 thread.start()로 하는 것을 잊으면 안 된다.

 

Runnable 인터페이스


Thread는 Class를 상속(Extends) 받기 때문에 Java의 단일상속에 의해 다른 Class를 상속받을 수 없어 유용하지 않은 편이다.

 

또한 Thread를 상속받을 경우 Thread Class에 구현된 모든 코드들이 동작하기 때문에 자원을 많이 잡아먹어 효율적이지 못하다.

 

이를 해결하기 위해 Runnable 인터페이스를 구현(Implements)하고 Thread 객체에 전달하면 대부분의 구현을 할 수가 있다.

 

public class MyRunnable implements Runnable {
    // run() 메소드를 오버라이드
    public void run() {
    	// 수행할 로직
        System.out.println("Hello from a thread!");
    }

    public static void main(String[] args) {
        // MyRunnable 객체를 생성한 후, 이를 Thread 생성자에 전달
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

 

위 내용은 Runnable 객체를 생성한 후 Thread 생성자에 전달해서 Thread를 생성하고 실행한다.

 

이때 생성한 Runnable 객체는 다른 클래스에서도 사용할 수 있기 때문에 유연한 코드 작성이 가능하다.

 

Thread는 상속이고 Runnable은 Interface이기 때문에 다중 상속이 불가능한 Java에서 Runnable 객체는 아주 유용한 작성방법이다. 

 

Runnable 인터페이스를 이용한 Thread 수행 시에도 내부적으로 Run() 메서드를 오버라이드 하기 때문에 thread.run()이 아닌 thread.start()를 해야 한다.

 

Thread를 사용하는 대표적인 예시가 타이머이기 때문에 마지막으로 Runnable Interface를 이용한 타이머를 예제로 설명하겠다.

 

public class MyRunnable implements Runnable {
    // run() 메소드를 오버라이드
    public void run() {
    	// 스레드가 실행할 로직 구현
        int second = 0;
        System.out.println("===== 타이머 실행 =====");
        // 타이머에 자주 쓰는 코드
        while (true){
            System.out.println("실행시간 : " + second);
            try {
                Thread.sleep(1000); 	// 1초 딜레이
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
            second++;
        }
        System.out.println("===== 타이머 종료 =====");
    }

    public static void main(String[] args) {
        // MyRunnable 객체를 생성한 후, 이를 Thread 생성자에 전달
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

 

위 예제는 While문을 통해 무한 루프를 돌면서 Thread.sleep으로 1초간 딜레이를 주는 타이머다.

 

이때 종료하고 싶은 시점에서 thread.stop()이나 thread.interrupt()를 호출하면 Run() 메서드 내부에서 Catch문에 걸려 종료할 수 있다.

 

thread.stop()은 불완전한 메서드이기 때문에 thread.interrupt()를 추천한다.

728x90

댓글()

안드로이드 스튜디오 Lombok 사용하기

728x90

객체지향 프로그래밍을 하다 보면 Getter와 Setter 등을 필수적으로 사용하게 된다.

 

물론 Eclipse나 Intellij, Android Studio 등 대부분의 IDE에서 속성(변수)을 만들어 놓으면 클릭 몇 번으로 Getter, Setter를 생성할 수 있지만 Model의 개수가 많아지거나 속성이 많아진다면 매번 생성하는 것도 번거롭고 코드의 양도 비약적으로 상승하게 된다.

 

이때 설치 한 번으로 편리하게 사용할 수 있는 라이브러리가 Lombok이다.

 

Lombok 이란?


Lombok(롬복)이란 Java에서 제공하는 라이브러리로 Annotation을 통해 컴파일 과정에서 반복되는 소스코드를 생성해 준다.

 

즉, 개발자가 보는 코드 레벨에서는 불필요한 반복코드를 생략함으로써 생산성을 향상하고 가독성과 유지보수 측면에서 장점이 있는 라이브러리다.

 

하지만 Annotation을 사용하기 때문에 개발자에 따라 직관성이 떨어져 보일 수 있고 API의 동작 방식을 어느 정도 숙지해야 다른 라이브러리와의 충돌 등에 대한 문제에 대처할 수 있기 때문에 호불호가 갈리는 라이브러리이기도 하다.

 

안드로이드 스튜디오에 Lombok 적용하기


직접 Lombok 사이트로 가서 jar 파일을 다운로드할 수도 있지만 안드로이드 스튜디오에서는 Plugin을 제공하기 때문에 간단하게 설치하여 적용할 수 있다.

 

Lombok PluginLombok Plugin
Lombok Plugin

File -> Settings에서 Plugins를 누르고 lombok을 검색하면 가장 많이 설치되어 위에 뜨는 Lombok을 Install 하면 된다.

 

Restart IDE
Restart IDE

Install이 완료되면 Restart IDE로 문구가 바뀌는데 IDE가 시작될 때 적용되므로 클릭해서 재시작해준다.

 

참고로 지금 당장 적용 할 필요가 없다면 나중에 IDE 킬 때 자동으로 적용된다.

 

Dependencies
Dependencies

Lombok을 설치했다면 이제 build.gradle(Module:app)에 의존성을 추가해야 한다.

 

compileOnly 'org.projectlombok:lombok:1.18.16'
annotationProcessor 'org.projectlombok:lombok:1.18.16'

dependencies에 위 두 줄을 추가하고 Sync Now를 클릭해서 동기화를 시켜준다면 Lombok을 사용할 준비가 끝난다.

 

Lombok 적용 예시
Lombok 적용 예시

사용 방법은 사진에 보이다시피 상당히 간단하다.

 

@Getter, @Setter

각 속성에 대한 Getter, Setter 메서드를 제공한다.

 

@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

@NoArgsConstructor 어노테이션은 파라미터가 없는 생성자를, @AllArgsConstructor 어노테이션은 모든 속성 값을 파라미터로 갖는 생성자를, @RequiredArgsConstructor 어노테이션은 final이나 @NonNull 어노테이션을 갖는 속성 값만 파라미터로 갖는 생성자를 제공한다.

 

@ToString

모든 속성값을 문자열로 바꿔주는 toString 메서드를 자동 생성한다.

 

@DATA

모든 어노테이션을 포함하여 제공한다.

728x90

댓글()

안드로이드 스튜디오 액션 바(Action Bar) 없애기

728x90

안드로이드 프로젝트를 생성하고 에뮬레이터를 돌리면 Default로 상단에 액션 바(Action Bar)가 보인다.

 

Action Bar
Action Bar

프로젝트 이름이 쓰여있으며 텍스트나 색상, Action 등을 자유롭게 설정할 수 있다.

 

다만 이 액션 바를 사용하지 않는 경우도 많기에 없애는 방법 두 가지를 알아보자.

 

첫 번째는 Java 파일에서 없애는 방법이다.

 

Action Bar
Action Bar

위 코드처럼 onCreate 메서드 안에 액션 바에 대한 객체를 얻어와서 hide 메서드를 실행하면 된다.

 

이렇게 사용한다면 해당 액티비티에서만 액션 바를 숨길 수 있기 때문에 특정 액티비티에서만 지우려면 효율적이지만 전체적으로 적용하기엔 불편한 방법이다.

 

따라서 아예 액션 바가 필요 없다면 테마를 변경하는 두 번째 방법을 추천한다.

 

Style.xml
Style.xml

app > res > values로 이동해서 styles.xml 파일을 연다.

 

Style.xml
Style.xml
Style.xml
Style.xml

위 사진과 같이 AppTheme를 NoActionBar에서 상속받을 수 있도록 변경하면 된다.

 

어떤 방법이든 상황에 맞게 적절히 사용하면 될 것이다.

728x90

댓글()

안드로이드 스튜디오 액티비티 전환하기

728x90

앱을 사용하면서 가장 기본이 되는 액티비티 전환에 대해 알아보자.

 

그전에 액티비티란 하나의 화면이라고 생각하면 된다.

 

UI인 xml파일과 해당 화면의 기능을 수행하는 java파일이 한 세트다.

 

안드로이드 스튜디오에서 프로젝트를 갓 생성하면 MainActivity.java와 activity_main.xml이 있다.

 

필자는 모드 선택 > 난이도 선택 > 게임 진행을 베이스로 구현할 것이기 때문에 Main을 ModeSelect로 변경하고 진행하겠다.

 

RefactorRefactor
Refactor
Refactor
Refactor

이름 변경은 java파일과 xml파일을 우클릭 > Refactor > Rename을 누른 후 원하는 이름으로 변경하고 Refactor를 누르면 어느 곳에서 변경이 이루어지는지 Preview를 볼 수 있는데 한 번 확인하고 Do Refactor를 누르면 전체적으로 변경된다.

 

혹시 모르니 이름 변경하고 나서 에뮬레이터를 돌려 확인해보고 만약에 오류가 뜬다면 AndroidManifest.xml 파일을 열어서 변경이 제대로 되었는지 확인해보면 된다.

 

이제 새로운 액티비티를 생성할 차례다.

 

Empty Activity
Empty Activity

app > java > 액티비티가 있는 폴더에서 우클릭 > New > Activity > 원하는 액티비티를 누르면 처음 프로젝트 생성할 때처럼 액티비티 생성 화면이 나온다.

 

Empty Activity
Empty Activity

Activity Name을 설정하고 Finish를 누르면 되는데 Generate Layout File은 액티비티를 생성할 때 자동으로 xml파일도 만들어준다는 항목이므로 선택 해제하지 않는 것을 추천한다.

 

새로운 Activity
새로운 Activity

또한 자동으로 추가되긴 하지만 혹시 모르니 AndroidManifest.xml에도 추가되었는지 보고 에뮬레이터까지 돌려서 확인해보는 것을 추천한다.

 

그럼 현재 두 개의 액티비티가 있으니 전환을 해보도록 하자.

 

기본적으로 안드로이드에서는 Intent란 객체를 사용하는데 간단하게 데이터를 전달하는 객체라고 생각하면 된다.

 

물론 화면 전환 시에도 Intent를 사용할 것이다.

 

Button
Button

xml파일로 이동해서 자석 모양의 불가표시를 해제하고 Palette를 열어 Buttons의 Button을 드래그해서 생성한 뒤 왼쪽에서 text를 변경했다.

 

만약 필자의 화면처럼 보이지 않는다면 오른쪽 상단의 3가지 Display 형태를 클릭하면 되고 자신한테 편한 대로 사용하면 된다.

 

함수
함수

또한 위 사진처럼 <Button> 안에 android:onClick="실행할 함수 명"을 입력해준다.

 

해당 버튼을 클릭했을 경우 매칭 되는 이름을 가진 함수를 실행한다는 의미이다.

 

그럼 현재 xml파일과 매칭 되는 java파일로 가서 해당 함수를 작성하면 된다.

 

메서드
메서드

onCreate 메서드와 동일한 위치에 이렇게 작성하면 된다.

 

Intent의 첫 번째 파라미터는 해당 액티비티를 의미하는 this를, 두 번째 파라미터는 이동을 원하는 액티비티를 작성하고 startActivity에 해당 intent를 넣으면 된다.

 

실제로 에뮬레이터를 돌려보니 버튼 클릭 시 화면 이동하는 것을 확인할 수 있었다.

 

 

728x90

댓글()

안드로이드 스튜디오 깃허브 연동하기

728x90

안드로이드 개발을 하면서 코드 관리를 위해 깃허브에 연동하도록 한다.

 

Settings
Settings

안드로이드 스튜디오 좌상단 File > Settings... 를 클릭하면 설정 화면 하나가 뜬다.

 

Git
Git

Version Control > Git을 누르고 빨간 표시의 Test를 클릭하면 깃 버전을 확인할 수 있다.

 

Git Version
Git Version

위 사진처럼 뜬다면 제대로 된 것이며 상황에 따라 오류 메시지를 출력할 수 있다.

 

그럴 땐 Test 왼쪽의 ...을 클릭해서 자신의 깃 설치 경로를 찾으면 된다.

 

cmd 폴더에 git.exe로 설정하면 될 것이다.

 

Test로 버전 확인을 했다면 이번엔 계정 연동할 차례다.

 

GitHub Login
GitHub Login

Version Control > GitHub로 이동해서 Add account를 클릭하고 자신의 깃허브 계정을 입력하니까 유효하지 않은 인증 데이터라며 찾을 수 없다고 뜬다.

 

깃허브로부터 토큰을 발급받아 인증해야 될 것 같으니 깃허브로 이동한다.

 

토큰토큰토큰
토큰

깃허브에서 Settings를 누르고 맨 아래 Developer settings을 누른 뒤 Personal access tokens의 Tokens(classic)을 누른다.

 

바로 위의 Fine-grained tokens는 개인 접근용 토큰이란 정보를 얻었지만 Beta 버전이기도 해서 기존의 classic 방법으로 하겠다.

 

토큰
토큰

마찬가지로 토큰을 생성하는데 classic 한 방법으로 얻도록 한다.

 

Note에서 간략하게 설명을 작성하고 Expiration에서 토큰 기한을 설정한 뒤(필자는 혹시 모르니 최대한 길게 90일로 설정했다.) repo, workflow, admin:org, gist정도를 체크하고 맨 밑에 Generate token을 클릭하면 된다.

 

그럼 초록색 바탕의 네모난 상자가 있을 텐데 해당 토큰 값을 자신이 찾기 쉬운 위치에 저장한다.

 

계정
계정

다시 안드로이드 스튜디오로 돌아와서 Enter token을 누르고 자신의 토큰 값을 입력한 뒤 Log in을 누르면 사진처럼 자신의 깃허브 계정이 추가된 것을 확인할 수 있다.

 

이제 계정 연동은 되었으니 실제 코드를 관리하기 위한 Repository 연동을 하면 된다.

 

Repository 연동
Repository 연동

안드로이드 스튜디오에서 VCS > Import into Version Control > Share Project on GitHub를 클릭하고 Repository name, Description을 작성한 뒤 Share를 누르면 Repository에 올릴 파일들의 목록이 빨간색 이름으로 뜨고 Add를 누르면 자동으로 깃허브에 Repository가 생성된다.

 

Branch
Branch

다만 필자는 실무처럼 프로젝트를 진행하기 위해 master 브랜치를 prod로 바꾸고 dev 브랜치를 생성했다.

 

안드로이드 스튜디오 오른쪽 아래 Git: master라고 되어 있는 부분을 클릭하고 사진처럼 Rename이나 New Branch를 통해 이름을 바꾸거나 새로운 브랜치를 생성하면 된다.

 

CommitCommit
Commit

변경사항이 있으면 우상단 초록색 체크표시를 누르고 Commit Message를 작성한 뒤 Commit and Push를 누르면 되고 만약 2인 이상의 협업일 경우 파란색 화살표 표시를 누르면 깃허브의 변경된 사항을 로컬 환경으로 가져올 수 있다.

 

참고로 Commit은 로컬 환경의 Git에 저장하는 거고 깃허브까지 변경사항을 저장하려면 Push를 해야 되는데 필자는 한꺼번에 하기 위해 Commit and Push를 자주 쓰는 편이다.

 

여기까지 하면 안드로이드 스튜디오에서 깃허브 연동이 끝나게 된다.

 

이제 개발을 시작하면서 착실히 코드 관리를 해나가면 된다.

728x90

댓글()

안드로이드 스튜디오 프로젝트 생성 방법

728x90

전에 대학 강의에서 App 개발을 몇 번 해봤지만 거의 구글링을 하며 제대로 이해도 못하고 복붙 한 수준이라 취업 이후에 Native App 개발을 제대로 해보려 작성하게 되었다.

 

안드로이드 스튜디오 버전 확인
안드로이드 스튜디오 버전 확인

현재 3.6.3 버전을 사용할 예정이며 이미 설치되어 있는 경우 Help > About을 통해 버전 확인이 가능하고 최신 버전을 설치하고 싶다면 밑에 링크를 통해 설치하거나 업데이트는 Help > Check for Updates > Download를 통해 업데이트할 수 있다.

 

https://developer.android.com/studio?gclid=Cj0KCQiAj4ecBhD3ARIsAM4Q_jE8bl-MgIyN4T4pUB7QX1xe_u5bZWk8EBYUT2Vf1IGdNL1tKE10QE8aAsRUEALw_wcB&gclsrc=aw.ds 

 

Download Android Studio & App Tools - Android Developers

Android Studio provides app builders with an integrated development environment (IDE) optimized for Android apps. Download Android Studio today.

developer.android.com

 

또한 필자는 이미 프로젝트가 존재하기 때문에 열린 상태에서 새로운 프로젝트를 만들어 보도록 하겠다.

 

 

New Project
New Project

File > New > New Project를 선택하면 템플릿 선택 화면이 나온다.

 

 

Template
Template

Empty Activity를 선택하고 Next를 누르면 여러 가지 설정 화면이 나온다.

 

 

Template 설정
Template 설정

각 항목은 다음과 같다.

  • Name : 프로젝트의 이름
  • Package name : 패키지명이며 뒤에 Name이 자동으로 붙는다. 경우에 따라 패키지 중간의 이름을 수정하지만 필자는 개인의 사이드 프로젝트이므로 그대로 example로 사용하도록 하겠다. 공백이나 대문자가 없는 것이 특징이다.
  • Save location : 해당 프로젝트가 저장될 경로이며 본인이 쉽게 찾을 수 있는 경로에 저장하는 것이 좋다.
  • Language : 사용할 언어를 선택하는 항목이며 Java와 Kotlin이 있다. 필자는 Java로 Native App을 구현할 예정이기에 Java를 선택했다.
  • Minimum SDK : 사용 가능한 최소 안드로이드 버전을 뜻한다. 해당 항목에서 최신 버전을 선택할수록 신규 API를 사용할 수 있지만 더 낮은 버전을 가진 모바일 기기에서는 다운로드가 불가능하다. 밑에 있는 설명은 해당 수치만큼 대략적으로 사용 가능하다는 뜻이며 필자는 92.7% 정도 실행 가능한 안드로이드 7.0(Nougat)을 선택했다. 각자 적당한 수치라 생각되는 버전을 선택하면 될 것이다.
  • Use legacy android support libraries : 간단히 말해 호환을 위한 옵션이다. 신규 API는 오래된 버전에선 동작할 수 없기에 오래된 버전에서도 정상 동작하게끔 지원하는 옵션이다. 상황에 맞게 선택하면 될 것 같다.

모든 항목을 다 확인하고 Finish를 누르면 다음과 같이 화면이 뜬다.

 

 

SDK
SDK

빨간 표시를 한 큐브 모양 아이콘을 클릭하면 Android SDK를 설치할 수 있는데 SDK란 Software Development Kit의 약자로 개발에 필요한 도구들의 모음이라 생각하면 된다.

 

 

SDK
SDK

최신 버전의 SDK만 설치되어 있다면 하위 버전 한 두 개 정돈 더 있는 게 좋다고 하는데 필자는 Android 10.0 버전이 이미 설치되어 있으므로 update만 진행하도록 하겠다.

 

SDK를 설치하는데 비교적 많은 저장공간을 필요로 하므로 여유가 엄청 많은 게 아니라면 무작정 설치하는 것보다는 꼭 필요해 보이는 것 한 두 개 정도만 설치하는 것을 권장한다. (시간도 상당히 걸린다.)

 

 

SDK
SDK

또한 광고를 붙여 구글 앱 스토어에 출시할 예정이므로 SDK Tools에서 Google Play services를 설치하도록 한다.

 

 

Build
Build

상단의 초록색 망치 모양을 클릭해서 아래 사진과 같이 BUILD SUCCESSFUL 이 뜬다면 성공적으로 SDK를 설치한 것이다.

 

 

Build Success
Build Success

다음은 안드로이드를 컴퓨터로 돌리기 위한 에뮬레이터를 설치할 차례다.

 

 

AVD
AVD

오른쪽 상단에 휴대폰 모양을 누르면 AVD Manager가 뜨는데 필자는 이미 에뮬레이터가 설치되어 있으므로 Create Virtual Device를 통해 새로운 에뮬레이터를 설치하면 된다.

 

 

Hardware
Hardware

보편적인 사이즈이며 Play Store도 가능한 Pixel 2를 선택하고 Next를 누른다.

 

 

SDK
SDK

현재 안드로이드 10.0 버전의 SDK를 설치했기에 일치시키려 Q를 설치 후 Next를 눌렀다.

 

 

AVD
AVD

그다음은 필요한 경우에 이름 설정을 하고 나머진 딱히 수정할 항목이 없어서 Finish를 누르면 AVD가 설치된다.

 

이후 우측 상단의 초록색 화살표를 누르거나 Shift + F10을 누르면 프로젝트를 실행하면서 자동으로 에뮬레이터가 실행되는 것을 확인할 수 있다.

 

여기까지 했다면 이제 안드로이드 개발을 시작할 준비가 된 것이다.

728x90

댓글()