Single-exprossion function 람다식을 이용한 메소드 간결 정의

var add = {num1:Int, num2:Int -> num1+num2}         //람다 기본구조 변수처럼 이용

fun add(num1:Int, num2:Int) = (num1+num2)           //메소드처럼 이용

 

지연 초기화

클래스 설계할 때 초기의 값을 정의하기 난처하거나 저사양으로 제한되어있는 환경에서 메모리를 효율적으로 사용하려고 할 때 주로 사용된다.

 

lateinit var 변수명 : 타입

 .isInitialized를 통해 값이 초기화되었는지 boolean형태인 true/false로 초기화 여부를알 수 있다.

사용할 때는 값이 아니라 참조형태로 사용해야하기 때문에 this::을 붙인다

if(this::변수명.isInitialized) {
	
}

val 상수명 by lazy {}

lateinit var 변수명 : 변수타입

val 상수명 by lazy {초기화}

 

 


Null Safety

Null Exception 

 

var 변수명:String? = null   // ? 변수가 null일 수 있을 때 null을 갖을 수 있게끔 해준다.

${변수명?.length}       // ?. 변수가 null이 아니라면 length를 반환하고 null일 경우 null을 반환한다.

${변수명?.length ?: "초기화하세요"}    // ?: 앨비스 연산자 null 일 경우 뒤에 문장 실행

 

예외 처리의 활용

 

Kotlin은 try - catch  throw 프로그램 실행 도중에 발생하는 예외를 적절하게 처리한다.

 

try-catch의 기본 구조

try {
	예외가 발생할 가능성이 존재하는 코드
} catch(예외종류) {
	예외가 발생했을 때 처리할 코드
}

 

throw의 기본 구조

if() {
	throw 예외종류
}

 

throw는 try-catch와 다르게 사후처리할 코드는 없고 에러로 인한 비정상적인 종료를 막고 에러 정보를 알려준다.

 

예외 처리 예제

숫자를 입력받으면 그 숫자 출력 그 외 잘못된 입력값은 숫자를 입력하라는 예외처리문구를 띄워준다.

while(true) {
	try {
    	var num = readLine()!!.toInt()
        println("${num}")
        break
    } catch(e:java.lang.NumberFormatException) {
    	println("숫자를 입력해주세요.")
    }

 

try-catch-finally 

예외 처리와 관계없이 항상 실행하는 코드를 finally에 작성한다.

try {
	예외가 발생할 가능성이 존재하는 코드
} catch(예외종류) {
	예외가 발생했을 때 처리할 코드
} finally {
	예외 처리와 관계없이 항상 실행하는 코드
}

 

접근제한자

 

Kotlin에서는 public, private, internal, protected로 변수나 메소드의 접근을 제한할 수 있다.

 

여기서 접근이란, 객체를 이용해서 변수나 메소드를 호출할 수 있는지의 여부이다.

 

public 명시하지 않으면 기본적으로 public 이다. (어디서나 접근 가능)

private 동일한 클래스 내부에서만 접근할 수 있다.

internal 같은 모듈 내부에서만 접근할 수 있다.

protected 기본적으로 private이지만 상속을 받은 경우에 타 모듈에서 접근할 수 있다.

 

우선 프로젝트의 구조를 알아보자.

프로젝트(Project) 는 최상단의 개념으로 <모듈,패키지,클래스>를 포함한다.

모듈(Module) 프로젝트 아래의 개념으로 <패키지, 클래스>를 포함한다.

패키지(Package) 모듈 아래의 개념으로 <클래스>를 포함한다. 우리가 일반적으로 알고 있는 디렉토리이다.

 

접근제한자의 필요이유?

접근권한을 통해 데이터에 무분별한 접근을 막을 수 있다.

클래스들간에 접근하면 안되는 상황을 구분하기 때문에 향후에 유지보수하기 용이하다.

상속

부모 클래스에서 중복되는 메소드 가져오기

Chicken의 fly 메소드 사용이 가능해졌다. 상속받으려면 부모클래스에서 open해주어야 한다.

open class Bird {
	fun fly()
}

class Chicken : Bird() {

}

 

override 오버라이딩

부모클래스에서 특정메소드 커스텀해서 쓰고 싶을때 사용.

open class Bird(name) {
	open fun fly() {
    }
}


class Chicken(name: String, age: Int) : Bird(name) {
	override fun fly() {
    }
}

 

overload 오버로드

매개변수의 갯수 또는 자료형만 다른녀석인데 동일한 이름으로 쓰면 안되나 해서 나온 녀석(가능하다.)

class calculator {
	fun add(num1:Int, num2:Int){
    }
    	fun add(num1:DouBle, num2:DouBle){
    }
}

 

Interface 인터페이스 

코틀린은 반드시 한 개의 부모클래스만 상속받을 수 있다.

따라서 근본적인 공통점을 상속 받고, 추가적인 기능들은 인터페이스로 추가한다.

추상 메소드 -> 로직이 존재하지 않고 이름만 존재할 때 추상 메소드라 부른다.

기본적으로 인터페이스는 추상메소드만 작성하는게 원칙이나 최근에는 아니여도 괜찮다는 흐름.

왜 추상메소드로 작성하냐 -> 어차피 자식 클래스에서 오버라이딩해서 작성할거니까

interface 인터페이스이름 {
	fun 메소드이름()
}
class Duck(name: String) : Bird(name), WaterBirdBehavior {
	override fun swim() {
    }
}

 

메소드 설계

코틀린의 메소드 기본 구조

fun 메소드이름(변수명:자료형, 변수명:자료형 ....) : 반환자료형 {
	소스코드 로직
}

 

 

클래스 설계

클래스

정보(Property) 와 행위(Method)를 포함한다.

 

데이터 클래스 (data class)

data class 클래스이름 {
	정보1
    	정보2
}

정보(Property)만 가지는 클래스 + 유용한 메소드 자동생성

 

실드 클래스 (sealed class)

sealed class 부모클래스 {
	class 자식클래스1 : 부모클래스생성자
    	class 자식클래스1 : 부모클래스생성자
}

클래스 상속과 관련된 개념 + 상속받을 수 있는 자식클래스를 미리 정의 + 무분별한 상속방지 + 컴파일 시점에 생성가능 자식 알 수 있기에 효율적으로 다형성을 구현한다.

 

오브젝트 클래스 (object class) 

 

Java의 static 대신 사용하는 키워드

프로그램을 실행하는 동시에 인스턴스화한다.

 

 

생성자 (Constructor)

 

init 주 생성자 사용예시 -> 반드시 하나의 형태 _name, _hairColor, _height 만을 사용하는 형태라면 사용

class Character(_name:String, _hairColor:String, _height:Double){
	//매개변수를 직접 넘기지 않는다.
    init {
    	this.name = _name
        this.hairColor = _hairColor
        this.height = _height
    }
}

 

constructor 부 생성자 사용예시 -> 여러 형태의 생성자 사용 가능  _name || _hairColor || _height

class Character {
	// 명시적 생성자 (Constructor)
    constructor(_name:String, _hairColor:String, _height:Double) {
    	name = _name
        hairColor = _hairColor
        height = _height
    }
    constructor(_name:String, _hairColor:String) {
    
    }
    constructor(_name:String, _hairColor:String, _weight:Double) {
    
    }
}

 

+ Recent posts