반응형

분류 전체보기 209

백준 1003번 피보나치 함수(Kotlin)

이번 글에선 백준 1003번을 풀어보도록 하자. https://www.acmicpc.net/problem/1003 1003번: 피보나치 함수 각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다. www.acmicpc.net 자세한 문제 내용은 위 링크에서 직접 확인해보도록 하자. 풀이 이 문제를 보고 제일 먼저 든 풀이법은 그냥 문제에 나온 함수를 돌리는 거였다. import java.util.Scanner var zero = 0 var one = 0 fun main(){ val input = Scanner(System.`in`) val t = input.nextInt() for(i in 1 .. t){ var n = input.nextInt() fibonacchi..

백준 2022.01.08

스테이트 패턴(State Pattern)

스테이트 패턴 스테이트 패턴은 객체가 어떠한 동작을 수행할 때 객체의 '상태(state)'에 따라 다른 동작을 수행하도록 하는 상황에서, 객체의 상태를 직접 체크하는 것이 아닌 상태 자체를 객체화하여 상태 객체가 동작을 수행하도록 위임하는 패턴이다. 예시 게임 캐릭터를 가지고 예시를 한 번 들어보도록 하자. const val SEATING = "seating" const val STANDING = "standing" fun main(){ var player = Player() player.rightClick() player.setState(SEATING) player.rightClick() } class Player(){ private var state = STANDING fun setState(stat..

스트래티지 패턴(Stratagy Pattern)

스트래티지 패턴 스트래티지 패턴은 행위(Behavior)들을 캡슐화하여 동적으로 자유롭게 바꿀 수 있게 하여 전략(Stratagy)을 쉽게 바꿀수 있게 해주는 패턴이다. 코드에서 달라지는 부분을 찾아내어 분리시킨 뒤, 이를 캡슐화한다. 상속보다는 구성을 활용하며, 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다. 예시 어떤 게임에 셋의 캐릭터가 존재한다고 생각해보자. abstract class Player{ fun attack(){ println("공격합니다.") } fun walk(){ println("걷습니다.") } abstract fun display() } class Warrior: Player(){ override fun display(){ println("전사입니다.") } } class F..

MVC, MVP, MVVM

MVC(Model, View, Cotroller) MVC에선 소프트웨어를 세 가지 역할로 구분한다. Model -소프트웨어가 "무엇"을 할 것인지 정의한다. -비즈니스 로직, 소프트웨어에서 데이터를 처리하는 역할을 한다. -사용자에게 필요한 모든 데이터를 가지고 있어야 한다. 비즈니스 로직 : 업무에 필요한 데이터를 처리하는 응용프로그램의 일부 Controller -Model과 View사이에서 통신을 담당한다. -View를 선택하여 사용자로부터 데이터를 입력받으면 이를 Model에 전달한다. View -User Interface로서, 실제로 사용자에게 보여지는 역할을 한다. -Model이 처리한 데이터를 넘겨받아 이를 가지고 화면을 만든다. -Model을 통해 업데이트 하기 때문에 의존도가 높다. 안드로..

Computer Science 2022.01.06

안드로이드 AudioManager로 볼륨 조절(Kotlin)

이번 글에선 안드로이드에서 AudioManager를 사용해 볼륨을 조절하는 법에 대해 알아보도록 하자. 권한 요청 해당 기능을 사용하기 위해선 방해금지 권한이 필요하다. android.permission.ACCESS_NOTIFICATION_POLICY 먼저, Manifest파일에 위와 같은 코드를 추가해주고 사용자에게 권한을 요청해야 하는데, 여기서 다른 권한들과 요청하는 방법이 조금 다르다. val notificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if(Build.VERSION.SDK_INT >= 23){ if(!notificationManager.isNotificationPoli..

안드로이드 Geofence(지오펜스)

이번 글에서는 안드로이드의 Geofence를 사용하는법에 대해 알아보도록 하자. Geofence에서 fence는 담, 울타리 등을 의미하는데, 스마트폰의 GPS위치를 기반으로 장소와 범위를 지정하여 울타리를 만들고, 울타리 내에 들어가거나 나올때에 이벤트를 동작시키는 기능이다. Geofence는 BroadCastReceiver를 사용하여 백그라운드에서 동작한다. 때문에 앱을 실행중이지 않을 때에도 이벤트가 발생하면 정해진 동작을 수행한다. 이제 실제로 Geofence를 사용하는 법에 대해서 알아보도록 하자. Defendency Geofence를 등록하기 위해선 gradle파일에 의존성을 추가해주어야 한다. dependencies { ... implementation 'com.google.android.g..

OSI 7계층 (Open System Intercon)

OSI 7계층은 네트워크 통신 프로토콜을 각 기능별로 7개 계층으로 나눈것을 말한다. 통신 과정을 각 계층별로 나눈 이유, 목적은 통신이 이루어지는 과정을 단계별로 파악하기 위해서이다. 각 계층이 정해진 작업만 수행하면 흐름을 파악하기가 용이하고, 혹 통신 과정에 이상이 생겼을 때 어느 단계에서 발생했는지를 확인하여 효율적인 해결이 가능하다. OSI 7계층은 위의 7개 계층으로 되어있는데, 각 계층에 대해서 알아보도록 하자. 1계층 - 물리 계층(Physical layer) 물리 계층은 실제 장치들을 연결하기 위한 전기적, 물리적 세부 사항들을 정의한다. 이 계층에선 전송하려는 데이터가 무엇인지, 어떤 오류가 있는지는 전혀 신경쓰지 않고 단지 디지털 데이터를 그에 맞는 전기적 신호들로 변환, 변조하여 전..

Computer Science 2021.12.29

lateinit과 by lazy의 차이

코틀린에서는 기본적으로 변수에 null이 들어가는 것을 허용하지 않는다. (nullsafe) 때문에 아래처럼 class에서 전역 변수를 선언하고 이후에 초기화하기 위해선 해당 변수를 nullable한 변수로 선언해줘야 한다. class exam(){ var a: String? = null fun hello(){ a = "Hello" println(a) } } 하지만, 위와 같은 방법은 다음과 같은 이유로 쓰는 것이 꺼려질 수 있다. 1. 변수 a가 nullable하기 때문에 null이 들어가면 안 되는 변수에 사용하기가 꺼려진다. (Kotlin의 null safety장점 활용 불가) 2. 해당 변수의 값이 초기화 이후 변하지 않을 경우 a를 var로 선언할 필요가 없어진다. 위와 같은 경우에 사용하기 위..

안드로이드 데이터베이스 SQLite(Koltin)

많은 양의 데이터를 관리하려면 데이터베이스는 필수라고 할 수 있다. 데이터베이스에도 종류는 여러가지지만, 이 글에선 안드로이드에서 기본적으로 사용가능한 SQLite를 사용해보자. DB생성 가장 먼저 DBHelper.kt파일을 생성하여 아래와같이 작성해준다. class DBHelper( context: Context?, name: String?, factory: SQLiteDatabase.CursorFactory?, version: Int ): SQLiteOpenHelper(context, name, factory, version){ override fun onCreate(db: SQLiteDatabase) { var sql: String = "CREATE TABLE if not exists animals..

안드로이드 스피너(Spinner, Kotlin)

스피너는 위와 같이 여러 개의 값 중에 하나의 값을 선택할 수 있도록 하는 방법 중 하나이다. 스피너는 초기에 기본값으로 설정된 값을 표시하고 있으며, 클릭 시 드롭다운 메뉴를 표시하여 자신이 원하는 값을 선택할 수 있다. 스피너에 제공하는 값들은 SpinnerAdapter를 통해 제공되는데, 값들을 어떠한 자료 구조에서 가져오느냐에 따라 배열의 경우 ArrayAdapter, 데이터베이스 쿼리에서 가져오는 경우 CursorAdapter 등을 사용할 수 있다. 이번 글에서는 ArrayAdapter를 사용하여 배열 구조에서 값들을 가져와보도록 하자. XML 만들기 스피너에 사용할 값들이 사전에 결정된 경우에는 문자열 리소스 파일을 정의하여 사용할 수 있다. 토끼 곰 호랑이 사자 고양이 먼저, res/valu..

반응형