CSE/코틀린
코틀린 기초
minkylee
2024. 4. 2. 20:22
Joyce의 안드로이드 앱 프로그래밍을 공부하며 쓴 포스팅입니다.
안드로이드와 코틀린
안드로이드
- 구글이 만든 모바일 운영체제이며 리눅스를 기반으로한다.
- 오픈소스, 누구나 코드를 볼 수 있고 접근 가능하기 때문에 개발자나 단말기를 생산하는 사람들은 기기의 호환성에 맞게 다양한 변화를 줄 수 있다.코틀린
- 자바처럼 JVM에서 동작하는 프로그래밍 언어, 비교적 최근에 만들어진 언어로서 다른 프로그래밍 언어에서 검증된 해법과 기능을 포함하고 있다.기능
- 간결함 : 기능이 다양한 표준 라이브러리를 제공해 상용구 코드를 적게 작성하면서도 아이디어를 풍부하게 표현 가능
- 더 안전한 코드 : 널 포인터 예외와 같은 일반적인 프로그래밍 실수를 방지하는 다양한 장치를 제공
- 호환성 : 자바와 100% 호환되므로 자바로 작성된 코드도 자유롭게 사용할 수 있음. 반대로 자바 환경에서도 코틀린을 아무 문제 없이 사용할 수 있다.
- 구조화된 동시 실행 : 코틀린 코루틴을 사용하면 비동기 코드를 쉽게 사용할 수 있음. 코루틴을 이용하면 네트워크 호출, 로컬 데이터 액세스에 이르는 백그라운드 작업을 효과적으로 간단히 구현하고 관리할 수 있다.
프로젝트 구조 알아보기
- app
- manifests : AndroidManifest.xml 파일만 가지고 있다. 앱과 관련된 기본적인 설정이 담겨 있음. 앱의 패키지 이름, 앱 구성요소, 권한을 정의한다. 휴대폰의 위치 정보나 전화번호부 등 민감한 정보에 접근하는 데 필요한 권한도 이 파일에서 설정
- java : 자바 파일과 코틀린 파일이 있는 폴더
- [com.example.helloworld] 패키지 안에는 MainActivity.kt가 있다. 이 파일에 메인 액티비티(메인 화면)의 동작을 정의한 코드를 작성한다. 액티비티마다 동작을 정의하는
.kt
파일을 이 패키지 밑에 둠.
- [com.example.helloworld] 패키지 안에는 MainActivity.kt가 있다. 이 파일에 메인 액티비티(메인 화면)의 동작을 정의한 코드를 작성한다. 액티비티마다 동작을 정의하는
- res : resource(자원)을 의미, 앱에서 사용하는 이미지, 레이아웃, 색상 값과 같은 자원을 모아놓는 곳
- [drawable] : 앱에서 사용할 이미지파일을 놓는다. 프로젝트를 처음 생성하면 xml 파일이 두 개 있는데 코드로 작성된 런처(앱 아이콘) 벡터 이미지
- [layout] : 액티비티나 프래그먼트와 같이 화면에 보여줄 구성요소들의 레이아웃(배치)를 XML 파일로 저장해놓는다.
- [minimap] : 런처(앱을 실행할 때 누르는 아이콘)에 등록할 이미지를 놓는다.
- [values] : 색상이나 문자열과 같은 값들을 지정해놓는다.
- Gradle Script : 빌드 시스템, 복잡한 빌드 프로세스를 자동화해준다.
코틀린 기본 문법
- 코틀린에서는 변수(variable)를
var
로 상수값을val
로 선언한다. val pi : Double = 3.14 // val 변수명 : 자료형 = 값 // 문맥상 추론이 가능하면 자료형 생략 가능 => 코틀린의 형추론 val name = "gil-dong" // 형추론(String)
- val은 상수이므로 값을 재할당하면 컴파일 오류가 난다.
val pi = 3.14 pi = 3.141592 // 오류 (val cannot be reassigned)
- 값을 변경하고 싶을 때는 var를 사용해야 한다. var로 정의된 변수의 값은 바꿀 수 없음
var age = 21 // 형추론 (Int) println(age) // 21 age = 25 // 재할당 println(age) // 25
기본 자료형
코틀린에서 자료형은 크게 기본 자료형과 참조 자료형으로 나뉜다. 각각 기본형, 참조형으로 줄여 부르기도 함. 기본형은 순수하게 값을 저장하는 자료형, 참조형은 객체를 만들고 변수에는 객체의 참조값을 저장한다.
코틀린의 자료형은 모두 참조형 -> 모든 자료형이 객체 형태이다.
숫자 (정수, 실수) 자료형
- 정수 자료형 : Byte(1 Byte), Short(2 Byte), Int(4 Byte), Long(8 Byte)
- 실수 자료형 : Double(8 Byte), Float(4 Byte)
실수의 경우 자료형을 명시하지 않으면 Double형이 된다.
val numDouble : Double = 3.2 // double
val numFloat : Float = 3.2f // float
문자 자료형
문자 하나를 표현하는 Char형과 문자열을 표현하는 String형으로 나눌 수 있다.
val char1 : Char = 'H' // 자료형 생략 가능
val string : String = "Hello world!" // 자료형 생략 가능
논리 자료형
참 거짓을 표현한다.
val isTrue : Boolean = true // 자료형 생략 가능
배열 자료형
배열을 나타내는 자료형으로는 Array가 있다. arrayOf()
라는 함수를 사용하면 배열을 만들 수 있음
val stringArray : Array<String> = arrayOf("apple", "banana", "grape")
val intArray = arrayOf(1, 2, 3)
println(stringArray[0]) // apple
println(intArray[2]) // 3
명시적 형변환
변환될 자료형을 직접 지정하는 것을 명시적 형변환이라고 한다. Int형 -> String, Int -> Double로 만드는 행위
val score = 100
val scoreString = score.toString() // String형
val scoreDouble = score.toDouble() // Double형
println(scoreDouble) // 100.0
함수
코틀린에서 함수의 기본적인 모양은 다음과 같다.
fun 함수명 (매개변수) : 반환자료형 {
// 실행할 코드 내용
}
- 나이를 출력하는 함수
fun printAge(age : Int) : Uint { println(age) }
printAge(15) // 15
- Unit : 자바의 void에 대응하며 생략할 수 있다.
- 단일 표현식 함수 : 실행할 코드가 표현식 하나로 이루어진 함수 (반환형 생략 가능)
```kotlin
fun minusNum(a: Int, b: Int) = a - b // 단일 표현식 함수
println(minusNum(1000, 200)) // 800
문자열 템플릿
변수를 포함해 문자열을 만들 때, 코틀린에서는 간단하게 $
를 변수명 앞에 덧붙이면 된다.
변수가 하나면 $
더 많다면 ${}
로 감싸준다.
val price = 3000
val tax = 300
val originalPrice = "The original price is $price"
val totalPrice = "The total price is ${price + tax}"
println(originalPrice) // The original price is 3000
println(totalPrice) // The total price is 3300
제어문
범위 클래스
특정 범위의 값들을 간편하게 표현할 수 있다. 범위 클래스로는 IntRange, LongRange, CharRange 등이 있다.
val numRange: IntRange = 1..5 // 정수 범위
println(numRange.contains(3)) // true
println(numRange.contains(10)) // false
val charRange: CharRange == 'a'..'e' // 알파벳 범위
println(charRange.contains('b')) // true
println(charRange.contains('z')) // false
for문
코틀린에서는 in연산자와 함께 쓰면 훨씬 간편하게 사용 가능하다.
for (i in 1..5) {
println(i) // 1, 2, 3, 4, 5
}
for (i in 5 downTo 1) {
println(i) // 5, 4, 3, 2, 1
}
for (i in 1..10 step 2) {
println(i) // 1, 3, 5, 7, 9
}
val student = arrayOf("jun-gi", "jun-su", "si-u", "yeon-seo", "jun-seo")
for (name in student) { // 배열의 요소 가져오기
println(name) // jun-gi, jun-su, si-u, yeon-seo, jun-seo
}
- withIndex() 함수를 이용하면 요소의 인덱스를 가져오는 것도 가능하다.
for ((index, name) in student.withIndex()) { println("Index : $index Name : $name") }
While문
do while문은 조건과 관계없이 최소 한 번은 실행되는 특징이 있다.
var num = 1
while (num < 5) {
println(num) // 1, 2, 3, 4까지 출력
num++
}
vat num = 1
do {
num++
println(num) // 2, 3, 4, 5까지 출력
} whlie (num < 5)
if문
자바와 같은 방식으로 사용하면 된다.
val examScore = 60
var isPass = false
if (examScore > 80) {
isPass = true
}
println("시험 결과 : $isPass")
val examScore = 99
if (examScore == 100) {
println("만점이네요")
} else {
println("만점은 아니에요.")
}
- 명령문(statment)은 어떤 동작을 수행하는 데 반해 표현식(expression)은 하나의 값(value)으로 평가되는 문장을 말한다. 즉, 표현식을 해석하면 결국 값 하나만 남는다. 그래서 다음과 같이 if문을 활용하여 변수에 값을 할당할 수 있음 값을 할당해야 하므로 반드시 else 문장이 필요
val myAge = 40
val isAdult = if(myAge > 30) true else false
println("성인 여부 : $isAdult")
when문
코틀린에는 switch
문이 없다. 대신 when문
val weather = 15
when (weather) {
-20 -> {println("매우 추운 날씨")}
11, 12, 13, 14 -> {println("쌀쌀한 날씨")}
in 15..26 -> {println("활동하기 좋은 날씨")}
// 범위 안에 안 들어가는 경우
!in -30..50 -> {println("잘못된 값입니다. -30 ~ 50 가운데 값을 적어주세요.")}
else -> {println("잘 모르겠는 값")} // 위 경우가 모두 아닐 때
- when문도 값을 반환하는 표현식으로 사용 가능. 값을 무조건 할당해야 하므로 else문이 필수로 들어가야 한다.
val essayScore = 95
val grade = when(essayScore) {
in 0..40 -> "D"
in 41..70 -> "C"
in 71..90 -> "B"
else -> "A"
}
println("에세이 학점 : $grade")