Kotlin 기본[4] - 클래스와 객체, 인스턴스, 생성자

하동혁 ·2023년 3월 30일
1

Kotlin

목록 보기
4/10
post-thumbnail

▪️ OOP (Object Oriented Programming)

  • 절차적 프로그래밍의 한계를 극복하고자 나온 언어의 한 가지 방법론
  • 객체 간 상호작용으로서 표한하는 프로그래밍
  • 객체와의 관계를 표현하고 이를 통해 확장과 재사용이 용이

▪️ 자바, 코틀린에서는 OOP를 지원

객체지향 용어

  • 추상화(abstraction)
  • 인스턴스(instance)
  • 상속(inheritance)
  • 다형성(polymorphism)
  • 캡슐화(encapsulation)
  • 메시지 전송(message sending) 연관(association)

▪️ 객체지향 용어

  • 클래스(class)
    • 대상들을 분류하고 특징(속성)과 동작(함수)을 작성한 것
  • 추상화
    • 목표로 하는 것에 대해 필요한 만큼 속성과 동작을 정의하는 과정
  • 객체지향 개념의 동의어들
    • 코틀린에서 사용하는 용어 그 밖에 용어
      • 프로퍼티(Property), 속성(Attribute), 변수(Variable), 필드(Field), 데이터(Data)
      • 메서드(Method), 함수(Function), 동작(Operation), 행동(Behavior)
      • 객체(Object), 인스턴스(Instance)
    • 자바에서 사용하는 필드를 코들린에서 프로퍼티라 부른다.


클래스

▪️ 클래스 선언

class study{ 
 ....
 ....
}

▪️ 클래스와 객체

class Student { // 클래스의 정의
    // 프로퍼티들(속성)
    var name: String = "gil dong"
    var age: Int = 24

    // 메서드들(함수)
    fun name() = println("Student name: $name")
}

fun main(){
	val student = Student() // 객체 생성
    student.age = 26 // 값 할당
    println("student name: "${student.name}) // 객체의 맴버 프로퍼티 읽기
    student.name() // 객체의 맴버 메서드 사용
}

▪️ 인스턴스

  • student 클래스는 틀일 뿐이다. 실제 메모리에서 실행되고 있는 것이 아니다.
  • Heap 메로리에 올라간 객체를 인스턴스라 부른다.
  • java는 new 키워드를 통해 Object를 생성하지만, 코틀린은 별도의 키워드를 사용하지 않는다.


생성자

▪️ 생성자

  • 클래스를 통해 객체가 만들어질 때 기본적으로 호출되는 함수이다.
  • 객체 생성 시 필요한 값을 인자로 설정할 수 있다.
  • 생성자를 위해 특별한 함수인 constructor()를 정의할 수 있다.

▪️ 주 생성자(Primary Constructor)

class Student (var name:String, var age:Int){  // 주 생성자 

    fun name() = println("Student name / age: $name / $age")
    
}

fun main(){
	val student = Student("gil dong", 24) // 객체 생성
}

주 생성자 , 부 생성자 동시 선언 가능

▪️ 부 생성자(Secondary Constructor)

class Student (var name:String){ // 주 생성자

    var age:Int = 0

    constructor(name:String, age:Int) : this(name){  // 부 생성자
        this.age = age
    }

    fun name() = println("Student name / age: $name / $age")
}

fun main(){
    val student = Student("gil dong", 24) // 객체 생성
    student.name()
}

▪️ Local value를 선언 한 후 값 할당

class Student (_name:String){ // 주 생성자

    var name:String = _name
    var age:Int = 0

    constructor(_name:String, _age:Int) : this(_name){  // 부 생성자
        this.age = _age
    }

    fun name() = println("Student name / age: $name / $age")
}

fun main(){
    val student = Student("gil dong", 24) // 객체 생성
    student.name()
}

▪️ init block을 통한 초기화

class Student (_name:String){ 

    var name:String = ""
    var age:Int = 0

	init{
    	this.name = _name
        println("name: "+this.name)
    }
    constructor(_name:String, _age:Int) : this(_name){  // 부 생성자
        this.age = _age
    }

    fun name() = println("Student name / age: $name / $age")
}

fun main(){
    val student = Student("gil dong", 24) // 객체 생성
    student.name()
}

/*
init 호출
init name: gil dong
부 생성자 호출
Student name / age: gil dong / 24
 */

init{ }은 객체가 만들어질때 제일 먼저 호출된다.


▪️ default 값 설정

class Student (var name:String="hoon", var age:Int){  // 주 생성자

    fun name() = println("Student name / age: $name / $age")

}

fun main(){
    val student = Student(age=24) // 객체 생성
    student.name()
}

default 값 이외의 값은 "변수명=값" 형태로 입력

0개의 댓글