[개념] 코틀린 기본 정리

728x90

🟦 1. 코틀린 기본 정리

🟧 1. 변수와 상수

  • 변수 : var 키워드
  • 상수 : val 키워드

→ 코틀린은 기본적으로 변수의 타입을 ‘형추론’ 하여 자료형 명시 없이도 알아서 추론할 수 있다.

🟧 2. 기본 자료형

→ 기본형 : 순수하게 값 저장하는 자료형

→ 참조형 : 객체를 참조하는 자료형

  • 코틀린의 자료형은 모두 참조형이다. 즉, 모든 자료형이 ‘객체 형태’라고 생각하면 된다.

◾숫자 자료형

    1. 정수 자료형 : Byte, Short, Int, Long
    1. 실수 자료형 : Double, Float

◾문자 자료형

    1. 문자 자료형 : Char
    1. 문자열 자료형 : String

◾논리 자료형

  • Boolean

◾배열 자료형

  • Array

→ arrayOf() 함수로 배열 생성 O

🟧 3. 함수

  • Unit형 = 자바의 void에 대응. 반환값 X. 생략O
  • 다만, 반환값 있는 함수의 경우 반드시 반환형 명시해주어야 한다.
  • 단일 표현식 함수 : 실행 코드가 표현식 하나로 구성된 함수
  • → 단일 표현식 함수와 Unit형만 반환형 생략 O
//함수 기본 형태
fun 함수명(매개변수) : 반환형 {
	//실행 코드
}

🟦 2. 제어문

  • 코틀린은 직관적이고 간결한 제어문 제공

🟧 1. 범위 클래스

  • 특정 범위 값들을 간편하게 표현 가능하도록 제공하는 클래스
  • ex. IntRange. LongRange, CharRange
val numRange : IntRange = 1..5 //Int형 1~5 범위내의 값들을 numRange 범위 클래스에 담음

println(numRange.contains(3)) // numRange 가 갖는 범위 내에 3이 존재 O -> T 출력
println(numRange.contains(10) // numRange 가 갖는 벙위 내에 10 존재 X -> F 출력 

🟧 2. for문

  • in 연산자 : 범위 지정
  • downTo 키워드 : 역순 지정
  • step 키워드 : 간격 지정
//1) 순행 출력 -> 1, 2, 3, 4, 5
for(i in 1..5) {
	println(i)
}
//2) 역순 출력 -> 5, 4, 3, 2, 1
for(i in 5 downTo 1) {
	println(i)
}
//3) 간격 출력 -> 1, 3, 5, 7, 9
for(i in 1..10 step 2) {
	println(i)
}

◾ 배열의 요소 출력

  • withIndex() 함수 이용 → 배열 각 요소의 index값도 가져올 수 있다.
val studens = arrayOf("A", "B", "C", "D")

for (name in studens){
	println(name)
}

//withIndex() 함수로 인덱스값, 요소값 동시에 들고오기
for( (index, name) in studens.withIndex() ) {
	println("Index: ${index} Name: ${name)")
}

🟧 3. while 문/do while문

  • 조건 참인 동안만 반복하는 제어문

🟧 4. if 문 / if-else문

    1. 명령문 : 어떤 동작 수행하는 문장
    1. 표현식: 하나의 값을 반환하는 문장

→ if문을 표현식에도 사용 가능하다.

val myAge = 40
val isAdult = if(myAge>30) true else false

println("성인여부= $isAdult")

🟧 5. when문

  • 자바의 switch문이 코틀린에서는 제공X
when(weather) {
	1 -> {    }
	2 -> {    }
  //변수값이 어떤 범위 내의 값인 경우 실행 
  in 15..26 -> {   } 
	//변수값이 어떤 범위 내에 안들어가는 경우 실행 
  !in 15..27 -> {   }
   . . .
  else -> {    }
}

🟦 3. 컬렉션

  • 자바의 여러 컬렉션 자료구조 : 리스트(List), 셋(Set) , 맵(Map)
  • 코틀린은 이 컬렉션 자료구조 모두 사용 O
  • 코틀린은 컬렉션 자료구조를 ‘읽기 전용’ + ‘읽기-쓰기’ 전용 2가지로 나눈다.

🟧 1. 리스트(List)

  • 순서가 있는 자료구조
  • 1) 읽기 전용 리스트 : listOf() 함수 사용
  • 2) 읽기-쓰기 전용 리스트 : mutableListOf() 함수
    • 리스트 속 요소값 존재 여부 확인 시 : contains() 함수 사용

🟧 2. 셋(Set)

  • 순서가 없고, 내부 요소에 값 중복 X 자료구조
  • 1) 읽기 전용 셋 : setOf() 함수 사용
  • 2) 읽기-쓰기 전용 셋 : mutableSetOf() 함수 사용

🟧 3. 맵(Map)

  • 키-값 자료구조
  • 키는 중복X
  • 1) 읽기 전용 맵 : mapOf() 함수
  • 2) 읽기-쓰기 전용 맵: mutableMapOf() 함수

🟦 4. 클래스

  • 클래스 : 객체 정의 설계도

🟧 클래스 생성자

  • 생성자 : 객체 생성 시 항상 실행되는 특수 함수. 객체 초기화 목적
  • 1) 주 생성자 : 클래스 이름 옆에 contructor(생략O) 존재하는 부분
class Person(name : String) { ... } 

class Person constructor(name : String) { ... } 
  • 2) 보조 생성자 : 클래스 Body 내부에서 constructor 키워드로 만든 부분
  • → 주생성자, 보조 생성자 모두 존재하는 경우,
    • 반드시 보조 생성자에서는 this 키워드를 사용하여 주 생성자 호출해야 함
class Person(name: String){ //주 생성자
	//보조 생성자 
	constructor(name: String, age: Int) : this(name) //주 생성자의 name 호출{ 
		// 이 객체 생성 시 실행될 코드
  }
}
  • 3) 초기화 블록 : init{ }
    • init{ } 안의 코드들은 객체 생성 시 가장 먼저 실행된다.
    class Person(name:String) {
    	//필드
    	val name : String
      //초기화 블록
      init {
    	  if(name.isEmpth()){
    			throw IllegalArgumentException("이름 없다.")
    		}
    		this.name = name 
       }
    }
    

🟧 클래스의 상속

  • 코틀린에서 상속할 부모 클래스는 open 키워드 붙여야 한다.
  • 부모 클래스의 메소드 상속될 메소드에 대해서도 open 키워드 붙여야 한다.
    • open 메소드자식 클래스에서 override 재정의하여 함수 사용
  • 자식 클래스에서 부모 클래스 생성자 호출 원하면 ‘명시적’ 호출 필요
//부모클래스
open class Flower {
	//상속될 메소드 
	open fun waterFlower() { ... }
}

//자식클래스
class Rose : Flower() {
	//재정의
	override fun waterFlower() {
		super.waterFloser() //부모의 메소드 먼저 실행 
		//추가부분
  ]
}

🟧 접근 제한자

◾ 접근 제한자 공개 범위

  1. public : 기본 접근 제한자. 모든 클래스에서 접근 O
  2. internal : 같은 모듈 내에서 접근 가능

→ ex. 한 프로젝트 내 의 같은 모듈 안에서는 접근 허용

  1. protected : 상속받은 클래스 내에서 접근 가능
  2. private : 동일 클래스 내에서만 접근 가능

🟧 컴패니언 객체 : companion 키워드

  • 자바의 static 정적 키워드 역할
  • 별도 객체 생성 없이도 바로 해당 객체 내부에 접근 가능한 객체 의미

🟧 싱글톤 객체 : object 키워드

  • opject키워드로 생성된 객체는 여러 번 호출해도 하나의 객체를 재사용한다. 매번 새 객체 생성 X

🟧 추상 클래스 : abstract 키워드

  • 추상 클래스 : 그 자체로는 객체 생성 X.
  • 이를 상속하는 자식 클래스들이 내부에 정의해놓은 추상 메소드 재정의하여 구현한 뒤 사용하는 객체
  • 내부 추상 메소드들에 대해서도 반드시 abstract 키워드 붙일 것

🟧 데이터 클래스 : data class

  • 데이터 전달용 객체이다.
  • 데이터 클래스의 주 생성자에는 반드시 val/var 프로퍼티 적어도 하나 이상 필수이다.

🟦 5. 인터페이스

🟧 인터페이스 정의

  • interface 키워드 사용
  • 인터페이스 한정. 내부 추상 메소드들의 abstract키워드는 생략 가능하다.

🟧 디폴트 메소드 (default)

  • 특별한 키워드 없이 내부 실행문 존재하는 함수 = 자동 default 함수이다.
  • 이후 이 인터페이스 구현 클래스에서 따로 override 없어도 자동 실행된다.

🟧 인터페이스의 구현

class 구현클래스 : 상위 인터페이스 {
}

🟧 다중 인터페이스 구현

  • 하나의 클래스는 하나의 클래스만 상속 O. 즉, 다중 상속 지원X
  • 단, 인터페이스는 여러 개 구현 O

🟧 클래스 상속과 인터페이스 구현

  • 다중 상속은 불가능 하지만, 한 개의 클래스 + 여러 인터페이스 구현 가능O

🟦 6. Null 처리

  • cf. 자바에서는 객체 반환할 함수가 반환할 객체 없을 경우 null을 반환했기 때문에
    • Null 체크가 필요했다. 예외 발생하므로
  • 코틀린은 기본적으로 객체 null을 허용하지 않는다.1) 기본 null 불허용
    • 자료형 뒤에 ? 기호 붙이면 = 해당 변수 null 허용
  • 2) 명시적 null 허용
  • → 따라서 반드시 코틀린은 모든 객체들을 생성과 동시에 초기화해야 한다.

🟧 셰이프 콜 연산자 | ? 연산자

  • 안전 호출 연산자라고도 한다.
  • ? 연산자 사용하여 셰이프 콜 시, 해당 참조가 null이면 반환값도 null로 한다.
fun reverseName(name: String? ) : String? {
	 return name?.reversed() //만약 들어온 name값이 null이면 null 그대로 반환 
}

🟧 엘비스 연산자 | ?: 연산자

  • ? 연산자 사용하여 셰이프 콜 시, null 대신 기본값을 반환한다.
fun reverseName(name : String? ) : String? {
	return name?.reversed() ?: "이름을 확인해주세요" //만약 name값 null이면 기본값 반환
}

🟧 확정 연산자 | !! 연산자

  • “null 허용이라고 선언했지만, 이 변수는 절대 null 이 아니다” 를 표현함
fun reverseName(name : String?) : String { //반환 자료형에 ?없으므로 null 반환 불가능 
	return name!!.reversed() //반환값이 절대 null 아니다.를 표현
}

🟧 laze init 키워드, lazy 키워드

1) laze init 키워드 : var 변수의 늦은 초기화

2) lazy 키워드 : val 상수의 늦은 초기화

  • lazy{ } : 최초 호출 시 lazy내부 코드 실행되면서 초기화된다.
val lazyBean : String by lazy {
		// 늦은 초기화
}

🟦 7. 람다식

  • 값처럼 사용할 수 있는 ‘익명 함수’

🟧 람다식 정의

  • 변수 = (인수 자료형) → (반환형) = { 인수 → 실행코드 }
val squareNum : (Int) -> (Int) = {number -> number*number}

//호출 시 인수에 값 담아서 호출
println(squareNum(25) ) // 25* 25 실행 결과값이 출력될 것이다. 

728x90