인스턴스와 객체는 같은 개념이다. 둘 다 클래스의 구체적인 실체를 의미한다.
여기서 클래스의 실체는 클래스의 주생성자 혹은 메서드 등을 클래스에 내포된 모든 구성 요소를 의미한다. 주 생성자는 인스턴스를 생성할 때 초기화되는 주요한 역할을 하고, 클래스에 포함된 함수들은 인스턴스(객체)가 하는 일에 관련된 행동을 정의한다.
즉, 클래스라는 설계도를 바탕으로 메모리에 생성된 실체를 가리킬 때 "객체" 혹은 "인스턴스"라고 부른다.
✍🏻 인스턴스 예제
//Animal이라는 클래스를 정의
class Animal(val name: String) //인스턴스를 생성할 때 사용되면 초기화 매개변수
{
fun makeSound() //인스턴스가 하는 일을 나타낸다.
{
println("$name makes a sound")
}
}
//Animal 클래스를 사용해 인스턴스를 생성
fun main()
{
val dog = Animal("Dog")
val cat = Animal("Cat")
dog.makeSound() // "Dog makes a sound" 출력
}
val dog = Animal("Dog")
Animal 클래스의 인스턴스를 main에 생성하고, 이를 dog 변수에 할당한다.
Dog라는 문자열이 클래스의 주 생산자에 전달되어 객체가 생성된다.
생성된 객체는 dog 변수에 저장된다.
val animal = Animal()
여기서 주 생산자에 값을 전달하지 않고 클래스를 main에서 호출하여 변수에 저장하는 것도 객체.
abstract
키워드를 사용하여 정의된다.
✍🏻 추상 클래스와 추상 메서드 사용 예제
//Animal라는 추상 클래스를 만들고 파라미터를 문자열 name으로 지정
abstract class Animal(val name: String)
{
abstract fun makeSound() //추상 메서드
fun sleep() //구현된 메서드
{
println("$name is sleeping")
}
}
//Animal상속 받는 하위 클래스 Dog
class Dog(name: String) : Animal(name)
{
override fun makeSound() //상위 클래스에 있는 추상 메서드를 구현하기
{
println("$name says woof!")
}
}
fun main()
{
//Dog클래스의 객체생성 후 변수 dog 할당
val dog = Dog("Buddy")
//Dog클래스에 있는 makeSound()를 호출
dog.makeSound() // 출력: Buddy says woof!
dog.sleep() // 출력: Buddy is sleeping
}