모바일 앱 프로그래밍: KOTLIN 정리

Coding_Holic·2021년 11월 9일
1

1.안드로이드 개요

스마트폰의 개요

  • 스마트폰 = 통화 기능 + 컴퓨터 + 다양한 기능 내장(MP3,카메라,DMB,GPS 등)
  • 스마트폰의 역사
    -IBM사의 사이먼(1992)
    -노키아 9000(1996)
    -포켓 PC(2002)
    -아이폰(2007)
    -안드로이드 폰(2008)
    -윈도폰7(2010)

안드로이드

  • 구글(Google)이 2007년 안드로이드사를 인수하면서 시작됨

주요 기능

  • 애플리케이션 프레임워크를 통해서 제공되는 API를 사용함으로써 코드를 재사용하여 효율적이고 빠른 애플리케이션 개발이 가능하다
  • 모바일 기기에 최적화된 달빅 또는 아트런타임 제공
  • 2D그래픽 및 최적화된 달빅 또는 아트런 타임 제공
  • 모바일용 데이터베이스인 SQLite를 제공
  • 각 종 오디오, 비디오 및 이미지 형식을 지원
  • 모바일 기기에 내장된 각종 하드웨어 지원
  • 이클립스 IDE 또는 Android Studio를 통해서 강력하고 빠른 개발 환경을 제공

특징

  • 안드로이드의 핵심 커널(Kernel) : 리눅스(Linux)로 구성
  • 안드로이드 애플리케이션 개발 언어: Java 또는 Kotlin
  • 안드로이드 SDK에서 많은 라이브러리를 포함하고 있어 개발이 용이
  • 오픈 소스를 지향 -> 운영체제부터 관련 문서, 개발 도구 등 거의 모든 것을 무료로 사용 가능
  • 지속적인 업그레이드

구조

  1. 응용 프로그램(Applications)
    -안드로이드 스마트폰에서 사용할 수 있는 일반적인 응용 프로그램
    -웹 브라우저, 달력, 구글맵, 연락처, 게임 등 사용자 입장에서 가장 많이 사용
    -JAVA 또는 Kotlin으로 제작됨

  2. 응용 프로그램 프레임워크(Application Framework)
    -안드로이드 API가 존재하는 곳
    -안드로이드폰 하드웨어에 접근할 때 API를 통해서만 가능

  3. 안드로이드 런타임(Android Runtime)
    -JAVA 코어 라이브러리와 달빅 가상 머신 또는 아트 런타임으로 구성됨
    -안드로이드는 JAVA 또는 Kotlin 문법으로 프로그래밍하지만 Java 가상 머신을 사용하지 않고 이곳의 달빅 가상 머신이 아트 런타임을 사용함

  4. 라이브러리(Libraries)
    -안드로이드에서 사용되는 여러 시스템 라이브러리는 시스템 접근 때문에 Java 또는 Kotlin이 아닌 C로 작성
    -> 성능이 뛰어나며 세밀한 조작 가능

  5. 리눅스 커널(Linux Kernel)
    -하드웨어의 운영과 관련된 저수준의 관리기능
    -메모리 관리, 디바이스 드라이버, 보안 등

안드로이드 개발을 위한 운영 체제

  • Windows, Linux, Mac
  • Windows 개발 환경이 가장 보편적임
  • 안드로이드 개발 환경을 구축하면 가상의 안드로이드 장치인 AVD(Android Virtual Device) 제공
  • 실제 안드로이드 장비 없이도 안드로이드 장비가 있는 것처럼 작업이 가능함

안드로이드 개발 구성

2.안드로이드 애플리케이션

❖ 안드로이드 애플리케이션의 기본적인 작성법을 익힌다.
❖ AVD의 명칭을 파악한다.
❖ 안드로이드 프로젝트의 구성을 이해한다.

Hello Android 프로그램

  1. 안드로이드 프로젝트 생성 2. 화면 디자인 및 편집 (.xml) 3. Kotlin 코드 작성 및 수정 (.kt) 4. 프로젝트 실행 및 결과 확인 (AVD)

-Name: 대문자로 시작하는 것이 좋다
-Package name: com.cookandroid.helloandroid -> 도메인 이름(cookandroid.com)과 애플리케이션 이름을 이어서 만듦
-Save location: 프로젝트가 저장될 폴더 (한글 폴더명은 불가)
-Language: Kotlin
-Minimum API level

AVD의 명칭과 사용법

완전한 기능의 안드로이드 애플리케이션 작성

LinearLayout에는 xmlns:app, tools:context속성 필요없다!
-> 대부분 linear layout 사용

<ctrl>+<Alt>+<O>를 누르면 불필요하게 임포트된 문장이 제거된다.
위젯에 이벤트를 작동하기 위한 동작 순서
1. 위젯 변수 생성 ex) lateinit var button1 : Button
2. 변수에 activity_main.xml 파일의 위젯 id 대입 ex) button1=findViewById<Button>(R.id.button1)
3. 이벤트 발생 시 동작하는 람다식을 위젯에 정의 ex)button1.setOnClickListener{}

안드로이드 프로젝트의 구성

프로그래머가 직접 변경하는 폴더와 파일

java 폴더

  • 하위에 패키지명의 폴더가 있는데, 이는 안드로이드 프로젝트를 생성할 때 입력한 패키지 이름과 동일한 것임
  • 패키지 이름 아래에 MainActivity.kt로 메인 Kotlin 소스가 들어있음
  • 실제로 프로그래머가 가장 많이 수정할 소스 파일이며, 주로 액티비티(화면, activity_main.xml)에서 어떤 일을 할지를 프로그래밍하게 됨

java(generated) 폴더

  • Android Studio 3.2부터 제공되는 폴더이며 시스템 내부적으로 사용되므로 특별히 신경 쓰지 않아도 됨

res 폴더

  • 앱 개발에 사용되는 이미지, 레이아웃, 문자열 등이 들어가는 폴더
drawable 폴더
  • 이미지 파일을 넣음
mipmap 폴더
  • 디자인 화면이나 앱이 설치된 후에 보이는 런처 아이콘을 넣음
  • xxxhdpi, xxhdpi, xhdpi: 초고해상도 런처 아이콘 파일을 넣음
  • hdpi: 고해상도 런처 아이콘 파일을 넣음
  • mdpi: 중해상도 런처 아이콘 파일을 넣음
layout 폴더
  • 액티비티(화면)를 구성하는 XML 파일을 넣음
  • 기본적으로 activity_main.xml이 초기화면으로 지정되어 있음. 추가로 화면이 필요하면 이곳에 XML 형태로 생성함
Values 폴더
  • strings.xml 문자열을 저장
  • colors.xml 색상표를 저장
  • styles.xml 스타일을 저장
  • 메뉴 XML 파일을 저장하는데, 필요시 생성해서 사용
anim 폴더
  • 애니메이션 저장
XML 폴더
  • XML파일 저장

res(generated) 폴더

  • Android Studio 3.5부터 제공되는 폴더이며 내부적으로 사용되므로 신경 쓰지않아도 됨

manifests 폴더

  • AndroidManifest.xml 파일이 들어 있음
  • 앱의 여러 가지 정보를 담고 있는 중요한 파일
  • '매니페스트 파일'이라고 읽으며, 필요에 따라 수정하거나 변경함

Gradle Scripts 폴더

  • Gradle 빌드 시스템과 관련된 파일이 들어 있음
  • 주요한 3개 파일
    -build.gradle(Module:app) 빌드 스크립트 핵심 파일로 컴파일 버전, 실행되는 최하 버전, 컴파일 라이브러리 등을 등록함
    -local.properties 컴파일 되는 SDK의 경로가 들어 있음
    -gradle.properties JVM 관련 메모리가 설정되어 있음

3.코틀린 기본 문법

kotlin의 개요

kotlin의 특징

1.Java와 완벽히 상호 호환, Java 코드를 완전히 대체 가능
2.Java보다 문법이 간결함
3.프로그램의 안정성을 높여줌
4.var 또는 val 예약어를 통해 데이터 형식을 선언하지 않고 변수를 선언할 수 있음

kotlin 프로그램 작성법

  1. intellij IDEA 환경
  2. play.kotlinlang.org

kotlin의 기본 문법

  • 변수 선언 방식
    1) 암시적 선언(var)
    -변수의 데이터 형식을 지정하지 않고, 대입되는 값에 따라 자동으로 변수의 데이터 형식이 지정
    (단, 초기화하지 않는 경우는 데이터 형식을 반드시 명시해야 함)

2) var(variable)
-일반 변수를 선언할 때 사용
-필요할 때마다 계속 다른 값을 대입 가능

3) val(value)
-변수 선언과 동시에 값을 대입하거나, 초기화 없이 선언한 후에 한 번만 값을 대입 가능
-한 번 값을 대입하고 나면 값을 변경할 수 없음

  • 데이터 형식 변환
    -캐스팅 연산자 사용
    -Kotlin에서 제공하는 toInt()나 toDouble() 등의 정적 메소드 사용

  • null 표시
    -Kotlin은 기본적으로 변수에 null 값을 넣지 못함
    -> 변수를 선언할 때 ?를 붙여야 null 대입 가능

-null값이 아니라고 표시 -> !! (null이 들어가면 오류 발생)


  • when문의 처리 방법
    -범위로 처리 : in 키워드 사용

  • 배열
    -여러 개의 데이터를 하나의 변수에 저장하기 위해 사용

    type 1
    var 배열명 = Array<데이터 형식>(개수, {초깃값})
    var 배열명 = Array<데이터 형식>(개수){초깃값}

2차원 배열 선언 형식

  • 예외(exception)
    kotlin 프로그램 실행 중에 발생하는 오류
    -try~catch문을 통해 이 오류를 처리함

  • 연산자

클래스와 인스턴스

  • 클래스
    -변수(필드)와 메소드로 구성
    -객체지향 관점에서의 클래스: 실세계의 객체들이 가질 수 있는 상태와 행도

클래스 상속 inheritance

기존의 클래스가 가지고 있는 것을 그대로 물려받으면서 필요한 필드나 메소드를 추가로 정의하는 것을 의미함

  • 슈퍼 클래스
    -부모 클래스
  • 서브 클래스
    -자식 클래스
  • 메소드 오버라이딩
    -슈퍼클래스의 메소드를 무시하고 새로 정의하는 것을 의미함

추상 클래스

  • 추상클래스는 인스턴스 화를 금지하는 클래스
  • 인스턴스화 -> 인스턴스를 생성하는 것

추상 메소드

  • 본체가 없는 메소드
  • 메소드 앞에 abstract 키워드를 붙여서 지정
    -추상 메소드를 포함하는 클래스는 추상 클래스로 지정해야 함

추상 클래스와 추상 메소드를 사용하는 목적
공통적으로 사용되는 기능을 추상 메소드로 선언 해놓고, 추상 클래스를 상속받은 후에 추상 메소드를 오버라이딩해서 사용하기 위함

구현한다(implement):추상 메소드를 오버라이딩하는 것을 의미함

인터페이스와 다중 상속

인터페이스

-추상 클래스와 성격이 비슷함
-interface 키워드를 사용하여 정의하고 내부에는 추상 메소드를 선언함
-클래스에서 인터페이스를 받아 완성할 때 상속과 마찬가지로 ':인터페이스 이름' 형식을 사용함
-인터페이스는 '상속받는다'고 하지 않고 '구현한다'고 함
-Kotlin은 다중 상속을 지원하지 않음(대신 인터페이스를 사용하여 다중 상속과 비슷하게 작성할 수 있음)

람다식

함수를 익명함수 형태로 간단히 표현한 것

특징

추가로 알아둘 kotlin 문법

패키지

안드로이드에서 제공하는 패키지 목록 확인 링크:
https://developer.android.com/reference/kotlin/packages

제네릭스

  • 데이터 형식의 안전성을 보장하기 위해 사용
  • <String> <Int> <Double>

문자열 비교,날짜 형식

  • equals() 메소드

  • simpleDateFormat

4.기본 위젯 익히기

뷰의 개요

뷰와 뷰그룹

  • 뷰 클래스
    -안드로이드 화면에서 실제로 사용되는 것들은 모두 View 클래스의 상속을 받음
    (버튼, 라디오 버튼, 이미지 등은 모두 View 클래스의 서브클래스임)
    -'위젯'이라고도 부름
    (화면에서의 버튼: 버튼 위젯, 실제 코드에서의 버튼: 버튼 클래스)

  • 레이아웃
    -다른 위젯을 담을 수 있는 위젯 -> 레이아웃
    (위젯을 담아 배치하는 틀)
    -ViewGroup 클래스 아래에 존재
    (레이아웃도 크게 보면 위젯에 포함된다)

  • 안드로이드에서의 위젯
    -control이라고 부르는 것들!

  • View 클래스 계층도
    -최상위에 Object(java.lang.Object) 클래스가 있고 이를 상속받은 View클래스가 있음
    -안드로이드 화면에 나타나는 모든 위젯은 View 하위에 존재한다
    -뷰 컨테이너(View container)
    (레이아웃이라고 부르지는 않지만 다른 뷰를 포함하는 ListView, GridView, TabHost, Gallery)
    (뷰 컨테이너도 ViewGroup 클래스에서 상속받음)

  • 버튼의 속성

    (https://developer.android.com/reference/packages에서 자세히 확인 가능)

  • View 클래스의 주요 XML 속성
    -안드로이드 계층도를 보면 View 클래스가 모든 위젯의 부모
    (즉, 위젯과 레이아웃 등은 모두 View 클래스의 속성과 메소드를 상속받음)
    -View 클래스의 중요한 속성을 파악하면 하위 클래스도 쉽게 이해할 수 있음)

android:layout_width-> 가로 height-> 높이
wrap_content -> 내용만 감싸면 된다, match_parent -> 부모 클래스와 일치하도록!

fill_parent와 match_parent는 완전히 똑같다!

  • 값을 숫자로 직접 지정하는 경우
    -단위에 주의 해야함
    -px(PiXel) 단위
    (가장 단순한 단위 avd의 해상도가 1080x1920일때 -> 1080px로 설정하면 된다)

  • visibility 속성
    -위젯을 보일 것인지 여부를 결정함

    visible: default로 설정되어 있으며, 보이는 상태
    invisible: 안보이는 상태이지만, 보이지 않을 뿐 원래의 자리를 계속 유지함
    gone: 안보이는 상태이며, 원래의 자리까지 사라짐

  • enabled,clickable 속성
    -XML 보다 Kotlin 코드에서 주로 사용된다
    -값은 true와 false이며 디폴트 값은 true임
    (enabled 속성: 위젯의 동작여부, clickable 속성: 클릭이나 터치가 동작 여부)

  • rotation 속성
    -위젯 회전시켜서 출력함
    -값은 각도로 지정

기본 위젯 다루기

텍스트뷰

  • text 속성
    -text View에 나타나는 문자열을 표현
    -"문자열"형식으로 값을 직접 입력하거나 "@string/변수명" 형식으로 지정한 후 strings.xml 파일에 지정할 수 있음

  • textColor 속성
    -글자의 색상을 지정
    -background 속성처럼 값은 #RRGGBB나 #AARRGGBB 형식을 사용함

  • textSize 속성
    -글자의 크기를 dp,px,in,mm,sp 단위로 지정

  • typeface 속성
    -글자의 글꼴을 지정
    -값으로 sans, serif, monospace를 설정할 수 있다. 디폴트는 normal

  • textStyle 속성
    -글자의 스타일 지정
    -값으로 bold, italic, bold|italic을 설정할 수 있고, 디폴트는 normal

  • singleLine 속성
    -글이 길어 줄이 넘어갈 경우 강제로 한 줄까지만 출력하고 문자열의 맹 뒤에 '...'를 표시
    -값으로 true와 false를 설정할 수 있고 디폴트는 false

dp: 독립단위 dpi=px

Kotlin 코드로 XML 속성 설정

버튼과 에디트텍스트

  • 버튼과 에디트텍스트는 사용자에게서 어떤 값을 입력받기 위한 가장 기본적인 위젯

  • 두 위젯은 View 클래스와 TextView 클래스를 상속받으므로 비슷하게 사용 가능함

  • 버튼 클릭 시 동작하는 Kotlin 코드를 세단계로

  1. 버튼 변수 선언(var mybutton : Button)
  2. 변수에 버튼 위젯 대입(mybutton = findViewById<Button>(R.id.button1))
  3. 버튼을 클릭할 때 동작하는 람다식 정의(mybutton.setOnClickListener { // 동작 내용을 이 부분에 })
  • editText도 변수를 선언하고 이 변수에 해당 ID 값을 넣은 후에 접근함
    1.edittext 변수 선언
    2.변수에 에디트텍스트 위젯 대입
    3.에디트텍스트에 입력된 값 가져오기 -> 주로 버튼 클릭 이벤트 람다식 안에 넣음

setOntouchLISTENER RETURN값이 FALSE이면 ? 받은 터치를 다른 곳에서도 사용할 수 있게 남겨두겠다 TRUE이면 받은 터치를 없애겠다는 뜻!

TRIM() 공백 없애기
TOAST().makeText(applicationContext,"넣고싶은말",Toast.LENGTH_SHORT).show()

기본 위젯 활용하기

컴파운드버튼

  • 체크박스
    -체크박스는 클릭할 때마다 상태가 체크, 언체크로 바뀜
    -여러 개의 체크박스가 있어도 서로 독립적으로 동작한다는 특징이 있어 여러 개를 동시에 체크할 수 있음
  1. 체크박스 변수 선언
  2. 변수에 체크박스 위젯 대입
  3. 체크박스가 변경될 때 동작하는 람다식 정의
  • 스위치와 토글버튼
    -스위치와 토글버튼은 모양만 조금 다를 뿐 용도는 거의 동일함
    -스위치의 주 용도는 온/오프 상태 표시
    (XML 속성이나 관련 메소드는 모두 체크박스와 동일하게 사용 가능)

    (checked 속성은 true와 false에 따라서 색상과 글자가 다르게 표현된다!)

  • 라디오 버튼과 라디오 그룹
    -라디오 버튼 (여러개 중 하나 선택)
    -라디오 그룹 (ViewGroup-LinearLayout의 하위 클래스로 존재함,clearCheck()-라디오 그룹 안에 체크된 것을 모두 해제함)

이미지뷰와 이미지버튼

-그림을 출력하는 위젯
-그림을 넣거나 화면을 화려하게 구성할 때 사용함!

  • src
    -이미지의 경로
  • maxHeight/maxWidth
    -이미지의 크기
  • scaleType
    -이미지의 확대/축소 방식을 지정
    -속성:matrix,fitXY,fitStart,fitEnd,center 등

[res]-[drawble]폴더에 그림파일이 잇어야한다!

android:scaleType="fitXY" : 가로/세로 비율에 상관없이 ImageView의 레이아웃의 각 면에 꽉 차게 출력된다.
android:scaleType="matrix" : 이미지 원본의 크기와 비율을 유지하며 이미지 원본대로 왼쪽 상단을 기준으로 출력된다. 이미지가 ImageView의 레이아웃 보다 크다면 나머지 이미지는 출력되지 않는다.
android:scaleType="fiStart" : ImageView 레이아웃 안에서 이미지의 가로/세로 비율을 유지하며 출력되지만 ImageView의 레이아웃의 왼쪽 상단을 기준으로 정렬된다.
android:scaleType="fitEnd" : ImageView 레이아웃 안에서 이미지의 가로/세로 비율을 유지하며 출력되지만 ImageView의 레이아웃의 오른쪽 하단을 기준으로 정렬된다.
android:scaleType="center" : 이미지 원본 크기와 비율을 유지하며 이미지의 중앙을 layout_width, layout_height 안에 출력한다. 이 때 레이아웃보다 이미지가 크면 레이아웃의 벗어난 이미지는 출력되지 않은다. 레이아웃보다 이미지가 작으면 이미지를 center 정렬 한다.
android:scaleType="matrix" : 이미지 원본의 크기와 비율을 유지하며 이미지 원본대로 왼쪽 상단을 기준으로 출력된다. 이미지가 ImageView의 레이아웃 보다 크다면 나머지 이미지는 출력되지 않는다.


duplicate resources-> 이름은 같고 확장자가 다른 파일이 2개이상 있을 경우 발생한다!

버튼 색깔 변경? android:backgroundTint="@color/black"

kotlin

checkbox.setOnCheckedChangeListener{} 사용

레이아웃 익히기

레이아웃의 개요

레이아웃의 기본 개념

  • 레이아웃의 대표적인 속성
    -orientation: 레이아웃 안에 배치할 위젯의 수직 또는 수평 방향을 설정
    -gravity: 레이아웃 안에 배치할 위젯의 정렬 방향을 좌측, 우측, 중앙 등으로 설정
    -padding: 레이아웃 안에 배치할 위젯의 여백을 설정
    -layout_weight: 레이아웃이 전체화면에서 차지하는 공간의 가중값을 설정하는데, 여러 개의 레이아웃이 중복될 때 주로 사용
    -baselineAligned : 레이아웃 안에 배치할 위젯을 보기 좋게 정렬함

  • 레이아웃 종류
    -리니어 레이아웃
    -렐러티브 레이아웃
    -프레임 레이아웃
    -테이블 레이아웃
    -그리드 레이아웃

리니어 레이아웃

기본 리니어레이아웃의 형태

  • orientation 속성
    -리니어레이아웃의 가장 기본적인 속성
    -vertical, horizontal을 지정할 수 있음

  • gravity 속성
    -레이아웃 안의 위젯을 어디에 배치할 것인지를 결정
    -값으로 left, right, center, top, bottom 등을 사용
    -2개를 조합하여 right|bottom처럼 사용할 수도 있음

  • layout_gravity 속성
    -자식을 어디에 위치시킬지를 결정

  • baselineAligned 속성
    -크기가 다른 위젯들을 보기 좋게 정렬해주는 것으로 true와 false 값을 지정할 수 있음

중복 리니어레이아웃의 형태

-> layout weight -> 높이 일정하게

Kotlin 코드로 화면 만들기

기타 레이아웃

렐러티브 레이아웃

위치를 교차해서 코드 적으면 된다!

  • 다른 위젯의 상대 위치에 배치
    -렐러티브레이아웃 안에서 다른 위젯의 특정한 곳에 배치하는 방법도 있음

테이블 레이아웃

  • 위젯을 표형태로 배치할 때 주로 사용

  • layout_span
    -테이블 레이아웃 안에 포함된 위젯에 설정하는 속성
    -열을 합쳐서 표시하라는 의미

  • layout_column
    -테이블 레이아웃 안에 포함된 위젯에 설정하는 속성
    -지정된 열에 현재 위젯을 표시

  • stretchColumns
    -<TableLayout> 자체에 설정하라는 속성

그리드 레이아웃

  • 좀더 직관적이다!

  • 행 확장도 간단하게 할 수 있음

  • rowCount: 행의 수

  • columnCount: 열의 수

  • orientation: 그리드를 수평 방향으로 우선할 것인지, 수직 방향으로 우선할 것인지를 결정

  • layout_row: 행번호(0부터 시작)

  • layout_column: 열 번호(0부터 시작)

  • layout_rowSpan: 행을 지정된 수만큼 확장함

  • layout_columnSpan: 열을 지정된 수만큼 확장함

  • layout_gravity: 주로 fill, fill_vertical, fill_horizontal 등으로 지정

프레임 레이아웃


메뉴와 대화상자

메뉴

  • 옵션 메뉴(option menu)
    -키패드의 메뉴 버튼 또는 화면 오른쪽 위의 메뉴 아이콘을 눌렀을 때 화면 하단에 나오는 메뉴
    -목록이 많으면 위쪽으로 쌓여 출력됨(화면이 넘어갈 정도로 목록이 많으면 스크롤해서 선택가능함)

  • 컨텍스트 메뉴(context menu)
    -위젯 등을 롱클릭하면 나오는 메뉴(일반적으로 제목과 함께 화면의 중앙에 출력됨)
    <menu>-<item>

  • onOptionsItemSelected( ) 메소드
    -Activity 클래스에서 오버라이딩함
    -메뉴를 선택했을 때 어떤 동작을 할 것인지를 담고 있음
    -메뉴는 항목이 여러 개 나오기 때문에 보통 메소드 내부에서 when문을 사용함

토스트

대화상자

그래픽과 이미지

그래픽

캔버스와 페인트의 기본


isAntiAlias -> 가장자리를 매끄럽게!

그래픽 처리의 기본

터치 이벤트

이미지

비트맵의 기본

이미지의 기하학적 변환

이미지 활용

profile
안녕하세용 개발에 미치고 싶은 초보 개발자입니다:)

0개의 댓글