반응형

프로그래밍 언어/코틀린 28

Deep Copy(깊은 복사)와 Shallow Copy(얕은 복사)

이번 글에서는 Deep Copy와 Shallow Copy에 대해서 알아보도록 하자. 데이터 우리가 프로그래밍 중 사용하는 데이터는 크게 두 가지 타입으로 분류할 수 있다. Value Type Reference Type 이 둘의 차이는 데이터를 메모리에 어떻게 저장하느냐에 따라 나뉘게 된다. 프로그램에서 사용하는 메모리 영역 중 힙(Heap)영역과 스택(Stack)영역이 있는데, Value Type의 경우 값을 Stack영역에 저장하고, Reference Type의 경우 실제 데이터는 Stack에 저장한 뒤 해당 메모리의 주소값을 Stack영역에 저장하여 이를 통해 데이터를 불러오게 된다. C언어를 배우신 분들은 포인터에 대해 아실테니 위와 같은 개념을 좀 더 잘 알고 계시리라고 생각한다. Deep Cop..

Array.map, Array.reduce, Array.filter (코틀린)

면접에서 Array의 map과 reduce가 무엇인지에 대한 질문이 들어왔다. Array에서 두 함수를 사용해본 적이 없어서 답변을 하지 못해 글로 작성하여 알아보도록 하자. Array.reduce() 일단 reduce부터 알아보도록 하자. 코틀린 공식 문서에는 reduce함수는 위와 같이 작성되어있다. reduce함수는 Array의 첫 번째 값부터 시작하여 순서대로 지정한 연산을 수행한 값을 리턴한다. 코드를 통해서 사용해보도록 하자. fun main(){ var arr = arrayOf(183, 17, 32, 10, 8, 27) var res = arr.reduce{x, y -> x + y} println(res) } 위 코드에서 arr이라는 Array에 reduce함수를 사용한다. 연산을 수행하는 ..

lateinit과 by lazy의 차이

코틀린에서는 기본적으로 변수에 null이 들어가는 것을 허용하지 않는다. (nullsafe) 때문에 아래처럼 class에서 전역 변수를 선언하고 이후에 초기화하기 위해선 해당 변수를 nullable한 변수로 선언해줘야 한다. class exam(){ var a: String? = null fun hello(){ a = "Hello" println(a) } } 하지만, 위와 같은 방법은 다음과 같은 이유로 쓰는 것이 꺼려질 수 있다. 1. 변수 a가 nullable하기 때문에 null이 들어가면 안 되는 변수에 사용하기가 꺼려진다. (Kotlin의 null safety장점 활용 불가) 2. 해당 변수의 값이 초기화 이후 변하지 않을 경우 a를 var로 선언할 필요가 없어진다. 위와 같은 경우에 사용하기 위..

코틀린 25. 오브젝트

이번 글에서는 오브젝트에 대해서 알아보도록 하겠습니다. 오브젝트 우리가 배웠던 '클래스'는 실체가 아닌 실체를 만들기 위한 '틀'이기 때문에 이를 사용하기 위해서는 실체인 '객체'를 만들어서 사용해야 했습니다. 때문에 하나의 클래스에 여러 개의 객체가 존재할 수 있고, 객체들은 서로 독립적이라고 알아봤었습니다. 그런데, 이렇게 여러 개의 객체가 아닌 하나의 객체만 사용할 때는 오브젝트를 선언하여 사용하는 방법을 쓸 수 있습니다. fun main() { println(A.num) A.exF() } object A{ var num = 10 fun exF(){ println("오브젝트의 함수") } } 오브젝트는 객체를 생성하지 않기 때문에 오브젝트명을 참조하여 멤버에 접근합니다. 위의 코드에선 A라는 오브젝..

코틀린 24. 스코프함수

이번 글에서는 스코프함수에 대해서 알아보도록 하겠습니다. 스코프(Scope) 스코프함수에 대해 알아보기 전에 앞서 스코프가 뭔지 먼저 알아야겠죠? 스코프는 사전 뜻 그대로 범위를 말하는데, 패키지나 클래스, 함수 등의 내부에서 형성되는 범위를 말합니다. 예를 들어 패키지 A가 있다고 생각해보도록 합시다. 이 패키지 안에는 클래스 B와 함수 C가 있는데, 이 둘은 모두 패키지 내부의 하나의 큰 스코프 안에 속합니다. 그리고 클래스 B안에 있는 함수나 변수 등은 또 다른 스코프를 이루고, 함수 C에 있는 멤버들 또한 또 다른 스코프를 이룹니다. 이런 스코프의 특징은 같은 스코프 내의 다른 멤버들에게 자유롭게 접근 가능하다는 점과 상위 스코프의 멤버를 하위 스코프 내에서 재정의하여 사용할 수 있다는 점입니다...

코틀린 23. 고차함수, 람다함수

이번 글에서는 고차함수와 람다함수에 대해서 알아보도록 하겠습니다. 고차함수 고차함수는 어떠한 함수를 다른 함수의 parameter, 즉 argument로 전달하거나 함수를 리턴 시키는 것을 말합니다. 먼저, 함수를 parameter로 받는 법부터 코드로 확인해보도록 합시다. parameter를 선언할 때는 보통 "변수명: 자료형"의 형태로 선언했었는데, 함수의 경우 함수명: (parameter자료형)의 형식으로 받아오려는 함수의 parameter의 자료형들을 적어주고, 끝에 반환형을 적어주시면 됩니다. fun main() { exB(::exA) } fun exA(a: Int, b: Int){ println(a+b) } fun exB(fun1: (Int, Int)-> Unit){ fun1(10, 20) }..

코틀린 22. 맵(Map)

이번 글에서는 map에 대해서 알아보도록 하겠습니다. 맵(Map) map은 list, set과 함께 컬렉션 클래스를 상속받는 클래스입니다. map은 list나 set과는 달리 조금 특이한 녀석인데, 내부에 값만을 넣는 것이 아니고 이 값과 짝을 짓는 Key와 함께 구성되는 클래스입니다. 파이썬을 배우신 분들이라면 dictionary와 같은 개념이라고 생각하시면 됩니다. 예를 들어 "홍길동"이라는 문자열을 map에 저장할 때, name이라는 key와 함께 저장하면 이 key를 사용해 "홍길동"이라는 value를 얻어올 수 있습니다. 이러한 key와 value를 합쳐서 하나의 '쌍'이라고 부릅니다. 또한 하나의 map에서 key는 고유한 값이어야 하며, 중복될 수 없습니다. 따라서 name이라는 key에 다..

코틀린 21. 셋(Set)

이번 글에서는 셋에 대해서 알아보도록 하겠습니다. 셋(Set) Set은 List와 마찬가지로 코틀린의 collection 클래스를 상속받는 세 클래스중 하나입니다. Set은 수학에서의 집합이라고 생각하시면 되는데요. List와는 달리 안에 있는 데이터들 간에 순서가 존재하지 않으며, 중복을 허용하지 않는다는게 특징입니다. 때문에 이전에 Array와 List처럼 인덱스를 사용해 내부의 데이터를 참조할 수는 없으며, 내부에 데이터가 존재하는지 확인하는 용도로 사용됩니다. 그리고 Set은 List처럼 변경 불가능한 그냥 Set과 변경 가능한 MutableSet으로 나뉩니다. 선언 방법은 setOf와 mutableSetOf키워드를 사용하시면 됩니다. fun main() { var se1 = setOf(1, 5,..

코틀린 20. 리스트(List)

이번 글에서는 리스트에 대해서 알아보도록 하겠습니다. 리스트(List) 리스트는 코틀린에서 컬렉션 클래스를 상속받는 세 클래스(List, Set, Map)중 하나입니다. 이전에 배웠던 배열(Array)와 비슷한 개념을 가지고 있는데, 어떤 것인지 자세히 알아봅시다. 리스트는 여러 개의 데이터들을 한 곳에 모아서 관리할 수 있습니다. 리스트를 만들 때에는 그냥 list와 mutableList로 나뉘게 되는데요. list의 경우 최초 생성 시에만 값을 넣을 수 있으며, 이후에 해당 리스트의 값을 변경하거나 추가, 삭제할 수 없습니다. 반면 mutableList는 이러한 값의 변경이 가능한 리스트입니다. 그렇다면 배열과 리스트의 차이는 무엇일까요? 이 주제에 맞는 배열의 가장 큰 특징은 '크기가 정해져 있다'..

코틀린 19. 접근제한자

이번 글에서는 접근제한자에 대해서 알아보도록 하겠습니다. 접근제한자 접근제한자는 해당 패키지나 클래스에 외부에서 접근하려 할 때, 접근을 제어할 수 있는 개념입니다. 접근제한자는 패키지와 클래스에 접근할 때의 두 경우로 나뉘게 됩니다. 패키지의 경우 1. public (생략 시 기본) : 어떤 패키지에서나 접근할 수 있습니다. 2. internal : 같은 모듈 내에서만 접근할 수 있습니다. 3. private : 같은 파일 내에서만 접근할 수 있습니다. 클래스의 경우 1. public (생략 시 기본) : 클래스 외부에서 언제나 접근이 가능합니다. 2. private : 클래스 내부에서만 접근이 가능합니다. 3. protected : 슈퍼클래스와 이를 상속받은 서브클래스에서만 접근이 가능합니다. fun..

반응형