-
kotlin 문법 정리 (2)kotlin 2023. 7. 8. 15:56반응형
오버리이딩과 추상화
부모 클래스가 있는 상속 받는 경우 같은 이름의 메소드등 재정의를 할수가 없다
하지만 코틀린에서는 부모 클래스에 open 키워드를 붙여주면 가능하다
또한 자식에서는 override 를 붙여주면 사용이 가능
fun main() { var t = Tiger() t.eat() } open class Animal { open fun eat() { println("음식을 먹다") } } class Tiger : Animal() //음식을 먹다
fun main() { var t = Tiger() t.eat() } open class Animal { fun eat() { println("음식을 먹다") } } class Tiger : Animal() { override fun eat() { println("고기를 먹습니다") } }
추상화
선엄부만 있고 기능이 없는것을 뜻함
추상 함수를 초함한 추상 클래스로 구현
추상 클래스 예제
fun main() { var r = Rabbit() r.eat() r.sniff() } abstract class Animal { abstract fun eat() fun sniff() { println("킁킁") } } class Rabbit :Animal() { override fun eat() { println("당근을 먹습니다"); } } //당근을 먹습니다 //킁킁
추상화를 하는 또 다른 방법
인터페이스
인터에이스는 송성, 추상 함수, 일반 함수 모두를 가질수 있음
※ 차이
추상함수 : 생성자를 가질수 있음
인터페이스 : 생성자를 만들수 없음
인터페이스 에서
구현부가 있는 함수 → open 함수
구현부가 없는 함수 → abstract 함수로 간
※ 두 인터 페이스를 상속 받으려면 클래스 선언뒤에 콜론 : 을 붙이고 쉼표 , 로 두인터페이스를 구분 해 표기해주면 됨
이러헥 되면 서브클래스에서 두 인터페이스를 상속받아 사용가능
fun main() { var d = Dog() d.run() d.eat() } interface Runner { fun run() } interface Eater { fun eat() { println("음식을 먹습니다") } } class Dog : Runner, Eater { override fun run() { println("우다다다 뜁니다") } override fun eat() { println("허겁 지겁 먹습니다") } }
※ 주의사항
여러가지 인터페이스나 클래스에서 같은 이름과 형태를 가진 함수를
구현하고 싶다면 서브 클래스에서 혼선이 일어나지 않도록 반드시 오버라이딩 하여 재구현 해주어야함
간단 정리
오버라이딩
이미 구현이 꿑난 함수에 서브 클레스에서 변경해야할떄
추상화
형식만 선언, 실제는 서브클래스에 위임
인터페이스
서로 다른 기능을 여러개 물려주어야 할떄 사용
코틀린 프로젝트 구조
코틀린은 자바와 달리 폴더 구조와 패키지 명을 일치 시키지 않아도 됨
상단 패키지만 명시해주면 컴파일러가 알아서 처리해줌
스코프와 접근 제한자
스코프 : 범위 라는 뜻
언어차원에서는 변나 함수클래스와 같은 클래스를 사용할수있게하는 단위
멤버들의 가용 범위를 지정한 단위로 개발자는 의도에 따라 스코프 안에 변수나 함수, 클래스를 배치 할수 있음
접근 제한자는 이러한 스코프에 외부와 내부에 사용할 맴버를 분리해 스코프
외부에서 건드리지 말아야할 기능이나 값들을 안전하게 제한하는 용도를 가지고 있음
접근제한자
패키지 스코프
public : 기본 값 어떤 패키지 에서도 접근 가능
internal : 같은 모듈 내에서만 접근 가능
private : 같은 파일 내에서만 접근 가
protected : 패키지 스코프에서는 사용하지 않음
클래스 스코프
public : 클래스 외부에서 늘 접근 가능
internal : 클래스 내부에서 사영하지 않
private : 클래스 내부에서만 접근 가능
protected : 클래스 자신과 산속 박은 클래스에서 접근 가능
고차함수와 람다함수
고차함수
함수를 마치 클래스에서 만들어내 인스턴스 처럼 취급함
함수를 파라미터로 넘겨줄수도 있음
fun main() { b(::a) // 고차함수로 보내려면 함수앞에 콜론 두개 붙여주가 } fun a (str: String) { println("$str 함수 a") } fun b(function: (String)-> Unit) { //Unit 자바 void 와 같음 function("b가 호출함") } //b가 호출함 함수 a
람다함수
그 자체가 고차함수임
fun main() { b(::a) // 고차함수로 보내려면 함수앞에 콜론 두개 붙여주가 val c: (String) ->Unit = {str -> println("$str 람다 함수")} b(c) } fun a (str: String) { println("$str 함수 a") } fun b(function: (String)-> Unit) { //Unit 자바 void 와 같음 function("b가 호출함") } //b가 호출함 함수 a // b가 호출함 람다 함수
람다 함수는 타입추론으로 좀더 축약해 기술할수 있음
반응형'kotlin' 카테고리의 다른 글
kotlin 문법 정리 (1) (2) 2023.06.17