[Android/Flutter 교육] 3일차

MSU·2023년 12월 28일

Android-Flutter

목록 보기
3/85
post-thumbnail

몇년 개발을 편하게 하고 십수년 유지보수를 힘들게 할지?
몇년 개발을 힘들게 하고 십수년 유지보수를 편하게 할지?

개발의 용이성
반복되는 코드를 줄임으로써 수정을 용이하게하고 전체 작업량을 줄임

함수

  • 코드를 미리 작성해 놓고 필요할 때 불러다 쓰는 개념
  • Java에서는 클래스에 메서드를 만들어 사용하지만 Kotlin은 C언어처럼 함수라는 개념을 제공하고 있다.
  • 반복되는 내용이 있을 때 그걸 코드로 일일이 작성하기 보다는 함수 호출을 활용하는게 좋음
  • 구구단 기능
    • 입력 기능
    • 계산 기능
    • 출력 기능
  • 맨 처음 작성하는 main()도 함수임
  • 기능을 정리하여 함수로 만들어놓고 main() 함수에 해당 함수를 호출하기만 하면 됨

함수의 사용

  1. 프로그램에서 자주 사용하는 코드가 있다면 함수로 만들어서 사용한다.
  2. 프로그램을 구성하는 다양한 기능들을 각각 함수로 만들어서 관리한다.

함수 문법

fun 함수이름() {
	관리할 코드들
}

함수의 매개변수

  • 함수 내부의 코드가 수행되기 위해 필요한 데이터 중에 함수를 호출하는 쪽에서 데이터를 가지고 있다면, 함수를 호출할 때 전달할 수 있고 전달된 값은 함수의 매개변수에 담기게 된다.
fun test2(a1:Int, a2:Double) {
    println("test2 함수 호출")
    println("a1 : $a1")
    println("a2 : $a2")
}


// 매개변수를 가지고 있는 함수 호출
test2(100,11.11)
test2(200,22.22)

var k1 = 100
var k2 = 22.22

test2(k1, k2)
test2 함수 호출
a1 : 100
a2 : 11.11
test2 함수 호출
a1 : 200
a2 : 22.22
test2 함수 호출
a1 : 100
a2 : 22.22
  • 함수에 값을 리터럴로 직접 넘길때 인텔리제이에서는 해당 값이 어떤 매개변수에 담기게 되는지 아래 이미지와 같이 자동으로 표시해준다.(해당 표시 부분은 직접 타이핑하는게 아니다!)

  • 함수를 호출할 때 전달하는 값을 어떤 매개변수에 저장할지 정할 수 있다.(자바는 안되고 코틀린에서는 가능함)

test2(a2=33.33, a1=300)
test2 함수 호출
a1 : 300
a2 : 33.33
  • 전달하는 값과 매개변수의 타입이 맞지 않는 경우 전달하는 값과 매개변수의 타입이 일치하지 않으면 오류가 발생한다.
test2(44.44, 44.44) // 에러 발생
  • 전달하는 값의 개수와 매개변수의 값이 다를 경우 오류가 발생한다.
    아래의 코드는 함수가 가지고 있는 매개변수의 개수보다 더 적은 값을 전달했기 때문이 아니라 매개변수에 저장될 값이 모두 결정되지 않았기 때문에 오류가 발생한다.
test2(500) // 에러 발생
test2(600, 66.66, true) // 에러 발생

** 코틀린에서는 매개변수의 개수에 맞지 않는 값을 전달하더라도 다른 방법으로 값을 전달하는 방법이 있다고 한다.(기존의 C나 Java와 같은 언어에는 없는 방법) ↓ 아래에서 설명

기본값을 가지고 있는 매개변수

  • 매개변수에 기본값이 설정되어 있는 경우 매개변수에 저장될 값이 전달되지 않으면 기본값이 저장된다.
  • 만약 기본값이 설정되어 있지 않는 매개변수가 있다면 함수 호출시 무조건 값을 전달해줘야 한다
fun test3(a1:Int, a2:Double=11.11, a3:String="기본문자열"){
    println("test3 함수 호출")
    println("a1 : $a1")
    println("a2 : $a2")
    println("a3 : $a3")
}

// a2와 a3에는 기본값이 설정되어 있지만 함수 호출 시 값을 전달하고 있기 때문에 
// 기본값은 무시되고 전달해주는 값이 저장된다.
test3(200, 22.22, "새로운 문자열")

// a2에 저장된 값을 전달하지 않았으므로 기본값이 a2와 a3에 저장된다.
test3(300)
test3 함수 호출
a1 : 200
a2 : 22.22
a3 : 새로운 문자열
test3 함수 호출
a1 : 300
a2 : 11.11
a3 : 기본문자열
  • 만약 기본값을 저장하고 싶은 매개변수가 중간에 있다면 꼭 매개변수를 지정해줘야한다.
test3(400, a3="새로운 문자열3")
test3 함수 호출
a1 : 400
a2 : 11.11
a3 : 새로운 문자열3

함수의 return

  • return은 함수 내부에 코드가 더 있다고 하더라도 함수의 수행을 끝내고 함수를 호출한 쪽으로 돌아가라는 명령어
  • 개발자가 만든 코드가 비정상적으로 동작할 상황이라면 코드가 동작되지 않도록 하기 위해 return을 사용
fun test4(){
    println("test4 함수 호출")
    return
    println("이 부분이 수행 될까요???")
}

test4()
test4 함수 호출
  • return을 만나게 되면 함수의 수행이 종료되며, 이 때 함수를 호출한 쪽으로 값을 전달할 수 있다.
    이렇게 전달되는 값을 반환값이라고 부르며, 반환값이 있을 경우에는 반환값의 타입을 명시해줘야 한다.
// fun 함수명(매개변수들):반환타입
fun test5(a1:Int, a2:Int):Int{
    var r1 = a1 + a2
    // 함수의 수행을 종료하고 값을 반환한다.
    return r1
}

// 반환값을 전달하는 함수를 호출한다.
// 함수가 전달하는 반환값은 바로 변수에 저장해주면 된다.
var r100 = test5(100, 200)
println("r100 : $r100")
r100 : 300

함수의 overloading

  • 매개변수의 형태(타입이나 개수)를 다르게하여 같은 이름의 함수를 다수 만들 수 있는 개념
  • 함수 내부의 코드가 같은 작업을 수행하지만 매개변수의 타입이 다르기 때문에 함수를 여러개 만들어야 하는 경우 이 개념을 사용하면 개발자는 함수의 이름 하나만 알면 되기 때문에 편하게 작업할 수 있다.
fun add(a1:Int, a2:Int) : Int{
    var r1 = a1 + a2
    return r1
}
fun add(a1:Double, a2:Double): Double{
    var r1 = a1 + a2
    return r1
}


// 정수값을 받는 함수 호출
var r200 = add(100,200)
println("r200 : $r200")

// 실수값을 받는 함수 호출
var r300 = add(11.11,22.22)
println("r300 : $r300")
r200 : 300
r300 : 33.33

연산자

  • 의미를 가지고 있는 특수 문자들을 지칭한다.
  • 하나 이상의 값을 가지고 특정 연산을 수행하기 위해 사용하는 키워드
  • 달러($)기호와 언더바(_)와 같은 일부 기호를 제외하고 대부분의 특수기호가 연산자임

최우선 연산자

  • . : 객체에 접근할 때
  • [ ] : 배열에 접근할 때
  • ( ) : 수학과 같이 가장 먼저 계산할 부분이 있다면 ( )로 묶어 준다.
var a1:Int = 10 + 2 * 4
var a2:Int = (10 + 2) * 4
println("a1 : $a1")
println("a2 : $a2")
a1 : 18
a2 : 48

단항 연산자

  • 연산에 참여하는 값이 하나인 연산자
  • ! : true를 false로, false를 true로 바꿔준다. 조건식의 결과를 반대로 부정하고 싶을 때 사용한다.
var a3 = true
var a4 = !a3
var a5 = !a4
println("a4 : $a4")
println("a5 : $a5")
a4 : false
a5 : true

부호 연산자

  • + : 그대로
  • - : 양수를 음수로, 음수를 양수로
var a6 = 100
var a7 = +a6
var a8 = -a6
println("a7 : $a7")
println("a8 : $a8")
a7 : 100
a8 : -100

증감 연산자

  • 변수가 가지고 있는 값을 1 증가하거나 1 감소한다.
var a9 = 100
a9++
println("a9 : $a9")

var a10 = 100
a10 = a10 + 1
println("a10 : $a10")

++a9
println("a9 : $a9")

a9--
println("a9 : $a9")

--a9
println("a9 : $a9")
a9 : 101
a10 : 101
a9 : 102
a9 : 101
a9 : 100
  • 변수 앞에 있는 것과 뒤에 있는 것이 조금 다르다.
var a11 = 10
var a12 = 10

// 증감연산자가 앞에 있는 경우
// 최우선 연산자를 제외한 모든 연산자보다 먼저 수행됨
var a13 = ++a11
var a14 = --a12
println("a11 : ${a11}, a13 : $a13") // 변수 뒤에 문자열이 이어지는 경우에는 {} 중괄호를 써줘야 함
println("a12 : ${a12}, a14 : $a14")

// 증감연산자가 뒤에 있는 경우
// 모든 연산자들 보다 가장 마지막에 수행된다.
a11 = 10
a12 = 10

a13 = a11++
a14 = a12--
println("a11 : ${a11}, a13 : $a13") // 변수 뒤에 문자열이 이어지는 경우에는 {} 중괄호를 써줘야 함
println("a12 : ${a12}, a14 : $a14")
a11 : 11, a13 : 11
a12 : 9, a14 : 9

a11 : 11, a13 : 10
a12 : 9, a14 : 10

산술 연산자

  • 곱하기, 나누기, 나머지 연산자가 더하기, 빼기 보다 먼저 수행된다.
// 더하기
var b1 = 10 + 3
// 빼기
var b2 = 10 - 3
// 곱하기
var b3 = 10 * 3
// 나누기
var b4 = 10 / 3
// 나머지
var b5 = 10 % 3

println("b1 : $b1")
println("b2 : $b2")
println("b3 : $b3")
println("b4 : $b4")
println("b5 : $b5")
b1 : 13
b2 : 7
b3 : 30
b4 : 3
b5 : 1

관계 연산자

  • 두 값의 관계를 보고 true나 false를 결과로 준다.
// 좌측의 값이 우측의 값보다 작은가
var b6 = 10 < 3
var b7 = 10 < 20
println("b6 : $b6")
println("b7 : $b7")

// 좌측의 값이 우측의 값보다 작거나 같은가
b6 = 10 <= 3
b7 = 10 <= 20
var b8 = 10 <= 10
println("b6 : $b6")
println("b7 : $b7")
println("b8 : $b8")

// 좌측의 값이 우측의 값보다 큰가
b6 = 10 > 3
b7 = 10 > 20
println("b6 : $b6")
println("b7 : $b7")

// 좌측의 값이 우측의 값보다 크거나 같은가
b6 = 10 >= 3
b7 = 10 >= 20
b8 = 10 >= 10
println("b6 : $b6")
println("b7 : $b7")
println("b8 : $b8")

// 좌측의 값과 우측의 값이 같은가
b6 = 10 == 20
b7 = 10 == 10
println("b6 : $b6")
println("b7 : $b7")

// 좌측의 값과 우측의 값이 다른가
b6 = 10 != 20
b7 = 10 != 10
println("b6 : $b6")
println("b7 : $b7")
b6 : false
b7 : true

b6 : false
b7 : true
b8 : true

b6 : true
b7 : false

b6 : true
b7 : false
b8 : true

b6 : false
b7 : true

b6 : true
b7 : false

논리 연산자

  • 좌측과 우측의 값이 true와 flase인 수식에서 연산을 하는 연산자
  • 논리 연산자 좌측과 우측에는 관계 연산자를 사용하는 연산식이 들어가는 것이 일반적이다.
// && : 좌우의 수식의 결과가 모두 true인 경우는 결과가 true이고 하나라도 false라면 결과는 false가 된다.
// 주어진 모든 조건에 만족하는 경우인지 확인할 때 사용한다.
var c1 = 10 > 2 && 10 < 20
var c2 = 10 < 2 && 10 < 20
var c3 = 10 > 2 && 10 > 20
var c4 = 10 < 2 && 10 > 20

println("c1 : $c1")
println("c2 : $c2")
println("c3 : $c3")
println("c4 : $c4")
c1 : true
c2 : false
c3 : false
c4 : false
// ||(or) : 좌우의 수식의 결과가 모두 false 경우는 결과가 false이고 하나라도 true라면 결과는 true가 된다.
// 주어진 조건들 중에 하나라도 만족하는지 확인할 때 사용한다.
c1 = 10 > 2 || 10 < 20
c2 = 10 < 2 || 10 < 20
c3 = 10 > 2 || 10 > 20
c4 = 10 < 2 || 10 > 20

println("c1 : $c1")
println("c2 : $c2")
println("c3 : $c3")
println("c4 : $c4")
c1 : true
c2 : true
c3 : true
c4 : false

배정 대입 연산자

  • ++, --(증감연산자)는 변수의 값을 1 증가하거나 1 감소하는 역할을 수행하는데 만약 증가 감소가 아닌 다른 연산을 하거나 1이 아닌 연산에 참여할 값을 직접 지정하고자 한다면 배정 대입 연산자를 사용한다.
  • 산술 연산자와 같이 사용하는 경우가 많다.
var d1 = 10
var d2 = 10

d1 = d1 + 10
d2 += 10
println("d1 : $d1")
println("d2 : $d2")
d1 : 20
d2 : 20

제어문

If문

  • 주어진 조건에 따라 작성된 코드 수행 여부를 결정하는 구문
if(조건식) {
    코드
}

val a1 = 10

// 조건식의 결과가 true이므로 if문이 관리하는 코드가 수행된다.
if(a1 == 10){
    println("a1은 10입니다")
}
// 조건식의 결과가 false이므로 if문이 관리하는 코드가 수행되지 않는다.
if(a1 == 20){
    println("a1은 20입니다")
}
a1은 10입니다
// 조건식의 결과가 true이므로 if문이 관리하는 코드가 수행되고
// else가 관리하는 코드는 수행되지 않는다.
if(a1 == 10){
    println("a1은 10입니다")
} else {
    println("a1은 10이 아닙니다")
}

// 조건식의 결과가 false이므로 if문이 관리하는 코드가 수행되지 않고
// else가 관리하는 코드가 수행된다.
if(a1 == 20){
    println("a1은 20입니다")
} else {
    println("a1은 20이 아닙니다")
}
a1은 10입니다
a1은 20이 아닙니다
// 위에서 부터 아래 방향으로 조건식들을 수행하다가 true 인 부분을 만나면 그 부분을 수행하고 밖으로 나간다.
// 만약 모든 조건 수식의 결과가 false 일 경우 else 가 있으면 else 부분을 수행하고
// else 부분이 없으면 아무것도 수행하지 않는다.
if(a1 == 0){
    println("a1은 0입니다")
} else if(a1 == 10){
    println("a1은 10입니다")
} else if(a1 == 20){
    println("a1은 20입니다")
} else {
    println("a1은 0, 10, 20이 아닙니다")
}
a1은 10입니다

IF문을 활용한 변수 값 대입

// 조건식의 결과에 따라 변수에 값을 저장한다.
var a4 = ""
var a5 = 10

if(a5 == 10){
    a4 = "10 입니다"
}else{
    a4 = "10이 아닙니다"
}
println("a4 : $a4")
a4 : 10 입니다
  • 위의 코드는 아래와 같이 작성할 수 있다
// if문에 있는 조건식이 true면 첫 번째 값이 반환되어 변수에 저장되고
// false라면 두 번째 값이 반환되어 변수에 저장된다.
var a6 = if(a5 == 10) "10 입니다" else "10이 아닙니다"
println("a6 : $a6")
a6 : 10 입니다
// if 문이 관리하는 코드가 다수의 줄로 구성되어 있다면..
var a7 = ""

if(a5 == 10){
    var r1 = 10 + 20
    a7 = "r1은 $r1 입니다"
} else {
    var r1 = 100 + 200
    a7 = "r1은 $r1 입니다"
}
println("a7 : $a7")
a7 : r1은 30 입니다
  • 위의 코드는 아래와 같이 작성할 수 있다
// 조건식의 결과가 true라면 if문이 관리하는 코드 중 제일 마지막에 작성한 값이 변수에 저장되고
// false라면 else가 관리하는 코드 중 제일 마지막에 작성한 값이 저장된다.
var a9 = if(a5==10){
    var r1 = 10 + 20
    "r1은 $r1 입니다"
} else {
    var r1 = 100 + 200
    "r1은 $r1 입니다"
}
println("a9 : $a9")
a9 : r1은 30 입니다

when 문

  • when은 Java에서의 switch case문과 비슷하다.
  • 주어진 변수의 수식의 값에 맞는 부분이 수행된다.
val a1 = 10

// 변수 a1의 값에 맞는 부분이 수행된다.
when(a1){
	// 수행될 코드가 한 줄 이라면 { }로 묶지 않아도 된다
    1 -> println("a1은 1입니다")
    5 -> println("a1은 5입니다")
    // 수행될 코드가 여러 줄이라면 { }로 묶어 준다.
    10 -> {
        println("a1은 10입니다")
        println("코드가 두 줄")
        println("코드가 세 줄")
    }
    else -> println("a1은 1, 5, 10이 아닙니다")
}
a1은 10입니다
코드가 두 줄
코드가 세 줄
  • 두 가지 이상의 조건을 만족하는 것도 설정 가능하다.
val a2 = 3
when (a2){
    1, 2 -> println("a2는 1이거나 2입니다")
    3, 4 -> println("a2는 3이거나 4입니다")
    5, 6, 7 -> println("a2는 5이거나 6이거나 7입니다")
    else -> println("a2는 1, 2, 3, 4, 5, 6, 7이 아닙니다")
}
a2는 3이거나 4입니다
  • 실수도 가능하다
var a3 = 55.55
when(a3){
    33.33 -> println("a3은 33.33입니다")
    55.55 -> println("a3은 55.55입니다")
    77.77 -> println("a3은 77.77입니다")
    else -> println("a3은 33.33, 55.55, 77.77이 아닙니다")
}
a3은 55.55입니다
  • 문자열
var a4 = "문자열2"
when(a4){
    "문자열1" -> println("첫 번째 문자열 입니다")
    "문자열2" -> println("두 번째 문자열 입니다")
    "문자열3" -> println("세 번째 문자열 입니다")
    else -> println("else 문자열 입니다")
}
두 번째 문자열 입니다
  • 논리값
// 논리값을 사용할 경우 true, false 모두 처리해줘야 한다.
var a5 = true
when(a5){
    true -> println("a5는 true 입니다")
    false -> println("a5는 false 입니다")
}
a5는 true 입니다
  • 범위 지정
val a6 = 5
when(a6){
    in 1..3 -> println("a6는 1부터 3사이 입니다")
    in 4..6 -> println("a6는 4부터 6사이 입니다")
    else -> println("a6는 1부터 6사이의 숫자가 아닙니다")
}
a6는 4부터 6사이 입니다
  • 범위 관련 예제
// 1 ~ 10
if(a6 in 1..10){
    println("a6은 1이상 10 이하입니다")
}
// 1 ~ 10 - 1
if(a6 in 1 until 10){
    println("a6은 1이상 10 미만입니다")
}
a6은 1이상 10 이하입니다
a6은 1이상 10 미만입니다

조건에 따라 값을 반환하는 함수

fun setValue1(a1:Int) : String{
    if(a1 == 1){
        return "문자열1"
    } else if(a1 == 2){
        return "문자열2"
    } else {
        return "그 외의 문자열"
    }
}

// 조건에 따라 값을 반환하는 함수를 사용하여 변수에 값을 저장
var a7 = setValue1(1)
var a8 = setValue1(2)
var a9 = setValue1(3)
println("a7 : $a7")
println("a8 : $a8")
println("a9 : $a9")
a7 : 문자열1
a8 : 문자열2
a9 : 그 외의 문자열
  • 위의 함수의 코드를 when으로 바꿔 쓸 수 있다.
fun setValue2(a1:Int) = when(a1){
    1 -> "문자열1"
    2 -> "문자열2"
    else -> "그 외의 문자열"
}

var a10 = setValue2(1)
var a11 = setValue2(2)
var a12 = setValue2(3)
println("a10 : $a10")
println("a11 : $a11")
println("a12 : $a12")
a10 : 문자열1
a11 : 문자열2
a12 : 그 외의 문자열



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

0개의 댓글