지금까지 코틀린 기본세팅을 진행했다.
2022.01.29 - [Kotlin] 코틀린 기본개념 - 코틀린이란? 도대체 왜 쓰는가? 특징!
2022.01.28 - [Kotlin] 코틀린 환경설정 - Intellj에서 코틀린 프로젝트 생성하기
2022.01.29 - [Kotiln] Intellj에서 코틀린 코딩컨벤션 Kotlin Style Guide 적용하기
2022.01.30 - [Kotiln] 코틀린 실행하기 - Scratch File (스크래치 파일) 만들기
이제는 코틀린에 익숙해지기 위해서 간단한 코틀린 기본문법을 돌려볼 것이다. 이전에 한 기본문법 심화버전으로!
2022.01.29 - [Kotiln] 코틀린 기본문법1 (변수선언/함수선언/자료형/반복문/조건문)
2022.01.30 - [Kotiln] 코틀린 기본문법2 (NULL처리 : lateinit/lazy/!!/?/?.)
클래스 선언
코틀린에서는 class키워드로 클래스를 선언하고 기본으로 public이다.
그리고 자바와 달리 객체 생성시 new 키워드를 사용하지 않는다.
//Java
public class PersonJava {
public static void main(String[] args) {
PersonJava personJava = new PersonJava();
}
}
//Kotiln
class PersonKotlin {
// empty class
}
fun main() {
val personKotlin = PersonKotlin()
}
위의 예시에서 PersonKotiln클래스는
사람이름과 나이를 property로 저장하는 자바빈(JavaBean)클래스로 기본생성자, getter/setter를 구현해야한다.
클래스 프로퍼티 선언
프로퍼티는 흔히 멤버필드(member field)를 의미한다.
클래스 선언과 동시에 초기화를 해야 컴파일시 에러가 발생하지 않는다.
class PersonKotiln {
var name: String = ""
var age: Int = 0
}
그리고 이런 모델역할을 하는 클래스(자바빈 클래스)는 프로퍼티를 초기화하는 생성자가 필요하다.
클래스 생성자 선언
constructor 키워드를 사용해서 프로퍼티를 초기화하는 생성자를 선언할 수 있다.
사실 초기화 하는 기본생성자는 생략할 수 있다.
class PersonKotiln {
constructor (name: String, age: Int) {
this.name = name
this.age = age
}
var name: String = ""
var age: Int = 0
}
//다른방식1 : 클래스 이름 옆에 기본생성자 선언
class PersonKotiln constructor (name: String, age: Int) {
var name: String = ""
var age: Int = 0
}
//다른방식2 : 생성자 키워드 생략
class PersonKotiln (name: String, age: Int) {
var name: String = ""
var age: Int = 0
}
클래스 생성자를 반복적으로 선언하지 않도록 하기 위해서 기본값을 지정해서 초기화 할 수 있다.
이럴떄 직접 constructor 생성자를 직접 명시하는 듯하다
class PersonKotiln {
constructor (name: String, age: Int) {
this.name = name
this.age = 0
}
var name: String = name
var age: Int = age
}
val p1 = PersonKotiln("홍길동",20) // name="홍길동", age=20
val p1 = PersonKotiln("김영희") // name = "김영희", age=0(default)
훨씬 더 간결한 방법이 있다.
프로터피 선언도 생략하고, 생성자도 생략해서 클래스 선언을 한줄로 줄일 수 있는 것이다.
class PersonKotiln (var name:String = "개발자", var age:Int = "20")
val p0 = Person() // name="개발자", age=20
val p1 = Person("김철수") // name="김철수", age=20
val p2 = Person("김영희", 25) // name="김영희", age=25
val p3 = Person(age=30, name="도라에몽") // name="도라에몽", age=30
클래스 상속
기본적으로 코틀린에서는 클래스간의 상속이 허용되지 않는다.
대신 open 키워드를 클래스 앞에 사용해서 선언하면 그 클래스를 상속이 가능하다.
open class Fruit{}
class Apple : Fruit(){} //Fruit클래스를 상속받은 Apple클래스
open class Person(var name : String)
class Student(var grade : Int) : Person("Jordan") //Person클래스를 상속받은 Student클래스
내부 클래스
inner 키워드를 클래스 앞에 사용해서 선언하면 그 클래스는 클래스 내부에서 사용할 수 있다.
class Student {
var name : String = "Jordan"
init{
println("My name is $name")
}
inner class Personality {
fun doSomething() : Unit {
name += ", He is Chicago Bulls No.23 Basketball Start"
println(name)
}
}
}
val student : Student = Student()
student.Personality().doSomething()
//출력
My name is Jordan
Jordan, He is Chicago Bulls No.23 Basketball Start
컬렉션(Collection)
컬렉션이란 자주사용하는 기초적인 자료구조를 모아놓은 일종의 프레임워크
자바와 다르게 불변형(immutable:읽기전용)과 가변형(mutable)로 나뉜다.
불변형은 val 변수선언과 같은 느낌이고, 가변형은 var 변수선언과 같은 느낌이다.
리스트(List)
배열이나 자바의 리스트와 같은 자료구조로 순서에 따라 정렬된 요소를 가지는 컬렉션.
중복된 아이템을 가질 수 있다.
리스트에 있는 아이템은 그냥 파이썬처럼 [i]로 접근할 수 있다.
listOf() : 불변형 리스트 생성 , 리스트의 요소들 변경불가
자료형을 명시할수도 있고, 생략도 할수 있으며, 혼합도 가능해서 <Any>자료형으로도 쓰일수 있다.
//타입명시
val fwPlayers1: List<String> = listOf("one", "two", "three")
val numers : List<Int> = listOf(1,2,3,4)
//타입생략 (string타입추론)
val fwPlayers2 = listOf("one", "two", "three")
//타입생략 (any타입으로 혼합가능)
val mix = listOf(1, "one", 2,"two", 3,"three")
//리스트접근방식 : 단순하게 [i]
println("left wing : ${fwPlayers1[0]}")
//리스트접근방식 : for문으로 하나씩 꺼내기
for (p in fwPlayers1) print(p)
for (n in numers) print(n)
mutableListOof() : 가변형 리스트 생성, 리스트의 요소를 추가(add), 삭제(remove), 교체(대입) 가능
//타입명시
val mutalbeList: MutableList<String> = mutableListOf<String>("one", "two", "three")
mutalbeList.add("zero") //맨 뒤에 add
mutalbeList.removeAt(1) // 1번째 아이템(two) remove
mutalbeList[0]="ONE" //0번째 아이템 (one) update
println(mutalbeList) // ["ONE", "three","zero"]
//타입생략 : any타입으로 혼합해서 사용가능
val mutalbeList2 = mutableListOf(1, "two", 3)
println(mutalbeList2)
셋(Set)
튜플(집합)과 같은 자료구조로 순서가 없는 요소를 가지는 컬렉션.
list는 중복된 아이템를 가질 수 있지만, set은 중복된 아이템을 가질 수 없다.
SetOf() : 불변형 set 생성 , Set의 요소들 변경불가
// 타입명시
val intSet: Set<Int> = setOf<Int> (1,2,3,4)
// 타입생략(any타입)
val mixedSet = setOf("one",2,3,"four")
MutableSetOf() : 가변형 set생성, MutableSet 리턴, add(),remove()가능
HashSetOf() : 가변형 set생성, 정렬없는 HashSet 리턴, 해시값으로 아이템을 찾기 때문에 검색속도가 가장 빠름
SortedSetOf() : 가변형 set생성, 정렬된 TreeSet 리턴, HashSet보다 검색속도느리지만 정렬뛰어남.
LinkedSetOf() : 가변형 set생성, 정렬된 LinkedHashSet 리턴, HashSet/TreeSet보다 느리지만 메모리 공간 효율적
맵(Map)
자바의 맵와 같은 자료구조로 key-value 쌍 형태로 저장되는 컬렉션.
key는 중복될 수 없고 유일하지만, value는 중복해서 사용할 수 있다.
MapOf() : 불변형 map생성
//타입명시
val langMap: Map<Int,String> = mapOf(11 to "Java", 22 to "Kotiln", 33 to "Python")
//출력
for ((key,value) in langMap) {
println("key=$key, value = $value)
}
//key로 출력
println(${langMap[22]})
println(${langMap.get(22)})
println("key전부 : ${langMap.keys})
MutableMapOf() : 가변형 Map생성, MutableMap(K,V) 리턴, put(),putAll(), remove(),clear() 가능
HashMapOf() : 가변형 Map생성, 정렬없는 HashMap 리턴, 해시값으로 아이템을 찾기 때문에 검색속도가 가장 빠름
SortedMapOf() : 가변형 Map생성, key를 기준으로 정렬된 TreeMap 리턴, HashMap보다 검색속도느리지만 정렬뛰어남.
LinkedMapOf() : 가변형 Map생성, 정렬된 LinkedHashMap 리턴, HashMap/TreeMap보다 느리지만 메모리 공간 효율적
참고
https://manorgass.tistory.com/79
https://velog.io/@gosgjung/3%EB%B6%84-kotlin-4-%ED%81%B4%EB%9E%98%EC%8A%A4
https://junyoung-developer.tistory.com/92?category=930228
https://codechacha.com/ko/collections-in-kotlin/
'🍃 Language > Kotiln' 카테고리의 다른 글
[Kotlin] 코틀린 코루틴 개념과 basics - 새차원 강의1,2요약 (0) | 2022.01.31 |
---|---|
[Kotlin] 코틀린 심화문법2 (확장함수/고차함수/표준라이브러리) (0) | 2022.01.31 |
[Kotlin] 코틀린 심화문법1 (람다식:lambda expression) (0) | 2022.01.31 |
[Kotlin] 코틀린 기본문법2 (NULL처리 : lateinit/lazy/!!/?/?.) (0) | 2022.01.30 |
[Kotlin] 코틀린 실행하기 - Scratch File (스크래치 파일) 만들기 (0) | 2022.01.30 |
[Kotlin]🐘빌드도구(Build Tool), Gradle과 Maven 차이점 (0) | 2022.01.30 |