개발자/kotlin 코틀린

kotlin 04. 매개변수, 인수, 범위, 함수 오버로딩, 스택 예제 코드

지구빵집 2022. 8. 12. 14:59
반응형

 

 

031 매개변수(Parameter)와 인수(Argument)

 

함수는 고정된 구문으로 이루어져 있지만 함수에 값을 전달하는 방식으로 함수가 다양한 일을 할 수 있도록 한다. 함수 이름 옆의 소괄호 안에 변수를 선언하는 방식으로 값을 전달하는 데 이를 매개변수라 한다.

 

매개변수를 선언할 때는 var, val 키워드를 붙이지 않는다. 매개변수는 무조건 val 선언이므로 값을 수정할 수 없는 변수다.

 

fun main(args: Array<String>): Unit
{
	println(cToF(30))
	println(getAverage(89, 96))
}

fun cToF(celsius: Int): Double
{
	return celsius * 1.8 + 32
}

fun getAverage(a: Int, b: Int): Double
{
	return (a + b) / 2.0
}

결과

86.0
92.5

 

032 Unit 타입

함수가 값을 반환하지 않을 때 사용한다. 함수 끝에 return을 쓰지 않아도 된다. 결국 함수의 반환타입을 생략하면 자동으로 Unit이 된다. 모든 메인 함수의 반환 타입은 Unit 이므로 생략 가능하다. 

 

fun main(args: Array<String>): Unit
{
	celsiusToFah(27)
}

fun celsiusToFah(celsius: Int): Unit
{
	println(celsius * 1.8 + 32)
}

결과

80.6

 

 

033 디폴트 인수

매개 변수를 선언과 동시에 초기화 한다. 이렇게 하면 함수 호출시 해당 매개변수에 인수를 할당하지 않아도 된다. 인수가 할달되지 않은 매개변수는 디폴트 값으로 초기화된다.

 

fun main(args: Array<String>)
{
	println(getAverage(89, 96))
	getAverage(100, 50, true)
	println(getAverage(90))
	getAverage(66, print = true)
	getAverage(print = true)
	getAverage(print = true, a = 10, b = 30)
}

fun getAverage(a: Int = 0, b: Int = 0, print: Boolean = false): Double
{
	val result = (a + b) / 2.0
	if (print)
		println(result)
	return result
}

결과

92.5
75.0
45.0
33.0
0.0
20.0

 

034 가변 인수

여러개의 인수를 받을 경우 매개 변수 앞에 vararg 키워드를 붙여 여러 개의 인수를 받는다.

 

fun main(args: Array<String>)
{
	println(getSumOf(1, 2, 3, 4, 5, 6, 7))
	println(getSumOf(32, 57, 12))
	println(getSumOf())
}

fun getSumOf(vararg numbers: Int): Int
{
	val count = numbers.size
	var i = 0
	var sum = 0

	while (i < count)
	{
		sum += numbers[i]
		i += 1
	}

	return sum
}

결과

28
101
0

 

035 함수 오버로딩(Function Overloading)

 

한 줄 인쇄하는 println 도 함수다. Intellij IDEA 에디터에서 ctrl 키를 누른채로 소스코드의 println을 클릭하면 println 함수가 선언된 파일 console.kt 파일로 이동할 수 있다. @로 시작하는 부분은 어노테이션이라고 하는데 다른 부분에서 다루고, 매개 변수만 다른 같은 이름의 함수가 보인다. 이름은 같고 함수 시그니처가 다른 함수를 여러 개 선언하는 것을 함수 오버로딩이라고 한다.  println은 겅의 모든 데이터 타입에 오버로딩 되어 있다.

 

@kotlin.internal.InlineOnly
public inline fun println(message: Int) {
    System.out.println(message)
}

/** Prints the given [message] and the line separator to the standard output stream. */
@kotlin.internal.InlineOnly
public inline fun println(message: Long) {
    System.out.println(message)
}

/** Prints the given [message] and the line separator to the standard output stream. */
@kotlin.internal.InlineOnly
public inline fun println(message: Byte) {
    System.out.println(message)
}

 

036 지역 변수(Local Variable)와 전역 변수(Global Variable)

함수 밖에 선언한 변수를 전역변수, 블록 안에서 선언된 변수를 지역변수라 한다.

 

var count = 0

fun main(args: Array<String>)
{
	val a = 15
	println(a)

	count += 1
	printCount()
	println(count)
}

fun printCount()
{
	println(count)
	count += 1
}

결과

15
1
2

 

037 지역 변수와 전역 변수의 이름이 중복될 때

 

var a = 5

fun main(args: Array<String>)
{
	val a = 30
	println(a)
	func()
}

fun func()
{
	println(a)
}

결과

30
5

 

038 지역 변수와 다른 함수의 지역 변수가 중복될 때

 

fun main(args: Array<String>)
{
	val a = 52
	println(a)

	printA()
	printA2()
}

fun printA()
{
	val a = 17
	println(a)
}

fun printA2()
{
	val a = 120
	println(a)
}

결과

52
17
120

 

039 지역 함수(Local Function)

 

fun main(args: Array<String>)
{
	fun printFomular(a: Int, b: Int)
	{
		println(a * b + a - b)
	}

	printFomular(73, 1)
	printFomular(4, 6)
}

결과

145
22

 

040 메모리의 스택(Stack) 영역

 

메모리의 스택 영역에 지역 변수가 저장된다.

 

fun main(args: Array<String>)
{
	val a = -36
	val result = absolute(a)
	println(result)
}

// 입력받은 정수의 절대값을 반환하는 함수
fun absolute(number: Int): Int
{
	return if (number >= 0)
		number
	else -number
}

결과

36

 

 

 

 

 

 

 

반응형