[Kotlin] 객체지향 프로그래밍

Leechaeyeon·2023년 5월 20일
post-thumbnail

객체지향 프로그래밍이란?

  • 프로그램에서 사용되는 여러 데이터나 기능을 객체로 묶어서 관리하는 프로그래밍 기법
  • 객체 : 매개체 하나에 대한 정보와 기능을 담고 있는 프로그램 요소

객체의 특징

  • 매개체 하나의 정보를 관리하기 위해서 객체 하나가 필요하며 관리하고자하는 매개체의 수만큼 객체를 생성해야한다.
    • 여기서 매개체는 학생을 의미한다고 생각하면 편하다.
  • 객체는 독립적으로 관리되며 서로에 대해서 관여하지 않는다!

클래스

  • Kotlin에서 객체는 자바와 동일하게 클래스를 설계하고 이를 통해 생성한다.
  • 클래스에서 정의한 변수와 메서드(함수)의 구조대로 객체가 생성되며 같은 형태의 객체가 필요하다면 같은 클래스로 객체들을 생성하면된다.

사용방법

// 클래스를 이용해 객체 생성 
class 클래스이름 {
} 
// 클래스에 내용이 없다면 {} 생략가능 
class 클래스이름1

// main안에서 클래스를 이용해 객체를 생성한다. 
fun main(){
		val 객체이름:클래스이름 = 클래스이름() 

		// 참조변수 선언시 클래스 타입 생략 가능 
		val 객체이름2 = 클래스이름() 
		
		
} 

기본 타입 : 실제 값을 변수에 저장
참조 타입 : 메모리의 주소값을 변수안에 저장


  • 객체 생성
val 객체 이름 

예제 )

fun main(){
    val student = Student()
    student.printInfo()
    student.score()

}

class Student{
    var grade = 2
    var classroom = 4
    var name = "이채연"
    var korean = 100
    var english = 10
    var math = 50
    fun printInfo(){
        println("저는 $grade 학년 $classroom $name 입니다.")
    }
    fun score(){
        println("""
            국어 점수 : $korean 
            영어 점수 : $english
            수학 점수 : $math
        """.trimIndent())
    }
}

출력결과

생성자

  • 클래스를 통해 객체를 생성할 때 자동으로 수행될 코드를 작성하는 곳
  • 메서드와 다른 점 → 반환 타입이 없음 ⇒ 메서드라고 부르지 않음
  • 생성자의 역할은 클래스가 가지고 있는 변수의 값을 초기화하는데 주로 이용

init 코드 블록

  • Kotlin은 클래스에 init 코드 블록을 만들어주면 객체 생성시 자동으로 처리되는 코드를 만들 수 있다.
  • init코드 블럭의 코드는 Java파일로 변환될 때 모든 생성자의 가장 위에 코드가 삽입된다. ⇒ 따라서 init 블럭의 코드가 먼저 수행되고 선택된 생성자가 수행된다.
class 클래스{
    init{
        println("객체가 생성되면 자동으로 동작하는 부분입니다")
    }
}

생성자 Constructor

  • constructor 를 이용하여 생성자를 정의
  • 생성자는 매개변수의 개수나 자료형을 달리하여 여러 개를 만들 수 있다. → 생성자를 통해서 오버로딩

오버로딩 : 한 클래스 내에 이미 사용하고 있는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.

class 클래스이름 { 
	constructor(){ 
		
	}
	constructor(변수:기본자료형, 변수2:기본자료형){
			
	}

}
  • 생성자
    class TestClass3{
    
        var a1 = 0
        var a2 = 0
    
        constructor(a1:Int, a2:Int){
            this.a1 = a1
            this.a2 = a2
        }
    }
    위의 코드와 아래는 같은 코드
    class TestClass3 constructor(var a1:Int, var a2:Int)

기본 생성자

  • 클래스를 정의할 때 클래스 이름 우측에 정의하는 생성자
  • 기본 생성자의 매개변수는 멤버 변수로 자동등록된다.
class 클래스이름 constructor(var 변수:기본자료형, var 변수2:기본자료형){

}

예시

import javax.security.auth.Subject

fun main() {
    var student = Student()
    var students = Student(1,2)
    // school에서 매개변수가 없으면 오류!
    // 없는 상황을 정의하지 않았기 때문에 오류가 난다.
    // var school = School()

    val school = School("서울특별시","마포구")

    school.printInfo()
    val subject = Subject(0,0)
    subject.printScore()
    val subject2 = Subject(20)
    subject2.printScore()
}

class Student{
    init {
        println("학생 정보 생성했습니다.")
    }
    constructor(){

    }
    constructor(grade:Int, classroom:Int){
        println("$grade 학년 $classroom 반")
    }
}

class School constructor(var city:String, var county :String){
    fun printInfo(){
        println("$city $county")
    }
}

class Subject (var english:Int, var korean:Int ){
    var math = 0

    init{
        println("init 블럭 코드 입니다.")
    }
    // 추가적인 생성자를 정의할 때는
    // 클래스 이름 옆에 정의한 생성자를 반드시    호출해야 한다.
    constructor() : this(100, 100)

    constructor(english:Int) : this(english, 100){
        println("매개 변수가 있는 생성자 호출")
    }

    fun printScore(){
        println("국어점수 : $korean")
        println("영어점수 : $english")
        println("수학점수 : $math")
    }
}

0개의 댓글