반응형
이 포스팅에서 작성하는 내용은 자바 개발자를 위한 코틀린 입문 에서 발췌하였습니다.
https://inf.run/BpYf
1. 클래스
- 클래스와 함께 선언되는 생성자를 주 생성자라고 한다. (주 생성자는 필수이며, constructor 생략 가능)
- 보조 생성자를 생성하는 경우엔, constructor 키워드와 함께 클래스 내부에 정의하면 된다.
- 생성자의 변수를 설정해주면서, 멤버 변수들을 정의할 수 있다.
- 멤버 변수만 있고, 내부 메서드가 없는 경우 아래처럼 중괄호 생략 가능
- 코틀린 / Java 상관없이 클래스의 getter, setter를 사용할 땐 .을 사용하면 된다.
- init : 생성자가 호출되는 시점에 호출되는 함수
- Custom Getter, Custom Setter를 사용할 수 있다.
fun main() {
val kotlinPerson = KotlinPerson("김멍목", 27)
// getter, setter 사용 시, .(점) 을 이용해서 접근 가능
println("이름 : " + kotlinPerson.name + ", 나이 (변경 전) : " + kotlinPerson.age)
kotlinPerson.age = 28
println("변경 후 : " + kotlinPerson.age)
val kotlinPerson2 = KotlinPerson("김멍목2") // 부생성자를 이용한 인스턴스 생성
}
// 생성자를 constructor(생략가능) 를 이용해서 바로 설정해줄 수 있다. (생성자의 변수를 설정해주면서, 멤버 변수들을 정의할 수 있다.)
// 클래스와 함께 선언되는 생성자를 주 생성자라고 한다.
class KotlinPerson constructor(
val name: String, // get() 을 사용하기 위해서, 아래에 정의
age: Int
) {
var age = age
// Custom Getter
get() {
// name을 호출하면, 호출하는 즉시 getter가 호출되므로 무한루프 발생
// 이런 경우를 대비해서, field라는 예약어로 사용
return field + 10 // getter 호출 시, 10을 더해서 반환
}
// Custom Setter
set(data) {
field = data;
println("age Setter : " + field)
}
// init : 생성자가 호출되는 시점에 호출되는 함수
init {
println(" == init == ")
if(age <= 0) {
throw IllegalArgumentException("나이는 1살 이상이어야 합니다.")
}
}
// 보조 생성자. consturctor 키워드를 이용해서 정의할 수 있으며, 객체를 생성할 떈 반드시 주생성자(this)를 이용해야 함
// 하지만, 코틀린에서는 부 생성자보단 Default Parameter, 정적 팩토리 메서드를 사용하는 것을 권장함
constructor(name: String) : this(name,1) {
println("부생성자 입니다.")
}
/** 성인인지 체크 **/
// 함수 형식
fun isAdult1() : Boolean {
return this.age >= 20
}
// 프로퍼티 형식
val isAdult2: Boolean
get() = this.age >= 20
/*
= get() {
return this.age >= 20
}
*/
}
// 멤버 변수만 있고, 내부 메서드가 없는 경우 아래처럼 중괄호 생략 가능
/*
{
// 변수 타입의 경우, 생성자를 이용해서 유추할 수 있기 때문에 생략 가능
// 생성자에서 아예 선언을 합쳐버림
val name = name
val age = age
}
*/
2. 상속
- Java, Kotlin 모두 추상클래스, 인터페이스를 인스턴스화 할 수 없다.
- 상위 클래스에서 하위 클래스가 override하고 있는 프로퍼티를 생성자, init 함수 내에서 사용하면 에러가 발생하니 유의해야한다. (하위 클래스가 init 중인데, 접근하려고 해서)
즉, 상위 클래스를 설계할 때 생성자, 초기화 블록에 사용되는 프로퍼티에는 open 을 피해야 한다. - 멤버 변수를 override하려면 open을 사용해야함(추상 변수의 경우, open을 안붙여줘도 가능)
default로, override 못하게 막혀있다. - 중복되는 인터페이스를 지정할 땐, super<타입>.함수 로 사용한다. (상위 클래스에 접근하는 키워드: super)
- 상속 받을 때, extends, implements 대신 : 사용
- :을 쓸 때, 타입을 쓰는 경우 변수명 앞에 띄어쓰기를 하지 않고, 상속을 받을 땐, 띄어쓰고 :을 쓴다.
- 코틀린에서 상속받을 때, 상위 클래스의 생성자를 반드시 호출해야 한다.
- Override를 할 땐, override라고 필수적으로 작성해야 한다.
abstract class Animal(
protected val species: String,
// 멤버 변수를 override하려면 open을 사용해야함(추상 변수의 경우, open을 안붙여줘도 가능)
protected open val legCount: Int){
abstract fun sound()
}
class Cat(
species: String // :을 쓸 때, 이처럼 타입을 쓰는 경우 변수명 앞에 띄어쓰기를 하지 않고
) : Animal(species, 4) { // 상속을 받을 땐, 띄어쓰고 :을 쓴다. (extends 대신 : 사용)
// 코틀린에서 상속받을 때, 상위 클래스의 생성자를 반드시 호출해야 함
// Override를 할 땐, override라고 필수적으로 작성해야 한다.
override fun sound() {
println("냐옹")
}
}
class Penguin(
species: String
) : Animal(species, 2), Swimmable, Walkable{
private val wingCount: Int = 2;
override fun sound() {
println("꿱꿱")
}
// val(final) 멤버 변수를 override하려면 open을 사용해야함
override val legCount: Int
get() = super.legCount + wingCount // 상위 클래스에 접근하는 키워드: super
// 중복되는 인터페이스를 지정할 땐, super<타입>.함수 로 사용한다.
override fun act() {
super<Swimmable>.act()
super<Walkable>.act()
}
override fun walk() {
println("펭귄 워킹")
}
}
interface Walkable {
fun act(){
println("걷는 중")
}
// 추상 메서드는 아래처럼 선언만 하면 된다.
fun walk()
}
3. 접근제어자
- Java의 접근제어자
public | 모든 곳에서 접근 가능 |
protected | 같은 패키지 or 하위 클래스에서만 접근 가능 |
default | 같은 패키지에서만 접근 가능 |
private | 같은 클래스에서만 접근 가능 |
- Kotlin의 접근제어자
public | 모든 곳에서 접근 가능 |
protected | 같은 클래스 or 하위 클래스에서만 접근 가능 |
internal | 같은 모듈에서만 접근 가능 |
private | 같은 클래스에서만 접근 가능 |
- Kotlin에서는 패키지를 namespace를 관리하기 위한 용도로만 사용한다.
즉, 접근 제어로서 사용하지 않는다. - Java의 기본 접근제어자 : default
Kotlin의 기본 접근제어자 : public - Internal은 바이트 코드에서 public이 되기 때문에 Java코드에서는 Kotlin 모듈의 internal 코드를 가져올 수 있다.
- Kotlin에서의 protected와 Java의 protected는 의미가 다르기 때문에, Java는 같은 패키지의 Kotlin protected에 접근할 수 있다.
- Kotlin 파일에서의 접근제어자
public | 어디서든 접근 가능(기본값) |
protected | 파일(최상단)에 사용 자체 불가(클래스 내부에서 사용 가능) |
internal | 같은 모듈에서만 접근 가능 |
private | 같은 파일에서만 접근 가능 |
반응형
'BE > Kotlin' 카테고리의 다른 글
[Kotlin] Lambda Expression (0) | 2023.03.10 |
---|---|
[Kotlin] Collection, 확장/중위함수 (0) | 2023.03.08 |
[Kotlin] object 키워드, 클래스 관련 (0) | 2023.03.07 |
[Kotlin] 조건문, 반복분, 예외처리 (0) | 2023.02.24 |
[Kotlin] 변수, 타입 사용 방법 (0) | 2023.02.22 |