목록분류 전체보기 (122)
기록
클래스나 함수에서 사용하는 자료형을 외부에서 지정할 수 있는 기능인 제너릭에 대해 알아보자. 클래스 A와 A 클래스를 상속바는 클래스 B가 있다고 해보자. 이 두 클래스의 인스턴스를 공용으로 사용하는 하나의 함수에 파라미터로 담으려면 어떻게 해야할까? fun castingExam(var a: A) 지난 강의에서 보았듯 수퍼클래스인 A의 자료형으로 받으면 B를 넣어도 A로 캐스팅 되어, 두 클래스 모두 함수의 파라미터로 사용할 수 있다. 하지만, 캐스팅 연산을 사용하는 것은 프로그램의 속도를 저하시킬 수 있다는 단점이 있다. 그래서 나온 것이 제너릭이라는 개념이다. 제너릭은 함수나 클래스를 선언할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 파라미터를 받아 사용하는 방법이다. 타입 파라미터에 특..
'클래스의 상속'을 통해 클래스를 '확장'하는 법을 배운 바 있다. 클래스를 다형성의 관점에서 살펴보면 어떨까? 목이 말라서 아무 음료나 마셔도 좋을 때도 있지만 기호에 맞춰 콜라, 커피 등 원하는 음료를 선택할 때도 있다. 이때 콜라를 콜라 자체로도 볼 수 있지만, 음료라는 특성으로도 볼 수 있도록 만드는 것이 다형성의 개념이다. 음료 클래스와 이를 상속받는 콜라 클래스가 있다면, 콜라 인스턴스를 만들 때는 상속관계의 수퍼 클래스인 음료의 내용을 담는 공간에 콜라의 내용을 담는 공간이 추가되어 생성된다. 이렇게 만들어진 콜라 인스턴스는 음료 자료형 변수에 저장하면 음료의 기능만 사용하게 되고, 콜라 자료형 변수에 저장하면 콜라의 기능까지 모두 사용할 수 있다. 이때 콜라 인스턴스를 음료 변수에 담는 행..
1. Object 기존에 배웠던 클래스는 단지 인스턴스 객체를 만들기 위한 '틀'이기 때문에, 내부에 있는 속성이나 함수를 사용하려면 실체가 되는 인스턴스 객체를 만들어야 했다. var a = Person("박보영", 1990) 여러개의 인스턴스가 필요하지 않고 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는 코드에서는 굳이 Class를 쓸 필요없이 object를 사용하면 된다. object는 생성자 없이 객체를 만들어내며, Singleton Pattern을 언어차원에서 지원하는 것이다. (Singleton Pattern : 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍처 패턴) object는 인스턴스를 생성하지 않고 그 자체로 객체이기 때문에 생성자는 사용하지 않는다. 별..
람다함수를 이용한 특별한 기능인 스코프 함수에 대해 알아보자. 1. 람다함수의 특별한 케이스 1. 람다함수도 일반 함수처럼 여러개의 구문을 사용할 수 있다. fun main() { var c = {str: String -> println("$str 람다함수") println("여러 구문을") println("사용 가능합니다") } var calculate = {a:Int ,b:Int -> println(a) println(b) a+b } } 람다함수가 여러 줄이 되는 경우, 마지막 줄의 결과값이 반환값이 된다. 2. 파라미터가 없는 람다함수는 실행할 구문들만 나열하면 된다. fun main() { val a:()->Unit = {println("파라미터가 없어요")} val b = {"파라미터가 없어요"..
1. 고차함수 함수를 마치 클래스에서 만들어낸 인스턴스처럼 취급하는 방법. 함수를 '파라미터'로 넘겨 줄 수도 있고, '결과값으로 반환'받을 수도 있는 방법이다. 코틀린에서는 모든 함수를 고차함수로 사용 가능하다. 함수의 형식을 자료형으로 나타내는 방법 (파라미터 자료형들) -> 반환형 고차함수 형태로 파라미터를 넘기는 방법은 함수 이름 앞에 콜론을 두개 붙인다. ::는 일반함수를 고차함수로 변경해주는 연산자이다. fun main() { b(::a) } fun a(str: String) { println("$str 함수 a") } fun b(function: (String)->Unit) { function("b가 호출한") } 2. 람다함수 파라미터로 넘길 함수를 굳이 이름까지 붙여 만들어줄 필요가 있을..
변수나 함수, 클래스의 '공용 범위'를 제어하는 단위인 스코프와, 스코프 외부에서 스코프 내부로의 접근을 제한하는 접근제한자에 대해 알아보자. 1. 스코프 변수나 함수, 클래스와 같은 멤버들을 서로 공유하여 사용할 수 있는 범위를 지정해 둔 단위 1. 스코프 외부에서는 스코프 내부의 멤버를 '참조연산자'로만 참조가 가능하다. (클래스의 멤버를 참조할 때 클래스 외부에서 a.eat() 과 같이 접근) 2. 동일 스코프 내에서는 멤버들을 공유할 수 있다. val a = "패키지 스코프" class B { fun print() { println(a) } } fun main() { println(a) B().print() } default pakage에서 만드는 모든 멤버들은 같은 패키지 스코프에 포함된다. 변..
1. 프로젝트 코틀린으로 어플리케이션을 짤 때 관련한 모든 내용을 담는 '큰 틀' 2. 모듈 하나의 프로젝트는 여러개의 모듈로 이뤄질 수 있다. 모듈은 직접 만들 수도 있고, 필요한 기능을 이미 구현해 둔 '라이브러리 모듈'을 가져와 붙일 수 있다. 3. 모듈 안 하나의 프로젝트는 여러개의 모듈로 이뤄질 수 있다. 모듈은 직접 만들 수도 있고, 필요한 기능을 이미 구현해 둔 '라 모듈 안에는 다수의 폴더와 파일이 들어갈 수 있다.코틀린 코드파일(.kt) 뿐만 아니라 모듈과 관련된 설정 및 리소스 파일 등도 포함될 수 있다. 4. 패키지 위의 프로젝트, 모듈, 폴더 및 파일이 실제 파일 시스템에 기반한 물리적인 구조를 담당한다면 논리적인 구조로는 패키지가 있다. 패키지는 개발시에 소스 코드의 '소속'을 지..
https://www.egeniq.com/blog/dagger-hilt-viewmodelclass-has-no-zero-argument-constructor-causes
The style on this component requires your app theme to be Theme.AppCompat parent를 다음과 같이 변경