BuNa_
IT Story
BuNa_
전체 방문자
오늘
어제
  • 분류 전체보기 (117)
    • CS (14)
      • 운영체제 (8)
      • 네트워크 (0)
      • Design Pattern (1)
      • OOP (4)
    • 대외활동 (24)
      • 우아한테크코스 (14)
      • DND 동아리 (4)
      • UMC 동아리 (5)
      • 해커톤 (1)
    • Android (29)
      • MVVM (2)
      • 스터디 (11)
      • Compose (3)
      • Unit Test (1)
    • Project (5)
      • 어따세워 (5)
      • DnD 과외 서비스 (0)
    • Programming (11)
      • Kotlin (4)
      • 파이썬 (7)
    • Git (1)
    • 인공지능 (22)
    • 백준 (8)
    • 기타 (3)
      • IntelliJ (1)
      • 일상 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • Android
  • 인공지능
  • 우테코 프리코스
  • 우아한테크코스
  • 운영체제
  • 다이나믹 프로그래밍
  • 컴공선배
  • Baekjoon
  • 파이썬
  • K-means
  • UMC
  • 우테코
  • Ai
  • Compose
  • k-means++
  • MVVM
  • 딥러닝
  • 셀레니움
  • 객체지향 생활체조
  • 백준
  • 원시값 포장
  • ViewModel
  • External fragmentation
  • 인공지능 분류
  • RecyclerView
  • 어따세워
  • 외부 단편화
  • 우테코 5기
  • 선형회귀
  • 안드로이드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
BuNa_

IT Story

UMC 4주차 컴공선배 워크북 내용정리
대외활동/UMC 동아리

UMC 4주차 컴공선배 워크북 내용정리

2022. 4. 5. 01:25

'컴공선배 4주차 워크북 내용정리'

 

Android 4주차 워크북

수업 내용 정리

(수업에 관련해서 기억하고 싶은 내용 및 배운 내용을 정리해주세요. 실습이 있을 경우, 실습한 내용을 캡쳐해주세요.)

✅ 실습 체크리스트

  • [x] 실제 Flo앱과 흡사하게 만들었나요? - 단지 비슷해서만 되는게 아닙니다! 디자인을 실제 퍼블리싱하는 과정을 연습하는 것이기 때문에 다른 사람이 볼때 정말 플로어플인지 아닌지 헷갈릴 정도로 만들었는지 확인해주세요!
  • [x] 비율 코딩이 잘 되어있나요? (xml 상의 기기를 바꿔보면서 비율코딩 확인)

  • [x] 모든 View에 적절한 id(네이밍)을 매치했나요?
  • [x] SongActivity의 Thread 클래스에 의해 잘 작동이 되나요?
  • [x] 기능이 전부 정상적으로 작동하나요?
  • [x] MainActivity의 Seekbar가 잘 작동하나요?
  • [x] SongActivity의 한곡재생 버튼 클릭시 thread가 재시작이 되나요?

📌 과제가 뭔가요?


  • 기본 과제
    • Splash Activity 구현해보기‼️
    • SongActivity Timer Seekbar 구현해보기(멈추고 다시 실행 종료 다 해보기)‼️

 

 

 

 

 

[구현 화면]

[과제 구현 화면]

 

👑 챌린지 과제 👑

  • [Main] 화면 Seekbar 구현해보기‼️
  1. 전달받은 Song 객체를 바탕으로 화면 구성
  2. 종료시 ActivityResultLauncher에 Song 객체를 전달해주기 위해 setResult() 메서드 호출
  3. 전달받은 Song 객체로 다시 MainActivity 구성
  • [Song] 화면 한곡재생 버튼 클릭 시 스레드 재시작 구현해보기 ‼️
  • private fun randomPlay() { binding.songProgressSb.progress= 0 // Seekbar progress 0으로 초기화 binding.songStartTimeTv.text= String.format("%02d:%02d", 0, 0) // 진행 시간 Text 0분 0초로 초기화 song.second = 0 // 진행 시간 초기화 song.isPlaying = true // 바로 실행 setPlayerStatus(song.isPlaying) if (!timer.isInterrupted) { timer.interrupt() } startTimer() // Timer 시작 }
  • [Home] 뷰페이저 자동 슬라이드 구현해보기‼️(끝 뷰페이저에 도달했다면 처음으로)
  • launch{ while(true){ delay(2000) // 2초 대기 with(homePanelViewpager){ currentItem= (currentItem+ 1) % panelAdapter.itemCount } } }
  • (MainActivity는 코루틴으로 구현하였습니다.)
  • MainActivity에서 Seekbar의 진행도, 실행여부(실행, 멈춤) 등을 SongActivity로 전달

🎯 핵심 키워드

  • Thread
    • Thread의 문제점
      • 문제점 : 공유 자원의 문제, 동시에 여러 Thread가 실행될 때, 하나의 Data에 Thread가 동시에 접근할 때 문제가 발생한다. 교착상태(Deadlock) 등등..
      • 해결방법
        1. 어떤 것을 먼저 처리할지 순서를 정한다. (join()을 통해 이전 작업이 끝날 때까지 대기)
        2. syncronized block을 통해 해결할 수 있다.
      SingleThread와 MultiThread의 속도에는 차이가 없지만, 비동기적으로 로직을 수행할 수 있다.
    • Thread는 동기적? 비동기적?
      • Thread
        • Thread를 통해 여러 로직들을 비동기적으로 처리할 수 있다. 예를 들어, A, B, C, D, E라는 작업이 있을 때,Context switch를 해가면서 A, B, C, D, E를 조금씩 처리하는 MultiTasking을 수행할 수 있다.
        • A가 끝나고, B를 처리한다. → B가 끝나고 C를 처리한다 → ... → D가 끝나고 E를 처리한다. 과 같은 방식인 동기적인 작업이 아닌,
    • Handler
      • Thread간의 통신을 도와주는 역할을 수행함.
      • UI관련 함수는 UI(Main) Thread 외에서 처리할 수 없는데, 별도의 MainLooper를 가지는 Handler객체를 만들고, 타 Thread에서 handler객체에게 post또는 postDelayed를 호출함으로써 블럭 내의 UI로직을 처리할 수 있다.
    • runOnUiThread
      • UI Thread에서 동작할 수 있도록 하는 함수
  • Thread 종료
    • flag(run함수 끝내기)
      • while문을 통해 flag가 False인 동안 무한정 작업을 수행하다가, 특정 작업이 끝나면 flag를 True로 바꾸어주어 Thread를 종료시킨다.
    • interrupt
      • Thread 객체 내부에 정의되어 있는 interrupt() 함수.
      • interrupt를 발생시키면 의도적으로 InterruptedException을 발생시켜 Thread를 종료시킬 수 있다.
  • Looper
    • Looper란 Thread를 통해 생성되고 계속 반복적으로 어떠한 일을 처리하는 것을 의미한다.
    • 여기서 말하는 일은 Message Queue에 있는 Message를 읽는 일을 의미한다.
    • Message Queue가 비어있는 동안에는 대기하다가, Message가 들어오면 이를 적절한 Handler로 전달하는 일을 반복해서 수행하는데, 이처럼 하나의 Thread를 점유해서 Message Queue만을 위해 일하는 개념을 Looper라고 한다.
  • Splash Theme
    • 앱이 구동될 때, 짧은 시간동안 보여주는 시작화면을 의미한다.
    • 앱의 데이터를 로딩하는 시간 동안 빈 화면을 보여주지 않기 위해 대략 1~2초간 보여주는 화면.
  • 코루틴
    • 코틀린, C#, 파이썬, javascript 등에서 지원하는 비동기 개념
    • 경량화 Thread라고도 하며, 말 그대로 Thread에 비해 훨씬 가볍고 저렴한 비용으로 비동기 로직을 처리할 수 있다.

🔥 논의해보면 좋은 것들

  • Thread 종료 후(interrupt) 다시 실행하고 싶으면 어떻게 해야할까?
    • Thread는 한 번 종료되면 다시 재시작하지 못한다.
    • Thread내부에서 사용하던 Data를 따로 저장해두고, Thread 객체를 다시 생성한 뒤, Thread가 기존 data를 다시 사용하도록 하게 한다.
  • Thread가 유용하게 쓰이는 것들 생각해보기
    • Worker Thread에서 서버로부터 Data를 받아오는 로직을 처리하는 동안, 다른 UI 관련 로직은 그대로 수행한다. (ANR, Exception 등 방지)
  • Thread의 문제점에 대해 알아보고 이를 해결할 방법(interrupt,join,AsynkTask 등)에 대해 알아보기
    • Interrupt
      • 해당 thread 객체에 정의되어 있는 interrupt() 메서드를 호출하면 Thread 내부의 run() 메서드에 InterruptedException이 발생한다. 이를 try catch로 안전하게 처리한다.
      • 예제 코드
      public class MyThread extends Thread {}
        public static void main(String[] atgs){
            
            Thread thread = new MyThread();
            thread.start();
            
            try{Thread.sleep(1000);}catch (InterruptedException e){}
      
            *//스레드를 종료시키기 위해 InterruptedException을 발생시킴*
            thread.interrupt(); 
      
      }
    • }
    • public class InterruptExam {
    • public void run(){ try{ while (true){ System.out.println("실행 중"); Thread.sleep(1); } }catch (InterruptedException e){} System.out.println("자원 정리"); System.out.println("실행 종료"); }
    • join
      • join() 메서드를 호출한 Thread는 일시 정지 상태가 된다. 실행 대기 상태로 돌아가려면 join() 메서드를 멤버로 가지는 Thread가 종료되거나 매개값으로 주어진 시간이 지나야 한다.
      • 관련 메서드join(long millis)
      • join(long millis, int nanos)
      • join()
    • AsyncTask
      • doInBackground(백그라운드 로직 수행), onPreExecute(Task 실행 전 처리할 로직), onPostExecute(Task가 모두 완료된 이후 처리할 로직), onProgressUpdate(UI 관련 로직 수행)을 오버라이드하여 비동기적으로 수행할 수 있도록 한다.
      • API level 30(11) 부터는 Deprecated된 class이다.
        • 오직 한 번만 실행되어 재사용이 불가능.
        • 직접 종료해주지 않으면 종료되지 않기 때문에 메모리 누수 발생.
        • UI Thread 상에서 호출해야 함.
  • 코루틴 이용해보기
  • CoroutineScope(Dispatchers.Main).launch{ with(binding){ val albumAdapter = LockerVpAdapter(this@LockerFragment) lockerContentVp.adapter= albumAdapter TabLayoutMediator(lockerTb, lockerContentVp){tab, position-> tab.text= information[position] }.attach() } }

📢 4주차 수업 후기

  • 4주차 수업을 듣고 서로 느낀 점을 이야기해주세요!
  • 핵심 키워드에 대해 완벽하게 이해했는지? 혹시 이해가 안 되는 부분은 뭐였는지? 서로 이야기해주세요!
  • 트러블 슈팅(실패한 경험도 성장을 위한 경험!)
    • 트러블 슈팅 양식[ 해결 방안 ]
    • [ 참고 자료 ]
    • [ 문제 원인 ]
  • 스터디 인증샷 잊지 마세요!

❓ 모르는 것들 / 해결하지 못한 것들

모르거나 해결하지 못한 것들을 정리해서 QnA 채널이나 스터디를 통해 같이 해결해보아요!

질문은 어떻게 하는게 좋나요?

Android 4주차 워크북

수업 내용 정리

(수업에 관련해서 기억하고 싶은 내용 및 배운 내용을 정리해주세요. 실습이 있을 경우, 실습한 내용을 캡쳐해주세요.)

✅ 실습 체크리스트

  • [x] 실제 Flo앱과 흡사하게 만들었나요? - 단지 비슷해서만 되는게 아닙니다! 디자인을 실제 퍼블리싱하는 과정을 연습하는 것이기 때문에 다른 사람이 볼때 정말 플로어플인지 아닌지 헷갈릴 정도로 만들었는지 확인해주세요!
  • [x] 비율 코딩이 잘 되어있나요? (xml 상의 기기를 바꿔보면서 비율코딩 확인)
  • [x] 모든 View에 적절한 id(네이밍)을 매치했나요?
  • [x] SongActivity의 Thread 클래스에 의해 잘 작동이 되나요?
  • [x] 기능이 전부 정상적으로 작동하나요?
  • [x] MainActivity의 Seekbar가 잘 작동하나요?
  • [x] SongActivity의 한곡재생 버튼 클릭시 thread가 재시작이 되나요?

📌 과제가 뭔가요?


  • 기본 과제
    • Splash Activity 구현해보기‼️
    • SongActivity Timer Seekbar 구현해보기(멈추고 다시 실행 종료 다 해보기)‼️

[과제 구현 화면]

  • 챌린지 과제
    • [Main] 화면 Seekbar 구현해보기‼️
    1. 전달받은 Song 객체를 바탕으로 화면 구성
    2. 종료시 ActivityResultLauncher에 Song 객체를 전달해주기 위해 setResult() 메서드 호출
    3. 전달받은 Song 객체로 다시 MainActivity 구성
    • [Song] 화면 한곡재생 버튼 클릭 시 스레드 재시작 구현해보기 ‼️
    • private fun randomPlay() { binding.songProgressSb.progress= 0 // Seekbar progress 0으로 초기화 binding.songStartTimeTv.text= String.format("%02d:%02d", 0, 0) // 진행 시간 Text 0분 0초로 초기화 song.second = 0 // 진행 시간 초기화 song.isPlaying = true // 바로 실행 setPlayerStatus(song.isPlaying) if (!timer.isInterrupted) { timer.interrupt() } startTimer() // Timer 시작 }
    • [Home] 뷰페이저 자동 슬라이드 구현해보기‼️(끝 뷰페이저에 도달했다면 처음으로)
    • launch{ while(true){ delay(2000) // 2초 대기 with(homePanelViewpager){ currentItem= (currentItem+ 1) % panelAdapter.itemCount } } }
  • (MainActivity는 코루틴으로 구현하였습니다.)
  • MainActivity에서 Seekbar의 진행도, 실행여부(실행, 멈춤) 등을 SongActivity로 전달

🎯 핵심 키워드

  • Thread
    • Thread의 문제점
      • 문제점 : 공유 자원의 문제, 동시에 여러 Thread가 실행될 때, 하나의 Data에 Thread가 동시에 접근할 때 문제가 발생한다. 교착상태(Deadlock) 등등..
      • 해결방법
        1. 어떤 것을 먼저 처리할지 순서를 정한다. (join()을 통해 이전 작업이 끝날 때까지 대기)
        2. syncronized block을 통해 해결할 수 있다.
      SingleThread와 MultiThread의 속도에는 차이가 없지만, 비동기적으로 로직을 수행할 수 있다.
    • Thread는 동기적? 비동기적?
      • Thread
        • Thread를 통해 여러 로직들을 비동기적으로 처리할 수 있다. 예를 들어, A, B, C, D, E라는 작업이 있을 때,Context switch를 해가면서 A, B, C, D, E를 조금씩 처리하는 MultiTasking을 수행할 수 있다.
        • A가 끝나고, B를 처리한다. → B가 끝나고 C를 처리한다 → ... → D가 끝나고 E를 처리한다. 과 같은 방식인 동기적인 작업이 아닌,
    • Handler
      • Thread간의 통신을 도와주는 역할을 수행함.
      • UI관련 함수는 UI(Main) Thread 외에서 처리할 수 없는데, 별도의 MainLooper를 가지는 Handler객체를 만들고, 타 Thread에서 handler객체에게 post또는 postDelayed를 호출함으로써 블럭 내의 UI로직을 처리할 수 있다.
    • runOnUiThread
      • UI Thread에서 동작할 수 있도록 하는 함수
  • Thread 종료
    • flag(run함수 끝내기)
      • while문을 통해 flag가 False인 동안 무한정 작업을 수행하다가, 특정 작업이 끝나면 flag를 True로 바꾸어주어 Thread를 종료시킨다.
    • interrupt
      • Thread 객체 내부에 정의되어 있는 interrupt() 함수.
      • interrupt를 발생시키면 의도적으로 InterruptedException을 발생시켜 Thread를 종료시킬 수 있다.
  • Looper
    • Looper란 Thread를 통해 생성되고 계속 반복적으로 어떠한 일을 처리하는 것을 의미한다.
    • 여기서 말하는 일은 Message Queue에 있는 Message를 읽는 일을 의미한다.
    • Message Queue가 비어있는 동안에는 대기하다가, Message가 들어오면 이를 적절한 Handler로 전달하는 일을 반복해서 수행하는데, 이처럼 하나의 Thread를 점유해서 Message Queue만을 위해 일하는 개념을 Looper라고 한다.
  • Splash Theme
    • 앱이 구동될 때, 짧은 시간동안 보여주는 시작화면을 의미한다.
    • 앱의 데이터를 로딩하는 시간 동안 빈 화면을 보여주지 않기 위해 대략 1~2초간 보여주는 화면.
  • 코루틴
    • 코틀린, C#, 파이썬, javascript 등에서 지원하는 비동기 개념
    • 경량화 Thread라고도 하며, 말 그대로 Thread에 비해 훨씬 가볍고 저렴한 비용으로 비동기 로직을 처리할 수 있다.

🔥 논의해보면 좋은 것들

  • Thread 종료 후(interrupt) 다시 실행하고 싶으면 어떻게 해야할까?
    • Thread는 한 번 종료되면 다시 재시작하지 못한다.
    • Thread내부에서 사용하던 Data를 따로 저장해두고, Thread 객체를 다시 생성한 뒤, Thread가 기존 data를 다시 사용하도록 하게 한다.
  • Thread가 유용하게 쓰이는 것들 생각해보기
    • Worker Thread에서 서버로부터 Data를 받아오는 로직을 처리하는 동안, 다른 UI 관련 로직은 그대로 수행한다. (ANR, Exception 등 방지)
  • Thread의 문제점에 대해 알아보고 이를 해결할 방법(interrupt,join,AsynkTask 등)에 대해 알아보기
    • Interrupt
      • 해당 thread 객체에 정의되어 있는 interrupt() 메서드를 호출하면 Thread 내부의 run() 메서드에 InterruptedException이 발생한다. 이를 try catch로 안전하게 처리한다.
      • 예제 코드
      public class MyThread extends Thread {}
        public static void main(String[] atgs){
            
            Thread thread = new MyThread();
            thread.start();
            
            try{Thread.sleep(1000);}catch (InterruptedException e){}
      
            *//스레드를 종료시키기 위해 InterruptedException을 발생시킴*
            thread.interrupt(); 
      
      }
    • }
    • public class InterruptExam {
    • public void run(){ try{ while (true){ System.out.println("실행 중"); Thread.sleep(1); } }catch (InterruptedException e){} System.out.println("자원 정리"); System.out.println("실행 종료"); }
    • join
      • join() 메서드를 호출한 Thread는 일시 정지 상태가 된다. 실행 대기 상태로 돌아가려면 join() 메서드를 멤버로 가지는 Thread가 종료되거나 매개값으로 주어진 시간이 지나야 한다.
      • 관련 메서드join(long millis)
      • join(long millis, int nanos)
      • join()
    • AsyncTask
      • doInBackground(백그라운드 로직 수행), onPreExecute(Task 실행 전 처리할 로직), onPostExecute(Task가 모두 완료된 이후 처리할 로직), onProgressUpdate(UI 관련 로직 수행)을 오버라이드하여 비동기적으로 수행할 수 있도록 한다.
      • API level 30(11) 부터는 Deprecated된 class이다.
        • 오직 한 번만 실행되어 재사용이 불가능.
        • 직접 종료해주지 않으면 종료되지 않기 때문에 메모리 누수 발생.
        • UI Thread 상에서 호출해야 함.
  • 코루틴 이용해보기
  • CoroutineScope(Dispatchers.Main).launch{ with(binding){ val albumAdapter = LockerVpAdapter(this@LockerFragment) lockerContentVp.adapter= albumAdapter TabLayoutMediator(lockerTb, lockerContentVp){tab, position-> tab.text= information[position] }.attach() } }

📢 4주차 수업 후기

  • 4주차 수업을 듣고 서로 느낀 점을 이야기해주세요!
  • 핵심 키워드에 대해 완벽하게 이해했는지? 혹시 이해가 안 되는 부분은 뭐였는지? 서로 이야기해주세요!
  • 트러블 슈팅(실패한 경험도 성장을 위한 경험!)
    • 트러블 슈팅 양식[ 해결 방안 ]
    • [ 참고 자료 ]
    • [ 문제 원인 ]
  • 스터디 인증샷 잊지 마세요!

❓ 모르는 것들 / 해결하지 못한 것들

모르거나 해결하지 못한 것들을 정리해서 QnA 채널이나 스터디를 통해 같이 해결해보아요!

질문은 어떻게 하는게 좋나요?

 

저작자표시 비영리 변경금지 (새창열림)

'대외활동 > UMC 동아리' 카테고리의 다른 글

UMC 3주차 컴공선배 워크북 내용정리  (0) 2022.03.30
UMC 2주차 컴공선배 워크북 내용정리  (0) 2022.03.22
UMC 1주차 컴공선배 워크북 내용정리  (2) 2022.03.14
[UMC 동아리 합격] UMC 동아리 2기 합격 과정 및 후기  (3) 2022.03.08
    '대외활동/UMC 동아리' 카테고리의 다른 글
    • UMC 3주차 컴공선배 워크북 내용정리
    • UMC 2주차 컴공선배 워크북 내용정리
    • UMC 1주차 컴공선배 워크북 내용정리
    • [UMC 동아리 합격] UMC 동아리 2기 합격 과정 및 후기
    BuNa_
    BuNa_
    안드로이드 개발자를 향해 달리고 있는 공대생입니다! 🧑 Android, Kotlin, Java, Python 등 학습하고 있는 내용과 프로젝트를 주로 업로드하고 있습니다. 지적과 조언은 언제나 환영입니다!😊 github : https://github.com/tmdgh1592

    티스토리툴바