Kotlin 문법 종합반 #3. 클래스와 상속

·2024년 6월 9일
0

Kotlin은 객체지향 언어로,
"클래스""객체"를 적극적으로 활용합니다


클래스와 객체

클래스는 일종의 "명부 양식" 템플릿입니다

템플릿을 활용해 클래스에 속한 객체,
"인스턴스" 를 생성할 수 있습니다

미리 정해둔 양식에 맞춰
객체의 정보(변수)를 관리하고,
객체에 명령(함수)를 작동시킬 수 있습니다


class 선언

classMate (name, gradeinfo, classinfo) 클래스를 선언합니다

  • 파라미터 안에서 변수를 선언했습니다
  • 이 때, 자료형 언급은 필수입니다
class classMate (var name:String, var gradeinfo:Int, var classinfo:Int){
    fun introduce() {
        println (" 저는 ${this.gradeinfo}학년 ${this.classinfo}반 ${this.name}입니다 ")
    }
}
  • 클래스 내 변수를 "속성" 이라고 부릅니다
  • 클래스 내 함수는 "메서드" 라고 부릅니다

instance 생성

fun main() {
    var 홍길동 = classMate("홍길동", 4,2)
    홍길동.introduce()
    println(" ${++홍길동.gradeinfo} 학년 진급 ! ")
}

var 홍길동 =

  • 변수를 선언하고, 클래스와 속성을 대입해줍니다

classMate ("홍길동", 4, 2)

  • classMate 클래스에 다음 (속성)의 인스턴스를 생성하는 명령입니다
    이제 "홍길동"은 인스턴스가 되었습니다

인스턴스.introduce()

  • 해당 인스턴스에 대하여, classMate 클래스 내의 메소드를 실행합니다.

init / constructor 생성자

init 생성자

class 클래스이름 (var num1:Int, var num2:Int){

	init {
    }
    
}
  • 파라미터를 통해 인스턴스가 생성되면, 다음 명령을 실행합니다

constructor 생성자

class 클래스이름 {
    var num1:Int = 0
    var num2:Int = 0

    constructor(num1:Int) {
        this.num1 = num1
    }

    constructor(num1:Int, num2:Int) {
        this.num1 = num1
        this.num2 = num2
    }

}
  • 파라미터 언급 갯수에 따라, 각기 다른 명령을 실행합니다
  • this.num1 = num1 과 같이, 변수에 파라미터를 대입해줘야 합니다

상속 : open class

open class 만들기

open class 상위 (num1 : Int) {

  var num1:Int = num1

}
  • 공통 특성을 가진 클래스는 open class 로 묶어서 관리할 수 있습니다

하위 class에서 open class를 상속하기

class 하위 (num1 : Int, num2 : Int) : 상위(num1) {

	var num2:Int = num2
    
}

: 상위클래스()

  • 마치 자료형처럼, 콜론 (:)과 함께 open class를 언급합니다
  • num1은 자동으로 open class에 대입됩니다. num2는 하위클래스에서 재정의됩니다

하위 class의 인스턴스 생성하기

var 인스턴스1 = 상위( 1 )
var 인스턴스2 = 하위( 1, 2 )

오버라이딩 : open fun - override fun

open fun

  • open class에서, open fun으로 오버라이딩 함수를 만듭니다
  • 하위 클래스에서 open fun을 개조해서 쓸 수 있습니다

override fun

  • 하위 class에서, override fun으로 open fun을 끌어옵니다
  • 같은 이름의 메소드를, 하위 class 내에서 새롭게 재정의합니다

    cmd+O

    override fun을 검색하는 단축키

인스턴스 . 메소드()

  • 인스턴스 이름과 함께 메소드를 사용하면,
    어떤 클래스에서 소속되어 있는 지에 따라, 서로 다른 override fun을 실행합니다

인터페이스

공통 속성을 가진 클래스를 복합적으로 관리할 때 사용합니다

open class가 중복 상속이 불가능한 "대분류"라면,
interface는 중복 구현되어도 되는 "해시태그"와 유사합니다

interface 선언

interface 인터페이스이름 {
	fun 빈메소드()
}
  • 인터페이스를 선언합니다. 파라미터가 없어도 됩니다.
  • 인터페이스는 메소드에 open을 붙이지 않아도 오버라이딩 할 수 있습니다.

interface 구현하기

class 하위 (num1 : Int, num2 : Int) : 상위(num1), 인터페이스이름 {

	var num2:Int = num2
    override fun 빈메소드() {
    }
    
}
  • 인터페이스만 구현할 때는 콜론 (:)으로 연결하고, open class 옆에 붙을 때는 콤마( , )로 연결합니다
  • 인터페이스 선언 당시 이름만 붙여둔 빈메소드를 오버라이딩해서 {코드}를 적어줍니다

접근제한자

펭돌이.age++
펭돌이.산책()

다른 문서에 있는 "프로퍼티"와 "메서드"를 언급했습니다

기본은 public

아무 것도 붙이지 않으면 public으로 처리됩니다
age와 산책()은 public var / fun 으로 선언된 변수/함수 입니다

어디서든 경로 ( 펭돌이. )를 붙이면 클래스 내부에 접근할 수 있습니다


접근제한자

이러한 접근을 제한하고 싶다면, 반드시 "접근제한자"를 붙여야 합니다

  • public : 오픈 ! 어디서나 접근 가능 !
  • private : 폐쇄 ! 클래스 밖에서 접근 금지 !
  • protected : 상속받은 "자식 클래스"에서만 사용 가능! 나머지는 접근 금지!
  • internal : 같은 모듈(폴더) 내에 있다면 접근 가능! 나머지는 접근 금지!

profile
디자이너의 개발 창업 도전기

0개의 댓글