본문 바로가기
🍃 Language/Kotiln

[Kotlin] 코틀린 기본문법3 (클래스와 컬렉션: List/Map/Set)

by 카프리썬_ 2022. 1. 30.
728x90
728x90

지금까지 코틀린 기본세팅을 진행했다.

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

728x90

컬렉션(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

 

Kotlin 기초강의#4 :: 코틀린 클래스의 선언과 생성자

🎈 이번 포스팅에서는 객체지향 프로그래밍의 가장 기본이 되는 클래스의 선언 방법과 생성자에 대해 알아봅니다. #1> OOP(Obejct-Oriented Programming)의 시발점: 클래스 객체지향 프로그래밍 언어인

manorgass.tistory.com

https://velog.io/@gosgjung/3%EB%B6%84-kotlin-4-%ED%81%B4%EB%9E%98%EC%8A%A4

 

3분 kotlin (4) - 클래스

클래스를 단순하게 선언하는 것은 어렵지 않다. 다만 new 키워드를 코틀린에서는 사용하지 않는 다는점이 조금은 불편하게 다가올수도 있을것 같다.constructor 구문에서 초기화 구문을 작성할 수

velog.io

https://junyoung-developer.tistory.com/92?category=930228 

 

[Kotlin] 컬렉션(Collection) - List

모든 내용은 Do it! 코틀린 프로그래밍을 바탕으로 정리한 것입니다. 컬렉션(Collection) 컬렉션은 자주 사용하는 기초적인 자료구조를 모아 놓은 일종의 프레임워크로 표준 라이브러리로 제공하고

junyoung-developer.tistory.com

https://codechacha.com/ko/collections-in-kotlin/

 

 

728x90
반응형