[Android/Flutter 교육] 2일차

MSU·2023년 12월 27일

Android-Flutter

목록 보기
2/85
post-thumbnail

Live강의다보니 적으면서 두서없이 정리된 부분이 있다.
일단 교육 진행하면서 꼭 기록을 남기는 것을 목표로 차근차근 노력해보자.

2023-12-27~2024-01-08 : 코틀린 언어
2024-01-09~2024-01-15 : 학생정보 관리 프로젝트(코틀린)
2024-01-16~2024-02-07 : 안드로이드 1차 수업
2024-02-08 : 깃허브
2024-02-13~2024-02-14 : 메모 어플리케이션 프로젝트(안드로이드)
2024-02-15~2024-02-28 : 안드로이드 2차 수업
2024-02-29~2024-03-07 : 게시판 프로젝트(안드로이드)
2024-03-11~2024-03-12 : 디자인 패턴(MVVM)
2024-03-13~2024-04-26 : 쇼핑몰 프로젝트(기획 및 개발)
2024-04-29~2024-05-01 : 다트 언어
2024-05-02~2024-05-08 : 플러터
2024-05-09~2024-05-16 : 플러터 프로젝트
2024-05-17~2024-06-12 : 자율 프로젝트(안드로이드/플러터)
2024-06-13 : 수료

Kotlin 언어 소개

  • IntelliJ 개발도구를 제작한 JetBrains에서 만든 프로그래밍 언어로 2011년 공개됨
  • 2017년 Google에서 안드로이드 개발 공식 언어로 Kotlin 소개
  • Java 대체 언어로 많은 주목을 받고 있음
  • C-Kotlin, Java-Kotlin, Javascript-Kotlin 등 동일한 코틀린 문법을 사용하여 다른 언어 프로그램을 만들 수 있다.

Kotlin 개발 분야

  • Kotlin for Server Side: 서버 개발
  • Kotlin for Android : 안드로이드 개발
  • Kotlin for Javascript
  • 등등

Kotlin 개발 환경 세팅 내용

  1. 젯브레인홈페이지에서 Community Edition을 내려받기
  2. 설치파일 내려받기가 완료되면 실행하여 설치(다른 설정 필요없이 다음 버튼 계속 눌러서 설치)
  3. Name : 수업에서 정해놓은 이름으로 설정
    Location : 만들어놓은 폴더 선택
    Language : Kotlin 선택
    JDK : semeru-18(IBM JDK version 18.0.2)

코틀린 파일 실행

src폴더에 생성한 main.kt 파일을 실행하면
-> kt파일을 자바파일로 변경함
-> 코틀린 컴파일러가 out 폴더에 자바 class를 생성함
-> 윈도우용 Java VM이 class파일을 실행함(Mac에서는 Mac용 Java VM이)

프로그래밍 언어 실행 과정

대부분의 프로그래밍 언어 -> C언어 기반임 -> 기계어(windows, mac, linux OS별로 다름)

설계의 중요성

저급언어(기계) / 고급언어(사람)

C언어의 경우

한국어로 된 책을 다른 나라에서도 읽을 수 있게 하려면
각 나라의 출판사에서 판권을 사와서 각 나라 언어 번역본을 출간함
-> C언어 방식

C언어로 만든 프로그램이 있는 경우,
windows에서 실행할 수 있게 만드는 작업(.exe파일)
linux에서 실행할 수 있게 만드는 작업
mac에서 실행할 수 있게 만드는 작업을 모두 해줘야 함
개발자가 windows에서만 돌아가는 프로그램을 만든 경우에는 다른 os에서 실행이 불가함
각 OS에서 실행할 수 있게 기계어로 번역이 된 상태이기 때문에 프로그램 속도가 빠르다
=> 속도는 빠르지만 시간과 비용이 많이 소모됨

다른 언어의 경우

VM(Virtual Machine)을 사용하는 방법(통역)
VM이 하는 일은 많지만 그중 대표적인 기능이 기계어 번역임(OS별로)
실행을 할 때 코드를 한줄 한줄 일일이 번역을 하면서 실행을 해줌(비효율적, 시간소요)
그러나 C언어의 경우와 달리 OS에 맞추는 작업을 할 필요없이 코드를 한번만 짜주면 VM이 OS에 맞춰서 번역을 해서 실행해준다.
컴퓨터의 성능이 발전하면서 이러한 방식을 고집해도 성능 저하의 체감이 거의 없음

닷넷프레임워크는 윈도우에서 사용하는 대표적인 VM이다.
자바는 JVM(윈도우용, 맥용, 리눅스용이 따로 있다)
class파일 안에는 JVM이 인식할 수 있는 코드가 있어서 이를 JVM이 실행할 수 있게 해줌

코틀린 실행 과정

  1. 개발자는 Kotlin 문법에 맞춰 코드를 작성
  2. Kotlin 코드를 실행하면 Kotlin 코드는 Java 코드로 변경된다.
  3. Java코드를 컴파일하여 class코드로 변경한다.
  4. class코드를 JVM(Java Virtual Machine)으로 전달하여
  5. OS에 맞는 기계어로 번역하여 실행한다.
  6. 이 때, fun main()이라고 되어 있는 부분을 찾아 그 부분의 코드를 동작시켜준다.
  7. 개발자 입장에서 프로그램의 시작 부분은 fun main() 부분이 된다.

메모리

폰노이만 구조

  • CPU는 매우 빠르지만, (가격이 비싸다)
  • 저장소는 매우 느리다. (가격이 싸다)
  • 저장소를 빠르게 만들 수 있지만 비용이 매우 비싸짐(비용 문제로 그렇게 못만듬)

CPU와 저장소의 속도 차이를 극복하기 위해 중간에 RAM을 추가함
CPU <- RAM <- DISK
CPU가 사용할 데이터를 DISK에서 RAM으로 저장함
CPU는 RAM에 저장된 데이터를 사용해서 처리하는 구조

RAM은 전력공급이 차단되면 RAM에 저장되어있던 내용들이 날라감

프로그램 처리에 필요한 코드를 RAM에 저장해주는 과정이 꼭 필요
(프로그래머는 VM에 이 과정을 요청해준다)

RAM에 데이터를 저장하려면 공간이 필요함(위치, 크기, 용도)
논리적인 하나의 공간

데이터 단위는 1bit부터 시작
8bit -> 1byte (글자 하나를 표현할 수 있음)
bit는 전구 2개
8bit,1byte는 전구 128개
문자를 2진수로 어떻게 표현할 방법이 없어서 그냥 정수값을 지정해줌
영문(0~127) -> 2의 8승 -> 1byte(글자 하나를 표현하기 위해 필요한 용량)
-> 영문 기준임
전세계 언어를 모아보다보니 byte 용량이 더 커짐
한글은 글자 하나당 2byte임

RAM은 하나의 공간이 1byte부터 시작함
정수 500을 저장할 경우 2byte크기의 공간 1개를 차지하게 됨

RAM에 기억공간을 만드려면 용도와 크기와 위치가 결정되어야 함

코틀린 기본 문법

주석

  • 코틀린에서는 자바와 동일함
  • // : 한 줄 주석
  • /* */ : 여러 줄 주석
  • 코틀린 코드가 자바 코드로 변경될 때 사라지는 부분
  • 주석을 잘못 처리할 경우 사용자에게 주석 내용이 유출될 수 있음
  • IntelliJ에서 주석 단축키는 Ctrl + /

출력

  • 표준 출력 : 프로그램이 실행되는 환경에서의 출력
  • Kotlin 프로그램은 콘솔 기반 프로그램으로써 콘솔에 출력되는 것이 표준 출력이다.

세미콜론

  • 프로그래밍 언어들 중에 문장의 마지막임을 표시하기 위해 세미콜론(;)을 찍어줘야 하는 것들이 있다.
  • 대다수의 개발자들은 세미콜론을 통해 명령문을 구분하여 한 줄에 여러 개의 명령문을 작성하지 않고 한 줄에 하나의 명령문을 작성하는 경우가 일반적이다. 이에, 일부 프로그래밍 언어들은 세미콜론을 선택 사항으로 제공한다.
  • 코틀린에서도 세미콜론은 선택사항으로, 없어도 무방하다.
  • 만약 한 줄에 여러 명령문을 작성하겠다면 세미콜론으로 꼭 구분해줘야 한다.

리터럴

  • 리터럴 : 프로그래밍 언어에서 값을 저장하는 문법
  • 기억공간에 값을 저장하려면 용도,크기,위치를 결정해야 함
  • 100을 저장할 경우, 용도 : 정수, 크기 : 1byte, 위치 : OS가 위치를 정해줌

정수

Long(8), Int(4), Short(2), Byte(1)
정수 Int 값의 크기는 4byte로 -2147483648~2147483647의 범위를 가짐
자바의 경우 정수값을 작성하면 4byte 기억공간이 마련되기 때문에, 아래와 같이 범위를 벗어난 값을 작성하면 오류가 발생한다.
Long 8byte 기억공간이 만들어질 수 있도록 L을 값 뒤에 붙여줘야 한다.

println(2147483648L)
println(-2147483649L)

그런데 코틀린의 경우 L을 붙이지 않더라도 작성된 값을 보고 Java코드로 변환될 때 4byte로 충분한 경우 정수값 그대로 유지되고, 8byte 기억공간이 필요한 값이라면 뒤에 L을 붙인 코드로 변경된다
즉 코틀린은 정수값을 작성할 때 값의 범위를 보고 뒤에 L을 붙여주지 않아도 된다.

println(2147483648)
println(-2147483649)

정수값을 작성할 때 자리수 구분을 위해 언더바(_)를 사용할 수 있다.

println(123_456_789)

부호가 없는 정수형

ULong(8), UInt(4), UShort(2), UByte(1)

실수

Double(8), Float(4)
기본 8 byte이며 Float타입은 값 뒤에 F를 붙이고 4 byte지만 보통 사용하지 않음
옛날에는 메모리 관리를 위해 구분을 하려고 했지만 지금은 굳이 그럴 필요 없음

println(11.11)
println(11.11F)

문자

Char(2)
보통 2byte이나 실행되는 시스템을 따라간다.
내부적으로 정수값으로 관리된다.

println('A')
println('가')

문자열

String
작성한 글자 수 만큼 메모리를 사용한다.
객체라는 것으로 관리된다.

println("문자열")

논리(boolean) 타입

true는 참을 의미
false는 거짓을 의미

println(true)
println(false)

RawString

여러 줄의 문자열을 표현할 때 사용한다.
자바에는 없음.

println("""동해물과 백두산이
    |마르고 닳도록
    |하느님이 보우하사
    |우리나라 만세
""".trimMargin())

자료형

  • 기억장소는 리터럴 작성 문법에 맞춰서 값을 작성하면 작성한 값을 저장하기 위해 기억장소가 만들어진다.
    이때, 위치는 VM이 알아서 정해주고 용도와 크기는 작성해준 값의 문법을 보고 결정해준다.
    이러한 값들은 프로그램 실행 중에 변경될 수가 없다.
    만약 프로그램 실행 중에 어떠한 의미의 값이 변한다면 기억장소를 개발자의 의해 만들고 기억장소에 접근하여 값을 저장하고 가져다 사용할 수 있는 변수를 사용해야 한다.
    변수라는 것을 생성할 때 위치는 VM이 알아서 정해주고 용도와 크기는 개발자가 정해줘야 하는데 이를 자료형이라고 부른다.

정수형

fun main() {
    // 정수 자료형
    println("Byte 용량 : "+Byte.SIZE_BYTES)
    println("Byte 최소 값 : "+Byte.MIN_VALUE)
    println("Byte 최대 값 : "+Byte.MAX_VALUE)
    println()

    println("Short 용량 : "+Short.SIZE_BYTES)
    println("Short 최소 값 : "+Short.MIN_VALUE)
    println("Short 최대 값 : "+Short.MAX_VALUE)
    println()

    // 정수값을 작성하면 4 byte 기억공간이 만들어지고 저장되기 때문에
    // Int 를 정수의 기본 자료형으로 부른다.
    println("Int 용량 : "+Int.SIZE_BYTES)
    println("Int 최소 값 : "+Int.MIN_VALUE)
    println("Int 최대 값 : "+Int.MAX_VALUE)
    println()

    println("Long 용량 : "+Long.SIZE_BYTES)
    println("Long 최소 값 : "+Long.MIN_VALUE)
    println("Long 최대 값 : "+Long.MAX_VALUE)
    println()
    
    // 부호가 없는 정수형 (Unside)
    // 저장공간에 저장할 수 있는 값의 가지수를 절반 짤라서 양수와 음수로 나눠서 사용하는데
    // 부호가 없는 자료형을 쓰면 0부터의 범위가 된다.
    // 양수쪽으로 더 큰 범위의 숫자를 저장할 수 있다.
    println("UByte 용량 : " + UByte.SIZE_BYTES)
    println("UByte 최소 값 : " + UByte.MIN_VALUE)
    println("UByte 최대 값 : " + UByte.MAX_VALUE)
    println()
}
    Byte 용량 : 1
    Byte 최소 값 : -128
    Byte 최대 값 : 127

    Short 용량 : 2
    Short 최소 값 : -32768
    Short 최대 값 : 32767

    Int 용량 : 4
    Int 최소 값 : -2147483648
    Int 최대 값 : 2147483647

    Long 용량 : 8
    Long 최소 값 : -9223372036854775808
    Long 최대 값 : 9223372036854775807
    
    UByte 용량 : 1
	UByte 최소 값 : 0
	UByte 최대 값 : 255

부호가 없는 정수형 (Unside)

저장공간에 저장할 수 있는 값의 가지수를 절반 짤라서 양수와 음수로 나눠서 사용하는데 부호가 없는 자료형을 쓰면 0부터의 범위가 된다.
양수쪽으로 더 큰 범위의 숫자를 저장할 수 있다.

fun main() {
    println("UByte 용량 : " + UByte.SIZE_BYTES)
    println("UByte 최소 값 : " + UByte.MIN_VALUE)
    println("UByte 최대 값 : " + UByte.MAX_VALUE)
    println()

    println("UShort 용량 : " + UShort.SIZE_BYTES)
    println("UShort 최소 값 : " + UShort.MIN_VALUE)
    println("UShort 최대 값 : " + UShort.MAX_VALUE)
    println()

    println("UInt 용량 : " + UInt.SIZE_BYTES)
    println("UInt 최소 값 : " + UInt.MIN_VALUE)
    println("UInt 최대 값 : " + UInt.MAX_VALUE)
    println()

    println("ULong 용량 : " + ULong.SIZE_BYTES)
    println("ULong 최소 값 : " + ULong.MIN_VALUE)
    println("ULong 최대 값 : " + ULong.MAX_VALUE)
    println()
}
    UByte 용량 : 1
    UByte 최소 값 : 0
    UByte 최대 값 : 255

    UShort 용량 : 2
    UShort 최소 값 : 0
    UShort 최대 값 : 65535

    UInt 용량 : 4
    UInt 최소 값 : 0
    UInt 최대 값 : 4294967295

    ULong 용량 : 8
    ULong 최소 값 : 0
    ULong 최대 값 : 18446744073709551615

실수

실수 리터럴을 작성하면 8 바이트 기억공간이 만들어져서 저장된다.
이에, Double을 실수의 기본 자료형이라고 부른다.

    println("Float 용량 : " + Float.SIZE_BYTES)
    println("Float 최소 값 : " + Float.MIN_VALUE)
    println("Float 최대 값 : " + Float.MAX_VALUE)
    println()

    println("Double 용량 : " + Double.SIZE_BYTES)
    println("Double 최소 값 : " + Double.MIN_VALUE)
    println("Double 최대 값 : " + Double.MAX_VALUE)
    println()
    Float 용량 : 4
    Float 최소 값 : 1.4E-45
    Float 최대 값 : 3.4028235E38

    Double 용량 : 8
    Double 최소 값 : 4.9E-324
    Double 최대 값 : 1.7976931348623157E308

※부호가 없는 실수형은 없다

논리

Boolean
논리형은 1바이트를 사용한다.
별도의 사이즈를 반환하는 메서드가 없음

문자

    println("Char 용량 : " + Char.SIZE_BYTES)
    println("Char 최소 값 : " + Char.MIN_VALUE)
    println("Char 최대 값 : " + Char.MAX_VALUE)
    println()
    Char 용량 : 2
    Char 최소 값 : 0
    Char 최대 값 : ￿0

문자는 최소값,최대값이 없기 때문에 0으로 출력된다.

문자열

String
문자열은 정확히 말하자면 자료형이 아님
일단은 문자열 타입이라고 생각하고 진행하기

변수

  • 변수 : 프로그램 실행 중에 변화되는 값을 저장하는 기억공간
  • 변수의 용도와 크기는 개발자가 자료형을 이용해 결정한다.
  • 변수의 위치는 VM이 알아서 정해준다.
  • 변수가 생성되는 위치는 VM이 알아서 정해주기 때문에 개발자는 변수가 어디에 있는지 알 수 없다.
  • 이에, 변수의 접근을 위해 변수의 이름을 사용한다.
  • 변수의 이름은 개발자가 정해주며 개발자는 변수의 이름을 통해 변수에 접근하여 변수에 값을 저장하거나 가져다 사용할 수 있다.

변수명 지어주는 사이트

https://www.curioustore.com/

식별자

  • 변수, 함수, 클래스, 메서드 등과 같이 개발자가 정의해서 사용하는 요소들을 구분하기 위해 지어주는 이름
  • 식별자 규칙은 자바 언어와 동일하다.
  • 문법적으로 지켜야 하는 규칙(지키지 않으면 오류 발생)
    1. 길이의 제한은 없음
    2. 첫 글자는 문자, _, $ 만 가능($는 다른 곳에서 의미가 있을 수 있기 때문에 지양함)
    3. 두 번째 글자 부터는 문자, 숫자, _, $를 사용할 수 있다.
    4. 자바 언어에서 식별자를 한글로 지어주는 것이 허용되기 때문에 코틀린도 식별자는 한글로 작성해도 된다.(실제로는 한글 사용 없음)
  • 권장사항(안지켜도 문제는 없으나 암묵적인 룰)
    1. 변수의 이름은 첫 글자를 소문자로 함.
    2. 함수나 메서드의 이름은 첫 글자를 소문자로 함.
    3. 클래스의 이름은 첫 글자를 대문자로 함.
    4. 상수를 의미하는 것들은 모두 대문자로 함.

표기 기법

  1. 잘못된 표기 예
    • koreanpointaverage : 여러 단어를 조합했지만 가독성이 떨어진다.
    • korean point average : 문법 오류. 이름은 띄어쓰기를 지원하지 않는다.
  2. 파스칼 표기 기법
    • 단어와 단어 사이에 언더바(_)를 두는 표기 기법
    • korean_point_average
    • car_count
  3. 카멜 표기 기법
    • 각 단어의 첫 글자를 대문자로 작성하는 표기 기법
    • 마치 낙타의 등과 같은 모습을 하고 있다고 하여 붙여진 이름
    • koreanPointAverage
    • carCount
    • 자바에서는 카멜 표기 기법을 주로 사용한다.

변수 선언

  • Kotlin은 변수 선언 시 val, var 두 가지 키워드를 사용함
  • var : 선언 이후 값을 다시 저장할 수 있다.
  • val : 선언 이후 값을 다시 저장할 수 없다.
    // Int 타입(정수형, 4byte)의 a1이라는 이름의 변수를 선언한다.
    var a1:Int
  • 변수는 선언과 동시에 메모리에 기억장소가 만들어진다.
  • 변수 선언 시 값을 저장할 때는 자료형을 생략해도 된다.
    변수에 저장하는 값을 보고 변수의 자료형이 결정된다.
    var a3 = 400
    println("a3 : " + a3)
    println("a3 type : " + a3.javaClass.name)
    
    var a4 = 11.11
    println("a4 : " + a4)
    println("a4 type : " + a4.javaClass.name)
	a3 type : int
    a4 : 11.11
	a4 type : double
  • 변수를 선언할 때 저장할 값이 없을 경우 자료형을 생략하면 오류가 발생한다.
    var a5 // 에러 발생
  • 자료형이 결정된 변수는 자료형을 변경할 수 없다.
	var a4 = 11.11
    a4 = "안녕하세요" // 에러 발생

문자열 결합

  • 문자열 + 문자열 : 문자열을 합친 새로운 문자열이 만들어진다.
	var a20 = "안녕하세요" + "반갑습니다"
    println("a20 : " + a20)
	a20 : 안녕하세요 반갑습니다
  • 문자열 + 문자열이 아닌 것 : 문자열이 아닌 것이 문자열로 변환된 다음 문자열 합치기를 한다.
	var a21 = "나이는 : " + 20
    println("a21 : " + a21)
	a21 : 나이는 : 20
  • ${ } 를 사용하면 + 연산자를 사용할 필요가 없다.
	var a22 = "나이는 : ${20}"
    println("a22 : ${a22}")
	a22 : 나이는 : 20
  • 만약 ${ } 안에 들어가는 것이 변수 하나라면 { }는 생략 가능
    var a23 = 20
    var a24 = "나이는 $a23"
    println("a24 : $a24")
	a24 : 나이는 20
  • val 키워드를 사용하면 변수의 값을 변경할 수 없다.
    val a30 = 100
    println("a30 : $a30")
    
    a30 = 200 // 실행 시 에러
	a30 : 100



※ 출처 : 멋쟁이사자 앱스쿨 2기, 소프트캠퍼스 
profile
안드로이드공부

0개의 댓글