CODING/강의노트-부스트코스-코틀린

[부스트코스]📱코틀린 3-2 함수를 활용한 예제 만들기

codingTrip 2021. 2. 16. 18:11

안녕하세요? codingTrip입니다.

오늘은 "코틀린 프로그래밍  1/2(함수편)"

2단원 함수형 프로그래밍이란?

3장. 마법의 요술상자, 함수의 기본

3-2 함수를 활용한 예제 만들기

시작하겠습니다!

 

💻 실습하기

지금까지 배운 함수를 이용해서 간단한 예제를 만들어볼까요?

예제는 다음과 같습니다. ([출처] 부스트코스 코틀린 강의)

 

목표: 하나 이상의 실수를 받아서 모든 실수의 합의 평균을 구하고 출력 하려고 합니다.

다음 조건을 만족하는 함수를 구현해 보세요!

 

  • 초기값을 위한 인자는 Float형
  • 초기값은 두번째 부터 나열된 인자의 최종 평균 결과에 더함
  • 초기값에 아무런 인자를 입력하지 않으면 0을 기본 사용
  • 두번째부터 받아들일 인자는 가변형 인자로 모두 실수형 Float
  • 반환값은 모든 인자의 평균값으로 마찬가지로 실수형 Double
fun avgFunc(initial: ____(1)______, _____(2)_____ numbers: Float): Double {
    var result = 0f
    for (num in numbers) {
        ________(3)_________
    }
    println("result: $result, numbers.size: ${numbers.size}")
    val avg = __________(4)____________
    return ________(5)_________
}

fun main() {
    val result = avgFunc(5f, 100f, 90f, 80f)  // 첫번째 인자: 초기값, 이후 인자는 가변인자
    println("avg result: $result")
}

 

그럼 하나씩 차근차근 빈칸을 채우면서 풀어볼까요?

빈칸 괄호 (1) 번호 순서대로 풀어볼게요.

주의! 이 글은 정답이 아닌 제가 나름대로 푼 것을 바탕으로 쓴 글입니다.

참고만 해주시면 감사하겠습니다.

여러분들은 어떤 답을 생각하셨는지 궁금하네요.


(1) 빈 칸을 풀어볼까요?

initial : __________, 이네요. 

initial의 뜻은 처음의, 초기의 라는 뜻이에요.

 

그럼 지난 시간에 배운 것을 되새겨볼게요.

fun sum(a:Int,b:Int = 5): Int {
    return a+b
}

인자를 설정할 때 a: Int처럼

변수 이름 콜론 다음에 자료형을 지정하는 것 기억나시나요?

 

또한 b: Int=5처럼

함수 매개변수에 특정값을 미리 지정해놓는 기본값(default)을 넣을 수 있다는 것도 기억나시나요?

등호를 사용해서 특정값을 넣을 수 있습니다.

따라서 여기 매개변수에 직접 값을 넣지 않으면

자동으로 5라는 값이 기본값으로 만들어집니다.

 

위에 써있던 조건을 확인해볼까요?

- 초기값을 위한 인자는 Float형

- 초기값에 아무런 인자를 입력하지 않으면 0을 기본 사용이라고 써있네요.

그러니까 initial이라는 변수의 자료형을 Float형으로 설정하고,

기본값을 0으로 하면 되겠네요. 물론 Float형이니까 0f로 하면 좋겠어요.

=> initial : Float=0f

 


(2) 하나 이상의 실수를 받아서 모든 실수의 합의 평균을 구하고 출력함

두번째부터 받아들일 인자는 가변형 인자로 모두 실수형 Float

 

일단, 하나 이상의 실수를 받아야 하니까

인자를 우리가 마음대로 1, 2개 개수를 정해서 설정하면 안되겠네요?

 

여러분도 눈치채셨겠지만 이 부분은 

가변형 인자라는 개념을 사용해야 한답니다.

자세한 내용은 

codingtrip.tistory.com/20

 

[부스트코스]📱코틀린 3-1 함수를 선언하고 호출해 보기 (2)

안녕하세요? codingTrip입니다. 오늘은 "코틀린 프로그래밍  1/2(함수편)" 2단원 함수형 프로그래밍이란? 3장. 마법의 요술상자, 함수의 기본 3-1 함수를 선언하고 호출해보기 (2) 시작하겠습니다!

codingtrip.tistory.com

가변형 인자 설명 부분을 참고해주세요.

vararg로 들어온 인자는 하나가 아니라 하나 이상을 받아들일 수 있게 됩니다.

즉, 우리가 원하는 만큼 넣을 수 있답니다.

=> vararg numbers: Float

 


(3)

result라는 변수에 for문을 사용해서

가변형 인자인 numbers의 값을 다 더해야 하네요.

 

for( num in numbers )

아직 배운 적이 없는 것 같아요. 그래서 아래의 글을 첨부합니다.

읽어도 이해가 안가신다면 나중에 배울테니 

너무 부담가지지 마시고 패스!

num이라는 변수 in 뒤에 컬렉션 타입의 객체를 지정했습니다.
컬렉션 타입의 객체에 포함된 데이터의 개수만큼 for 문을 반복하며, 
한 번 반복할 때마다 컬렉션 타입의 객체에 담긴 데이터를 순서대로 하나씩 추출하여 in 앞의 변수에 대입합니다.

출처:https://kkangsnote.tistory.com/65

 

사실 빈칸은 지금부터를 알면 풀 수 있죠.

num 값을 다 result에 더하려면 어떻게 해야 할까요?

 

대입 연산자 += 가 기억나시나요?

result = result+num을 

result += num 이렇게 간략하게 표현가능하답니다.

codingtrip.tistory.com/17

 

[부스트코스]📱코틀린 2-4 연산자를 조합해 다양한 식 만들기 (1) 기본연산자

안녕하세요? codingTrip입니다. 오늘은 "코틀린 프로그래밍  1/2(함수편)" 1단원 코틀린의 기본을 익혀요! 2장. 변수와 자료형, 연산자 2-4 연산자를 조합해 다양한 식 만들기 (1) 기본연산자 시작하

codingtrip.tistory.com

=> result += num


(4) 

이제 result 변수에 numbers 값을 모두 더했으니

평균을 구해볼까요? 평균 average를 줄여서 avg로 변수명을 설정했나봐요.

평균은 총 합계 나누기 총 개수 이죠?

 

예를 들어 80, 90, 100의 평균을 구하려면

(80+90+100)/3 이렇게 해야 하는 것처럼요.

그래서 총 합계인 result에 numbers의 값 개수를 나누면 된답니다.

numbers의 값 개수는 numbers.size로 구할 수 있다네요.

=> val avg = result / numbers.size


(5)

- 초기값두번째 부터 나열된 인자의 최종 평균 결과 더함
- 반환값은 모든 인자의 평균값으로 마찬가지로 실수형 Double

즉 초기값인 initial은 평균값인 avg와 더해야하고,

이들의 자료형이 Float이므로 Double로 변환해야 합니다.

Double로 변환하는 변환 메서드 toDouble()을 사용합니다.

codingtrip.tistory.com/16

 

[부스트코스]📱코틀린 2-3 검사와 자료형을 변환해보기

안녕하세요? codingTrip입니다. 오늘은 "코틀린 프로그래밍  1/2(함수편)" 1단원 코틀린의 기본을 익혀요! 2장. 변수와 자료형, 연산자 2-3 검사와 자료형을 변환해보기 시작하겠습니다! 🧪 자료형

codingtrip.tistory.com

=> return (avg+initial).toDouble()

 

전체적인 코드는 아래와 같습니다.

물론 이것은 공식적인 정답은 아니니, 참고만 해주세요.

 

package chap03.section01

/*목표: 하나 이상의 실수를 받아서 모든 실수의 합의 평균을 구하고 출력 하려고 합니다.
다음 조건을 만족하는 함수를 구현해 보세요!
초기값을 위한 인자는 Float형
초기값은 두번째 부터 나열된 인자의 최종 평균 결과에 더함
초기값에 아무런 인자를 입력하지 않으면 0을 기본 사용
두번째부터 받아들일 인자는 가변형 인자로 모두 실수형 Float
반환값은 모든 인자의 평균값으로 마찬가지로 실수형 Double*/

fun avgFunc(initial: Float=0f, vararg numbers: Float): Double {
    var result = 0f
    for (num in numbers) {
        result += num
    }
    println("result: $result, numbers.size: ${numbers.size}")
    val avg = result/numbers.size
            return (avg+initial).toDouble()
}

fun main() {
    val result = avgFunc(5f, 100f, 90f, 80f)  // 첫번째 인자: 초기값, 이후 인자는 가변인자
    println("avg result: $result")
}

 

 

 

 

오늘은 강의가 아니라 실습을 통해

지난 시간을 복습해보는 시간이었는데요.

어떠셨나요? 쉬우셨나요? 어려우셨나요?

저는 처음에는 헉! 하면서 놀랐지만

차근차근 빈칸을 채워넣으니 

복습도 되는 좋은 시간이 되었어요.

 

아쉬운 점은

선생님의 답안을 공개해주셨으면 좋았을 것 같아요.

정답부터 보는 사람들이 걱정되신다면

숨기기 기능을 해서 해당 버튼을 클릭해야만 

정답을 볼 수 있도록 하면 어떨까요?

 

그럼 다음 시간에 만나요!

 

부스트코스 서포터즈 3기 codingTrip