제너릭 클래스나 함수에서 사용하는 자료형을 외부에서 지정할 수 있는 기능을 말함 ex) Class A -> Class B(상속 받음) 이 두 클래스의 인스턴스를 공용으로 사용하는 하나의 함수에 패러미터로 받으러면? Class A(Super Class) A의 자료형으로 받으면 B를 넣어도 A로 캐스팅 됨, 따라서 두 클래스 모두 함수의 패러미터로 사용 가능함 fun castingExam(var a: A) But, 캐스팅 연산은 프로그램의 속도를 저하시킬 수 있다는 단점이 있다 -> 제너릭 등장 제너릭은 함수나 클래스를 선언 할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 패러미터를 받아 사용하는 방법입니다. 일반적으로 'Type'의 이니셜인 T를 사용 T -> U -> V 순으로 사용 fun m..
클래스의 다형성 음료수로 비유를 해보면 콜라를 콜라 자체로 볼 수도 있지만 기호에 따른 음료 라고 볼 수 도 있다. 콜라를 음료 특성으로 만드는 것이 다형성이라고 할 수 있다. //Cola의 기능까지 모두 사용 가능 //타입 추론으로 Cola 자료형은 생략 가능 var b: Cola = Cola() 업 캐스팅(Up-Casting) //Drink의 기능만 사용 //Up-Casting : 상위 자료형에 담는다 var a: Drink = Cola() 다운 캐스팅(Down-Casting) 업 캐스팅 된 것을 하위 자료형으로 변환 시키는 것 as 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자 var a: Drink = Cola() //이후로는 a는 cola로 작동, 반환도 가능 a as Cola var b ..
Observer(옵저버) 패턴 이벤트가 발생하는 것을 '감시' 하는 감시자의 역할을 만든다고 해서 옵저버라고 부름 안드로이드의 예라면 키의 입력 터치의 발생 데이터 수신 함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해서 발생하게 되는 동작들을 이벤트라고 한다. 이러한 이벤트가 발생할 때마다 '즉각적으로 처리' 할 수 있도록 만드는 프로그래밍 패턴을 '옵저버 패턴' 이라고 함 Observer(옵저버) 패턴을 구현하기 위해서는 두개의 클래스가 필요함 이벤트를 수신 이벤트의 발생 및 전달 두 클래스간의 통신하는 방법 : 인터페이스 'observer' 이용 코틀린에서는 listener 라고 함 -> 이렇게 이벤트를 넘겨주는 행위를 CallBack 이라고함 //class EventPrinter : 이벤트를..
Object 기존의 Class 객체는 단지 인스턴스 객체를 만들기 위한 '틀' 이기 때문에 내부에 있는 속성이나 함수를 사용하려면 var a = Person("박서준",1992) 와 같은 생성자를 통해 실제가 되는 인스턴스 객체를 만들어야 했었음 여러개의 인스턴스가 필요하지 않으며, 단하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는 코드에서는 굳이 Class를 쓸 필요 없이 Object 를 사용하면 된다. Singleton Pattern 싱글턴 패턴 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴 코틀린은 이 싱글턴 패턴을 언어차원에서 지원한다. fun main() { //참조 연산자 사용하지 않고 직접 쓴다 println(Counter.count) Counter.coun..
람다함수의 특별한 경우 람다함수도 여러 구문의 사용이 가능 val c: (String) -> Unit = { str -> println("$str 람다함수") } val c: (String) -> Unit = { str -> println("$str 람다함수") println("여러 구문을") println("사용 가능 합니다")} val calculate:(Int, Int) -> Int = {a,b -> println(a) println(b) //구문의 마지막 a+b을 Int 값으로 반환 a+b 파라미터가 없는 람다 함수 -> 실행할 구문들만 나열하면 됨 val a:() -> Unit = { println("패러미터가 없어요") } 패러미터가 하나 뿐이라면 it 사용 val c: (String) -> ..
고차함수 고차함수란 함수를 클래스에서 만들어낸 '인스턴스'처럼 취급 하는 방법 함수를 파라미터로 넘겨줄 수도 있고, '결과값'으로 반환 받을 수도 있는 방법 입니다. 코틀린에서는 모든 함수를 고차함수로 사용 가능 fun main() { //::일반함수를 고차함수로 변경해주는 연산자 b(::a) } fun a(str: String) { println("$str 함수 a") } //return 없는 경우 Unit fun b(function: (String) -> Unit) { function("b가 호출함") } 람다 함수 일반 함수와 달리 그 자체가 고차함수 별도의 연산자 없이도 변수에 담을 수 있다. fun main() { //람다 함수 //람다 함수는 그 자체가 고차함수이기 때문에 연산자 불 필요 va..
코틀린의 프로젝트 구조 내에서 변수나 함수, 클래스의 '공용범위' 를 제어하는 단위인 스코프와 스코프 외부에서 내부로 접근을 제어하는 접근 제한자에 대해서 설명 스코프 범위 언어 차원에서 변수나 함수, 클래스 같은 '멤버'들을 서로 공유하여 사용할 수 있는 범위를 지정해 둔 단위 패키지 내부, 클래스 내부, 함수 내부 등 스코프의 3가지 규칙 스코프 외부에서는 스코프 내부의 멤버를 '참조 연산자'로만 참조가 가능함 a.eat() com.google.example.A 동일 스코프 내에서는 멤버들을 '공유'할 수 있음 //패키지 명시하지 않으면 default pakage val a = "패키지 스코프" class B { fun print(){ println(a) } } fun main() { println(..
물리적 구조 프로젝트 코틀린으로 개발을 할때 관련된 모든것을 담는 하나의 큰 틀 모듈 하나의 프로젝트는 여러개의모듈로 이루어 진다(기능 단위) 직접만들기 라이브러리 모듈 붙이기 모듈안에는 다수의 파일이 들어갈 수 있음 코틀린 코드 파일 뿐만아니라 모듈과 관련된 설정 및 리소스 파일도 포함 될 수 있음 논리적 구조 패키지 개발시의 소스 코드의 '소속'을 지정하기 위한 논리적 단위 코드내에서 사용하는 이름이 용도의 내용이 충돌하지 않도록 패키지 이름을 짓는다 com.youtube.example com.youtube.example.base com.youtube.example.kotlin com.youtube.example.android package com.youtube.example fun main() { ..
오버라이딩 상속에서는 기본적으로 수퍼클래스와 같은 속성을 가진 서브클래스를 만들수 없다 fun a(v: Int) -> (x) fun a(v: Int) 하지만 슈퍼 클래스에서 '오버라이딩'이라는 형태로 허용한다면 같은 이름과 형태로 된 함수의 내용을 다시 구현할 수 있다. fun main() { var t = Tiger() t.eat() } open class Animal { //eat 함수를 오버라이드 하기 위해 open open fun eat() { println("음식을 먹습니다.") } } class Tiger : Animal() { //open 이 붙은 함수를 override override fun eat() { println("고기를 먹습니다.") } } 추상화 선언부만 있고 기능이 구현되지 않..
생성자 class Person(var name:String, val birth Year:Int) 새로운 인스턴스를 만들기 위해 호출하는 특수한 함수 -> 생성자를 호출하면 클래스의 인스턴스를 만들어 반환 받을 수 있다. 생성자의 역할 인스턴스의 속성을 초기화 인스턴스 생성시 구문을 수행 기본생성자 fun main() { var a = Person("박보영", 1990) var b = Person("김수미", 1997) var c = Person("정장수", 1994) } class Person(var name: String, val birthYear: Int) { init { println("${this.birthYear}년생 ${this.name}님이 생성되었습니다.") } } 보조생성자 여러 값 겹쳐..
클래스 '값'과 그 값을 사용하는 '기능' 들을 묶어놓은 것 구성은 고유의특징 값을 가진 속성 기능의 구현을 담당하는 함수 로 이루어져 있습니다. 인스턴스 우선 클래스는 인스턴스를 만드는 틀이라는 것을 이해 해야 한다 클래스를 이용해서 만들어내는 서로다른 속성의 객체를 지칭 같은 클래스로 여러 인스턴스를 만들어 사용하게 됨 fun main() { var a = Person("박보영",1900) var b = Person("전정국",1997) var c = Person("장원영",2004) //전체 감싼다, 문자로 오해 방지 //매번 쓰는건 비효율 -> 공통 기능 함수로 넣어준 println("안녕하세요, ${a.birthYear}년생 ${a.name}입니다.") a.introduce() b.introdu..
흐름 제어 키워드 return '함수를 종료' 값을 반환하는 역할 break 반복문 내의 구문이 실행되는 중간에 즉시 반복문을 '종료' 하고 다음 반복문으로 넘어감 continue 다음 반복 조건으로 즉시 넘어가는 역할(종료가 아니다) fun main() { for (i in 1..10) { if (i == 3) break print(i) } println() for (i in 1..10) { if (i == 3) continue print(i) } println() //label 달아주면 한번에 break 가능 //고전적 문법에서는 내부에서 break 걸려도 밖에서 계속 돈다 loop@ for (i in 1..10) { for (j in 1..10) { if (i == 1 && j == 2) break..