개발자/kotlin 코틀린

kotlin 05. 파일분리, 패키지, import, object, heap, class

지구빵집 2022. 8. 15. 08:02
반응형

 

 

041 소스 파일 여러 개로 분리하기

 

// a와 b 중 더 큰 수를 반환하는 함수
fun max(a: Int, b: Int): Int =
		if (a > b) a else b

// a와 b 중 더 작은 수를 반환하는 함수
fun min(a: Int, b: Int): Int =
		if (a < b) a else b

// num의 절대값을 반환하는 함수
fun abs(num: Int): Int =
		if (num >= 0) num else -num

 

042 패키지(Package)

 

코틀린 프로젝트에는 모듈이 있고 모듈은 다시 패키지로 구성되어 있습니다. 그리고 패키지는 파일(클래스)로 구성되어 있습니다. 

코틀린 파일은 .kt 확장자를 가지며 맨 위에는 이 파일이 어떤 패키지에 포함된 것인지 코틀린 컴파일러가 알 수 있도록 패키지 이름을 선언해야 합니다. 만약 패키지 이름을 선언하지 않으면 그 파일은 자동으로 default 패키지에 포함됩니다. 파일이 패키지 안에 들어있어도 패키지 이름을 선언하지 않으면 default 패키지에 포함된 것으로 인식합니다.  

 

package ex_package

// a와 b 중 더 큰 수를 반환하는 함수
fun max(a: Int, b: Int): Int =
		if (a > b) a else b

// a와 b 중 더 작은 수를 반환하는 함수
fun min(a: Int, b: Int): Int =
		if (a < b) a else b

// num의 절대값을 반환하는 함수
fun abs(num: Int): Int =
		if (num >= 0) num else -num


fun main(args: Array<String>)
{
	val a = 20
	val b = -30

	println(max(a, abs(b)))
}

결과

30

 

043 다른 패키지의 함수 호출하기

 

기본 임포트외에 다른 패키지의 클래스나 함수를 사용하기 위해서는 import를 하거나 전체이름을 입력하여야 합니다.

 

package ex_func_in_another_package

import ex_package.min

fun main(args: Array<String>)
{
	println(min(30, 10))
}

결과 

10

 

044 import

 

import 키워드는 클래스만 임포트하는 것이 아니라 다른 선언도 import할 수 있습니다.

- 최상위 레벨(top-level) 함수와 속성

- 객체(object) 선언 내에 선언된 함수와 속성

- enum 상수자바와 다르게 코틀린은 별도의 정적 임포트("import static") 구문을 가지고 있지 않습니다. 이러한 모든 선언들은 정규 import 키워드를 사용하여 임포트 됩니다. 

 

import ex_package.max
import ex_package.min as ex_min

fun main(args: Array<String>)
{
	println(max(55, 47))
	println(ex_min(3, 10))
}

 

 

PART 2 초급// 코틀린 중급 문법 살펴보기

 

045 객체(Object)

 

fun main(args: Array<String>)
{
	val person = object
	{
		val name: String = "홍길동"
		val age: Int = 36
	}

	println(person.name)
	println(person.age)
}

결과

홍길동
36

 

046 메모리의 힙(Heap) 영역

 

fun main(args: Array<String>)
{
	val person = object
	{
		val name: String = "홍길동"
		val age: Int = 36
	}

	println(person.name)
	println(person.age)
}

결과

홍길동
36

 

047 클래스(Class)

 

class Person
{
	var name: String = ""
	var age: Int = 0
}

fun main(args: Array<String>)
{
	val person: Person
	person = Person()
	person.name = "홍길동"
	person.age = 36

	val person2 = Person()
	person.name = "김미영"
	person.age = 29

	val person3 = Person()
	person.name = "John"
	person.age = 52
}

 

048 힙 영역의 존재 이유

 

class Product
{
	var name = ""
	var price = 0
}

fun main(args: Array<String>)
{
	val product: Product; product = createProduct()
	printProductInfo(product)
	processProduct(product)
	printProductInfo(product)
}

fun createProduct(): Product
{
	val apple = Product()
	apple.name = "Apple"
	apple.price = 1000

	return apple
}

fun processProduct(product: Product)
{
	product.price += 500
}

fun printProductInfo(product: Product)
{
	println("이름: ${product.name}")
	println("가격: ${product.price}")
}

결과

이름: Apple
가격: 1000
이름: Apple
가격: 1500

 

049 문자열간 + 연산 시 주의점

 

String 타입의 변수는 스택영역에 저장되지 않는다. 실제 문자열은 힙 영역에 생성된다.

 

fun main(args: Array<String>)
{
	var first = "Hello "
	var second = "World"
	first += second
}

 

050 가비지 컬렉션(Garbage Collection) 

 

연결이 끊긴, 즉 참조 변수 카운터가 0인 미아 객체들이 많이 생기게 된다. kotlinlang.org 에서는 가비지 컬렉션이 참조 회수 카운팅 방식을 취하고 있다. 다른 객체가 보유한 객체에 대한 강한 참조 수를 추적하는 것을 기반으로 한다. 객체 참조 카운터가 0이면 메모리에서 삭제 된다는 말이다.

 

fun main(args: Array<String>)
{
	var result = ""
	var i = 1

	while (i <= 100)
	{
		result += "$i "
		i += 1
	}

	println(result)

}

결과

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

 

 

 

 

반응형