이진탐색(Binary Search)를 하기 위해서는 배열이 정렬되어 있어야한다. 이진탐색은 배열을 계속해서 반으로 쪼개나아가면서 탐색하는 알고리즘이다. 위와 같은 배열이 있을 때 '43'원소의 index를 찾고자 하는 경우 배열의 양 끝의 index를 left와 right로 두고 반복문을 시작한다. 이 경우 mid의 index는 (left + right) / 2 가 된다. mid에 해당하는 원소가 '43'이 아니므로 left를 (mid + 1)로 할당함으로써 기존 mid index를 포함한 왼쪽은 탐색하지 않는다. 그럼 위와 같이 left와 mid가 새롭게 할당된다. 새로운 mid에 해당하는 원소도 43이 아니므로 mid를 포함한 오른쪽은 탐색에서 제외하고 right를 (mid - 1)로 다시 할당해 준..
Java & Kotlin
기본형 데이터의 경우 간단하게 Arrays.sort() 와 같은 메서드로 정렬이 가능하다. 하지만 특정 객체의 경우 기본형 타입과는 다르게 정렬 기준을 정의해야 하는 경우가 있다. 이때 Java의 Comparable을 이용할 수 있다. Java의 Comparable은 interface이기 때문에 이를 상속받는 class에서는 Comparable interface에 있는 compareTo를 구현해야한다. 위 사진에서 보이듯 compareTo는 비교 결과에 따라 int를 반환한다. 들어온 객체가 자신보다 크면: 음수 리턴 들어온 객체와 자신이 같으면: 0 리턴 들어온 객체보다 자신이 크면: 양수 리턴 이를 이용하여 x, y 좌표를 입력 받고 x 기준으로 오름차순으로 정렬하고 x가 같다면 y 기준으로 오름차순..
선택정렬 해당 위치에 들어갈 원소를 결정한다. 위와 같은 배열을 오름차순으로 정렬하고자 할 때 i의 index를 0에 고정하고 j의 index를 1부터 끝까지 순회하면서 가장 작은 값을 index 0에 배치한다. 그 다음 i의 index를 1에 고정하고 j의 index를 2부터 끝까지 순회하면서 가장 작은 값을 index 1에 배치한다. 위 과정을 반복하게 되면 배열은 결국 오름차순으로 정렬이 된다. public class Main { public int[] solution(int[] input) { for (int i = 0; i < input.length - 1; i++) { int minIdx = i; for (int j = i + 1; j < input.length; j++) { if (input..
Java는 Oracle이든 Azul이든 어디서 다운받든 상관없지만 Java 설치하기 위해 여러 블로그를 찾아본 결과 Oracle 보다는 Azul이 더 좋다는 얘기를 주워들은 적이 있어서 Azul의 Java를 다운받았다. Java 다운로드하는 방법 Azul에서 제공하는 OpenJDK가 Zulu인데, 이는 2가지 방법으로 다운로드할 수 있다. Homebrew를 이용한 다운 공식 홈페이지에서 다운 공식 홈페이지를 통해서 Java를 다운받아보겠다. 1. 공식 홈페이지를 통해서 다운받기 공식 홈페이지에 들어가 보면 Java 버전부터 시작해서 OS, Architecture 별로 여러 가지를 다운받을 수 있다. Java 버전은 가장 최근도, 엄청 오래된 버전도 아닌, 중간 버전인 17 LTS 버전을 다운받았다. in..
클래스 상속 기본 규칙 슈퍼 클래스(부모, Base 클래스) 상속 시 슈퍼 클래스는 반드시 open class로 만들어야 한다. 단일 상속만 할 수 있다. Kotlin Class에 상속이 선언되어 있지 않다면 Any 클래스를 자동으로 상속받는다. private이 아닌 모든 속성과 함수를 상속받는다. 자식 클래스(sub, 하위 클래스)에서 함수나 속성을 재정의 시 override 키워드를 정의해야 하며 부모의 속성도 open 키워드를 사용해야한다. final 키워드 Kotlin은 기본적으로 final 이다. final class: 상속 불가 final 함수, 속성: override 불가 하위 클래스에서 override를 하면 자동으로 open 이 내장된다. final override는 하위 클래스들에 명시..
Delegates의 observable과 vetoable을 이용하여 속성 변경을 감지하고 변경될 때 동작해야하는 작업이 필요할 때 구현할 수 있다. 즉, observe 패턴을 쉽게 구현할 수 있다. Observable observable은 property를 observe 한다. 이를 이용하면 property의 값이 변경될 때마다 callback을 받을 수 있다. class PersonObservable(private val name: String) { var alias: String by Delegates.observable("First Alias", { _, oldValue, newValue -> println("$name 님의 Old 별명: $oldValue, New 별명: $newValue") })..
Property Delegate란? 코틀린의 특성 중 하나로 Property Delegate를 사용하면 Property의 접근자(getter, setter) 구현을 다른 객체에게 맡김으로써 기존 객체가 직접 작업을 수행하지 않고 객체를 위임받은 또 다른 객체가 해당 작업을 처리하게 된다. 이렇게 되면 반복적으로 사용되는 Property 행위를 추출해서 재사용함으로써 코드를 간결하게 만들 수 있다. 이를 구현하기 위해서는 객체에서 "by" 키워드를 이용해서 위임해주어야 한다. class Person { var name: String by PersonDelegate("null") val age: String by PersonDelegate("24") } class PersonDelegate(var value..
init을 이용한 초기화 - Kotlin은 속성을 선언하고 초기화 하지 않으면 기본적으로 Error이다. - init은 해당 class의 생성자를 호출하면 실행된다. class Person constructor() { // -> Default 생성자는 생략 가능 // 속성 선언 시 초기화를 진행하지 않을 시 Type을 반드시 선언해야한다. // lateinit 또는 delicate등을 이용 val name: String var age: Int val gender: Char init { name = "Hong GilDong" age = 32 gender = 'M' } } null 허용 타입으로 선언한 후 나중에 초기화 - null 허용으로 Type 선언 후 나중에 초기화 - 반드시 var Null 허용 타..
코틀린은 OOP Encapulation 되어 만들어진 State(Data, Field)에 접근할 수 있는 getter와 setter를 언어 기본 기능으로 지원한다. OOP에서 클래스는 캡슐화된 데이터를 메소드를 통해 제어 및 접근하는 것을 원칙으로 한다. Field에 접근하는 get/set(value)를 모두 포함해서 property라고 부른다. Property를 선언할 때 반드시 val 또는 var가 존재해야 한다. val: 읽기 전용(get) 속성만 갖는다. var: 읽기(get)와 쓰기(set) 속성을 갖는다. val, var로 선언된 property는 컴파일 시 private 접근지정자로 지정된다. Backing Field(뒷받침 필드) Kotlin에서는 Backing Field를 사용할 수 있는..
List, Set, Map은 데이터를 저장하는 기본 자료구조들을 한 곳에 모아 관리와 이용을 편하게 하기 위해 제공되는 프레임워크를 구성하고 있다. 이를 컬렉션이라고 하는데, Kotlin에서 컬렉션은 다른 프로그래밍 언어와 달리, 변경 가능한 컬렉션(Mutable)과 변경 불가능한 컬렉션(Immutable)이 있다. 1. List Kotlin의 List는 기본적으로 변경 불가능한, Immutable 한 방식이다. 생성자에 List의 길이와 초기화를 위한 람다식을 넣어주는 것으로 객체를 생성해 줄 수 있다. 변경 불가능한 Immutable List fun main(){ val list: List = List(5, {i -> i}) println(list) } // 실행 결과: [0, 1, 2, 3, 4] ..