본문 바로가기

Language/Kotlin

(30)
[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..
[Kotlin] 오버라이딩, 추상화, 인터페이스 오버라이딩 상속 시에는 기본적으로 수퍼클래스에 있는 함수와 같은 이름과 형태를 가진 함수는 서브클래스에서 만들 수 없다. 하지만 수퍼클래스에서 허용만 한다면(open 키워드 사용) 오버라이딩이라는 방법으로 서브클래스에서 같은 이름과 형태로 된 함수의 내용을 다시 구현(override 키워드 사용)할 수 있다. fun main(){ var t = Tiger() t.eat() // 고기를 먹습니다 } open class Animal{ open fun eat(){ println("음식을 먹습니다") } } class Tiger : Animal(){ override fun eat(){ println("고기를 먹습니다") } } 추상화 오버라이딩과 다르게 수퍼클래스에서는 함수의 구체적인 구현은 없고 단지 Anim..
[Kotlin] 클래스의 상속 상속이 필요한 이유 1. 이미 존재하는 클래스를 확장하여 새로운 속성이나 함수를 추가한 클래스를 만들어야 할 때 2. 여러 개의 클래스를 만들었는데 클래스들의 공통점을 뽑아 코드 관리를 편하게 할 때 수퍼 클래스: 속성과 함수를 물려줌 서브 클래스: 속성과 함수를 물려받음 open: 클래스가 상속될 수 있도록 클래스 선언 시 붙여주는 키워드 (코틀린은 상속 금지가 기본값) 상속의 규칙 서브 클래스는 수퍼 클래스에 존재하는 속성과 같은 이름의 속성을 가질 수 없다. → 클래스의 자체 속성으로 만들어주는 var을 붙이지 말고 일반 파라미터로 받아 수퍼 클래스의 생성자에 직접 넘겨준다. 서브 클래스가 생성될 때는 반드시 수퍼클래스의 생성자까지 호출되어야 한다. fun main(){ var a = Animal(..
[Kotlin] 클래스의 생성자 생성자: 새로운 인스턴스를 만들기 위해 호출하는 특수한 함수 생성자의 기능? 인스턴스의 속성을 초기화, 인스턴스 생성 시 구문을 수행(init 함수를 통해) 기본 생성자(init 함수) : 파라미터나 반환형이 없는 특수한 함수. 생성자를 통해 인스턴스가 만들어질 때 호출 fun main() { var a = Person("박보영", 1990) // 1990년생 박보영님이 생성되었습니다. var b = Person("전정국", 1997) // 1997년생 전정국님이 생성되었습니다. var c = Person("장원영", 2004) // 2004년생 장원영님이 생성되었습니다. } class Person (var name:String, var birthYear:Int) { init { println("${th..
[Kotlin] 클래스의 기본 구조 클래스 : 고유의 특징값인 속성 + 기능을 구현한 함수 class Person (var name:String, var birthYear:Int) // 클래스 속성 클래스는 인스턴스를 만드는 틀 인스턴스 : 클래스를 이용해서 만들어내는 서로 다른 속성의 객체 fun main(){ var a = Person("박보영", 1990) var b = Person("전정국", 1997) var c = Person("장원영", 2004) } class Person (var name:String, var birthYear:Int) 인스턴스를 담은 변수 사용 변수명.속성명 fun main(){ var a = Person("박보영", 1990) var b = Person("전정국", 1997) var c = Person(..