Kotlin 31

제네릭

제네릭 (Generic) 이란 클래스 내부에서 사용할 자료형을 나중에 인스턴스를 생성할 때 확정한다. 자료형의 객체들을 다루는 메서드나 클래스에서 컴파일 시간에 자료형을 검사해 적당한 자료형으로 선택할 수 있게 하기 위해 사용한다. 제네릭을 사용하면 객체의 자료형을 컴파일할 때 체크하기 때문에, 객체 자료형의 안전성을 높이고 형 변환의 번거로움이 줄어든다. 제네릭 사용방법 앵글브라켓() 사이에 형식 매개변수를 넣어 선언한다. 이때 형식 매개변수는 하나 이상 지정 가능하다. 형식 매개변수는 자료형을 대표하는 용어로 T와 같이 특정 영문 대문자를 사용한다. 제네릭을 사용하면서 얻을 수 있는 장점은 의도하지 않은 자료형의 객체를 지정하는것을 막고 객체를 사용할 때 원래의 자료형에서 다른 자료형으로 형 변환시 ..

Kotlin 2023.12.25

인터페이스

인터페이스 (Interface) 란 인터페이스에는 abstract로 정의된 추상메서드나 일반메서드가 포함된다. 추상클래스처럼 프로퍼티를 통해 상태를 저장할 수 없고 선언만 가능하다. 인터페이스도 마찬가지로 객체를 생성할 수 없고 하위 클래스를 통해 구현 및 생성해야한다. 인터페이스를 사용하는 이유? 추상클래스를 사용할 때의 제한을 생각해보자. 하위클래스는 상속을 하나만 허용한다는 단점이 있다. 또한 상위클래스와 하위클래스의 강한 연관이 생기면서 상위클래스의 영향을 그대로 받게된다. 그래서 상위클래스가 수정되었을 때 하위 클래스를 일일이 확인하기 어려운 경우 부작용이 발생할 수 있는것이다. 인터페이스는 클래스가 아니다. 그래서 상속의 개념이 아닌 구현의 개념이라 구현클래스 (하위클래스)와 강한 연관을 가지..

Kotlin 2023.12.25

추상클래스

추상클래스란 Abstract Class는 선언 등의 대략적인 설계 명세와 공통의 기능을 구현한 클래스이다. 추상이란말은 구체적이지 않은 것을 나타낸다. 추상클래스를 상속하는 하위 클래스에서 추상클래스의 내용을 더욱 구체화시켜야한다. abstract라는 키워드와 함께 선언하며 추상클래스로부터 일반적인 객체를 생성하는 방법으로 인스턴스화될 수 없다. 다만 추상클래스를 상속하는 하위 클래스가 어떻게 만들어야하는지를 나타내는 용도로 사용된다. abstract 사용 예시 // 추상클래스, 주 생성자에는 비추상 프로퍼티 선언의 매개변수 3개가 있음 abstract class Vehicle(val name: String, val color: String, val weight: Double) { // 추상 프로퍼티(반..

Kotlin 2023.12.25

지연초기화

lateinit / lazy 보통은 클래스에서 기본적으로 선언하는 프로퍼티는 null 값을 가질 수 없다. 그러므로 반드시 초기화가 되어야 하는것이 규칙인데, 초기화를 미룰 때 지연초기화 (lateinit, lazy)를 사용한다. 언제 사용할까? 의존성이 있는 초기화나 유닛 테스트를 위한 코드를 작성하면서, 설정에 의한 초기화를 할 때 불편하다. Car클래스의 초기화 부분이 Engine클래스와 의존성을 가질 때, Engine 객체가 생성되지 않으면 완전하게 초기화 할 수 없다. 이처럼 특정 객체에 의존성이 있을 때 지연초기화를 해야한다. lateinit 지연초기화 예시 class Person2 { lateinit var name: String //지연초기화 선언 fun test() { if(!::name..

Kotlin 2023.12.25

프로퍼티 (Getter / Setter)

프로퍼티의 접근 자바의 필드(Fields) 단순한 변수 선언만 가지기 때문에 접근을 위한 메서드를 따로 만들어야 함 코틀린의 프로퍼티 (Properties) 변수 선언과 기본적인 접근 메서드를 모두 가지고 있음 따로 접근 메서드를 만들지 않아도 내부적으로 생성하게 됨 * 자바의 Fields == 코틀린의 Property. 자바에서의 접근 메서드 형식 class Person { // 멤버필드 private String name; private int age; // 생성자 public Person(String name, int age) { this.name = name; this.age = age; } // 게터와 세터 public String getName() { return name; } public v..

Kotlin 2023.12.24

캡슐화

캡슐화(encapsulation)란 클래스를 작성할 때 외부에서 숨겨야 하는 속성이나 기능 가시성 지시자(visibility modifiers)를 통해 외부 접근 범위를 결정할 수 있다. private: 이 지시자가 붙은 요소는 외부에서 접근 불가 public: 이 요소는 어디서든 접근이 가능 (기본값) protected: 외부에서 접근할 수 없으나 하위 상속 요소에서는 가능 internal: 같은 정의의 모듈 내부에서 접근 가능 public, private 코드 예시 package com.example.demo.inherit private class PrivateTest { private var i = 1 private fun privateFunc() { i += 1 println(i) } fun ac..

Kotlin 2023.12.24

다형성

다형성 (polymorphism)이란? 같은 이름을 사용하지만 구현 내용이 다르거나, 매개변수가 달라서 하나의 이름으로 다양한 기능을 수행할 수 있는 개념이다. Static Polymorphism 컴파일 타임에서 결정되는 다형성 단순하게 보면 메서드 오버로딩을 사용할 때 Dynamic Polymorphism 런타임 다형성 동적으로 구성되는 오버라이딩된 메서드를 사용할 때 오버라이딩 (overriding) 기능을 완전히 다르게 바꾸어 재설계 누르다 -> 행위 -> push() push()는 '확인' 혹은 '취소' 용도로 서로 다른 기능을 수행할 수 있다. 오버로딩(overloading) 기능은 같지만 인자를 다르게 하여 여러 경우를 처리 출력한다 -> 행위 -> print() ..

Kotlin 2023.12.23

예외 처리

예외 (exception) 실행 도중의 잠재적인 오류까지 검사할 수 없기 때문에 정상적으로 실행이 되다가 비 정상적으로 프로그램이 종료되는 경우 운영체제의 문제 (잘못된 시스템 호출의 문제) 2. 입력값의 문제 (존재하지 않는 파일 혹은, 숫자 입력란에 문자 입력 등) 3. 받아들일 수 없는 연산 (0으로 나누기 등0 4. 메모리 할당 실패 및 부족 5. 컴퓨터 기계 자체의 문제 예외를 대비하기 위한 구문 try { 예외 발생 가능성 있는 문장 } catch (e: 예외처리 클래스명) { 예외를 처리하기 위한 문장 } finally { 반드시 실행되어야 하는 문장 } fun main() { val a = 6 val b = 0 val c: Int try { c = a / b println("After") ..

Kotlin 2023.12.23

확장 함수

확장함수 클래스의 멤버 함수를 외부에서 더 추가할 수 있다. fun 확장대상.함수명(매개변수, ...): 반환값 { ... return } ExtensionFunction fun main() { val source = "Hello World" val target = "Kotlin" println(source.getLongString(target)) } // String을 확장해 getLongString 추가. (String은 Class인걸 생각하자) fun String.getLongString(target: String): String = if (this.length > target.length) this else target // this 키워드는 "hello world"를 지칭함 this는 확장 대상..

Kotlin 2023.12.23

고차함수와 람다식

람다식이란? 익명 함수의 하나의 형태로 이름 없이 사용 및 실행이 가능 val multi: (Int, Int) -> Int = { a: Int, b: Int -> a * b } // 생략되지 않은 전체표현 val multi: (a: Int, b: Int) -> Int = { a, b -> a * b } // 람다식 매개변수 자료형의 생략 val multi = { a: Int, b: Int -> a * b } // 선언 자료형 생략 fun main() { val result: Int // val multi: (Int, Int) -> Int = { a: Int, b: Int -> a * b } val multi: (a: Int, b: Int) -> Int = { a, b -> println("$a, $b")..

Kotlin 2023.12.23