코틀린 객체 지향 프로그래밍

hyeon·2022년 9월 17일
0

코틀린 스터디

목록 보기
2/5

클래스와 객체

생성자

~ 자바와 다른부분만 기록

초기화 블록을 가진 주생성자

주생성자는 따로 있는게 아니고 클래스 네임 뒤에 있는 매개변수를 포함해서 적는다. contructor 키워드는 생략가능하다.

class Bird constructor (var name:String){
	...
}

생성자에도 변수 초기화 외에도 코드를 실행할 수 있다. 단 init {} 블록을 클래스 선언부에 넣어줘야한다.

상속과 클래스 계층

클래스가 상속 할 수 있는 상태가 되려면 open 키워드와 함께 선언되어야함. 코틀린에서 open 키워드 없이 기본으로 클래스를 선언하면 상속할 수 없는 기본클래스(최종클래스)가 된다.

클래스를 상속받을 때는 class 파생클래스 이름 : 기반 클래스 이름(){} 이런식으로 적어준다. 콜론 사이는 띄어주는것이 관례이다.

클래스를 오버라이딩 할때에도 메서드에는 open을 적어줘야 하며 오버라이딩하는 파생클래스의 메서드에는 override 키워드를 적어줘야한다. (프로퍼티 오버라이딩 시에도 마찬가지) 오버라이딩을 막기위해서는 final을 붙인다.

이너클래스에서 이너 클래스의 바깥클래스의 상위클래스를 호출하려면 super 키워드와 함께 @ 기호 옆에 바깥 클래스 이름을 작성한다.
super@바깥클래스.메서드이름()

코틀린도 자바처럼 다중상속이 안되지만 인터페이스는 여러개 지정할 수 있다. 이때 인터페이스의 프로퍼티나 메서드 이름이 중복될경우 이를 구분하기위해 super<A>.f() super <B>.f() 이렇게 <>를 사용하여 명시해준다.

가시성 지시자

자바와는 다르게 internal이 있다. 모듈이 다르면 접근할 수 없다.

프로퍼티

  • 프로퍼티와 필드의 차이점
    자바는 클래스안에 선언한 변수를 필드라고 부르는데 이와 차이점은 자바는 getter나 setter같은 접근 메서드를 만들어야하지만 코틀린에서는 접근 메서드가 자동 생성된다.
    user.name 이라고 적어주면 자동으로 코틀린 내부의 게터 메서드를 통해 접근한다.

  • 프로퍼터 지연 초기화 하기

  1. lateinit 키워드를 사용한다. var 로 선언된 프로퍼티만 가능하고 프로퍼티에 대한 게터와 세터를 사용할 수 없다는 제한이있다.
    변수앞에 lateinit을 붙인다. lateinit var name: String
    해당 프로퍼티가 포함된 객체가 생성되어도 해당 변수는 초기화되지 않고 이후 초기화를 해준 시점에서 지연 초기화 된다. 아무 초기화도 하지않으면 오류를 얻게된다.
    객체도 지연 초기화 가능하다.

    이게 뭔소린지 잘 모르겠다.

  2. lazy를 사용한 지연 초기화
    읽기 전용인 val로 선언한 객체나 프로퍼티를 나중에 초기화하기위해 lazy를 사용한다.

 - 호출 시점에 by lazy {} 정의에 의해 블록 부분의 초기화를 진행한다.
- val에서만 사용가능하다. => 값을 다시 변경할 수 없다.

val subject by lazy{
	println("lazy initialized")
    "Kotlin Programming" //	 lazy 초기화 반환값
}
// $subject로 최초로 접근될때 초기화됨
  • by를 이용한 위임
    프로퍼티 위임 : 프로퍼티의 게터와 세터를 특정 객체에게 위임하고 그 객체가 값을 읽거나 쓸 때 수행하도록 만드는 것을 말함.
< val |var|class> 프로퍼티 혹은 클래스 이름 : 자료형 by 위임자
interface Animal {
	fun eat() {...}
}
class Cat :Animal{}
val cat=Cat()
class Robot : Animal by cat 	//Animal의 정의된 Cat의 모든 멤버를 Robot에 위임

<위임을 사용하는이유>

이해가 안감

정적 변수와 컴패니언 객체

정적 변수(static)와 컴패니언 객체를 사용하면 동적으로 메모리가 할당되는 것이 아닌 메모리로 객체 생성 없이 사용할 수 있다.

companion object{
	var language: String ="Korean"
    fun work() {
    	println("working")
    }
}

language 와 work()를 객체 생성 없이 실행할 수 있다. 컴패니언 객체는 실제 객체의 싱글톤으로 정의 된다.

자바에서 코틀린의 컴패니언 객체를 사용하려면 코틀린 클래스에서 해당 메서드에 @JVMStatic 어노테이션을 사용해야하고 프로퍼티를 사용할 때에는 @JVMField 어노테이션을 사용한다.
어노테이션 사용하지 않을 경우 KCutstomer.Companion.login(); 컴패니언을 포함해 접근해야한다.
코틀린에서 자바의 static에 접근하려면 클래스이름.메서드

다양한 클래스와 인터페이스

코틀린은 게터 세터 tostring equals 메서드를 만들 필요없이 내부적으로 자동 생성된다.

자동 생성되는 메서드
• 프로퍼티를 위한 게터/세터
• 비교를 위한 equals()와 키 사용을 위한 hashCode()
• 프로퍼티를 문자열로 변환해 순서대로 보여주는 toString()
• 객체 복사를 위한 copy()
• 프로퍼티에상응하는 component1( ), component2( ) 등

profile
남기고 싶은 개발자입니다 :>

0개의 댓글