Language (105) 썸네일형 리스트형 [Kotlin] 제너릭 클래스 A와 A를 상속받은 클래스 B가 있을 때, 이 두 클래스의 인스턴스를 공용으로 사용하는 하나의 함수에 파라미터로 받으려면? fun castingExam(var a: A) 수퍼클래스인 A의 자료형으로 받으면 B를 넣어도 A로 캐스팅 되어, 두 클래스 모두 함수의 파라미터로 사용할 수 있다. 하지만 캐스팅 연산을 거치는 것은 프로그램의 속도를 저하시킬 수 있다는 단점이 있다 → 제너릭을 사용하면 성능 높일 수 있다!! 제너릭: 클래스나 함수를 선언할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 파라미터를 받아 사용하는 방법 (클래스나 함수에서 사용하는 자료형을 외부에서 지정) 타입 파라미터의 이름은 클래스 이름과 규칙이 같지만 일반적으로 ‘Type’의 이니셜인 ‘T’를 사용하는 것이 관례이.. [Kotlin] 클래스의 다형성 Drink 클래스와 이를 상속받은 Cola 클래스가 있다면 Cola의 인스턴스를 만들 때는 Drink의 내용을 담는 공간에 Cola의 내용을 담는 공간이 추가되어 생성된다. var a: Drink = Cola() Drink를 담는 변수에 저장하면 Drink의 기능만 사용하게 된다. → Up-Casting : 상위 자료형인 수퍼클래스로 변환 var b: Cola = Cola() *타입추론 기능으로 Cola 자료형은 생략 가능 Cola를 담는 변수에 저장하면 Cola의 기능까지 모두 사용할 수 있다. Down-Casting: Up-Casting된 인스턴스를 다시 하위 자료형으로 변환 다운캐스팅은 별도의 연산자 필요 - as : 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자 var a: Drink = C.. [Kotlin] 익명객체와 옵저버 패턴 옵저버 : 이벤트가 일어나는 것을 감시하는 감시자 ex. 안드로이드 키의 입력, 터치의 발생, 데이터의 수신 등 함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해서 발생하게 되는 동작을 ‘이벤트’라고 부르며 이 이벤트가 발생할 때마다 즉각적으로 처리할 수 있도록 만드는 프로그래밍 패턴을 옵저버 패턴이라고 부른다. 옵저버 패턴을 구현할 때는 두 개의 클래스가 필요하다. 이벤트를 수신하는 클래스 (class A) 이벤트를 발생 및 전달하는 클래스 (class B) 어떻게 통신? B에서 이벤트가 발생할 때 A에 있는 이벤트를 처리하는 함수를 호출하여 알려준다. → 문제 : A의 필요에 따라 B의 인스턴스를 생성하여 사용하기 때문에 A는 B를 직접 참조할 수 있지만 B는 A를 참조할 방법이 없다. → 해결.. [Kotlin] 오브젝트 Object : 생성자 없이 객체를 직접 만들어 냄 기존에 배웠던 class는 단지 인스턴스 객체를 만들기 위한 틀이기 때문에 내부에 있는 속성이나 함수를 사용하려면 생성자를 통해 실체가 되는 인스턴스 객체를 만들어야 했다. 그러나 여러 개의 인스턴스 객체가 필요하지 않으며 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야하는 코드에서는 class를 쓸 필요 없이 Object를 사용하면 된다. (Singleton Pattern을 언어 차원에서 지원하는 것) fun main(){ println(Counter.count) // 0 Counter.countUp() Counter.countUp() println(Counter.count) // 2 Counter.clear() println(Counter.co.. [Kotlin] 스코프 함수 람다함수의 특별한 케이스 1. 람다함수도 여러 구문으로 사용 가능 val c: (String) -> Unit = { str -> println("$str 람다함수") println("여러 구문을") println("사용가능합니다") } 람다함수가 여러 줄이 되는 경우 마지막 구문의 결과값이 반환됨 val calculate: (Int, Int) -> Int = { a, b -> println(a) println(b) a + b // * a + b의 값을 Int로 반환함 } 2. 람다함수에 파라미터가 없다면? 중괄호 안에 실행할 구문만 나열 val a: () -> Unit = { println("패러미터가 없어요") } 3. 파라미터가 하나뿐이면 it 사용 val c: (String) -> Unit = { .. [Kotlin] 고차함수와 람다함수 고차함수 : 함수를 마치 클래스에서 만들어 낸 인스턴스처럼 취급하는 방법. 함수를 파라미터로 넘겨줄 수도 있고 결과값으로 반환받을 수도 있다. 코틀린에서는 모든 함수를 고차함수로 사용 가능하다. 함수의 형식은 (자료형, 자료형, …) → 자료형으로 나타낸다. 일반 함수를 고차 함수로 변경해주는 연산자 - 함수 이름 앞에 콜론 두 개 (::함수명) fun main(){ b(::a) // 출력: b가 호출한 함수 a } fun a(str: String){ println("$str 함수 a") } fun b(function: (String) -> Unit){ function("b가 호출한") } Unit: 값이 없다는 형식 패러미터로 넘길 함수를 굳이 이름까지 붙여 따로 만들 필요가 있을까? → 함수를 람다식.. [Kotlin] 스코프와 접근제한자 스코프 : 변수나 함수, 클래스 같은 멤버들을 서로 공유하여 사용할 수 있는 범위를 지정해 둔 단위 스코프가 지정되는 범위 - 패키지 내부, 클래스 내부, 함수 내부 등 하나의 패키지 안에 변수, 함수, 클래스가 있는데 함수, 클래스에 또 다른 변수, 함수가 있다면 패키지 스코프 안의 또 다른 하위 스코프로 동작하게 된다. 스코프의 세 가지 규칙 1. 스코프 외부에서는 스코프 내부의 멤버를 참조연산자로만 참조 가능하다. com.google.dimo.A → com.google.dimo 안에 있는 A라는 이름의 멤버 참조 2. 동일 스코프 내에서는 멤버들을 공유할 수도 있다. val a = "패키지 스코프" class B{ fun print(){ println(a) } } fun main(){ println.. [Kotlin] 기본 프로젝트 구조 물리적인 구조 프로젝트: 코틀린으로 어플리케이션을 짤 때 관련한 모든 내용을 담는 큰 틀 모듈: 하나의 프로젝트는 여러 모듈로 이루어질 수 있다. 이 모듈은 직접 만들 수도 있고 필요한 기능을 이미 구현해 둔 라이브러리 모듈을 가져와 붙일 수도 있기 때문에 편리한 기능 단위이다. 모듈은 폴더와 파일로 구성: 코틀린 코드 파일(.kr) 뿐만 아니라 모듈과 관련된 설정 및 리소스 파일 등도 포함될 수 있다. 논리적인 구조 패키지: 개발 시에 소속 코드의 소속을 지정하기 위한 논리적 단위 코드를 작성할 때는 코드 내에서 사용하는 이름이 용도에 따라 서로 충돌하지 않도록 고유한 패키지 이름을 지정하는 것이 좋다. * 일반적인 패키지 이름 짓는 법 개발한 회사가 가진 서비스 도메인을 거꾸로 배열하고, youtub.. 이전 1 2 3 4 5 6 ··· 14 다음