Kotlin

[Kotlin] 클래스와 생성자

조예_ 2023. 7. 19. 22:27

클래스 용어 정리

  정     의 예     시
클래스(Class) 객체를 만들기 위한 설계도 / 템플릿

같은 속성을 갖고 있지만 데이터 값이 다르다.
Person(){
메소드
}
객체(Object) 속성과 기능의 집합
(* 속성 : 멤버변수, 필드
  * 기능 : 메서드, 함수)

소프트웨어 세계가 구현할 대상

클래스의 추상적인 개념
사람의 속성, 역할에 대한 일반적인 개념

(* 속성 : 이름, 나이, 성별, 키 등
 * 기능 : 길을 걷는다, 인사를 한다 등)
인스턴스(Instance) 클래스를 기반으로 실제로 메모리에 할당된 객체를 의미

추상적인 개념을 실제로 구체화 한 것
val a = Person()
속성(property) 클래스 안의 변수  
메서드(method) 클래스 안의 함수  
생성자(construct) 객체를 만들 때 실행되는 함수  

* 참고

(클래스, 객체, 인스턴스에 대해 너무 잘 정리가 되어있어서 추천드립니다!)

https://whatisthenext.tistory.com/36

 

클래스의 구조

변수와 메서드의 구조로 생성된다.

Class 클래스이름(){
	정보1
    정보2
    
    행위1
    행위2
}

 

특별한 클래스 

  • 데이터 클래스 (data class)
    • 정보 프로퍼티만 갖고있는 클래스 필요 시 (데이터 관련) 사용
    • data class 클래스이름 (val name : String, val age : Int,)
  • 실드 클래스 (sealed class)
    • 클래스 상속과 관련된 개념
    • 자식클래스를 미리 정의할 수 있고, 무분별한 상속을 방지할 수 있음
    • 컴파일 시점에 생성할 수 있는 자식을 알 수 있기 때문에 효율적으로 다형성 구현
    • sealed class 부모클래스 { class 자식클래스1 : 부모클래스생성자}
  • 오브젝트 클래스 (object class)
    • 프로그램을 실행하는 동시에 인스턴스화 함

 

생성자

클래스를 통해 객체 생성 시 최초로 실행할 로직

메서드와 비슷해 보이지만 반환타입이 없어 메서드로 부르진 않음

//방법 1
class Person () {

}

//방법 2 : 생성자의 인자가 없을 경우 괄호 생략 가능
class Person{

}

-----------------------------------------

//생성자에 변수에 자료형을 선언해주면 클래스 내부 멤버변수로 저장됨

fun main (){
    val a = Person("홍길동")
    println(a.name)
}

class Person(val name : String){

}

// 출력값 - 홍길동

-----------------------------------------

// 아래 name은 매개변수로 받지만 Person클래스의 멤버변수로는 존재안함

fun main (){
    val a = Person("홍길동")
    println(a.name)
}

class Person( name : String){

}

// error - name은 멤버변수가 아니여서 호출되지 않음

-----------------------------------------

 

init 코드블럭

클래스가 인스턴스화 될 때 가장 먼저 실행

무조건 동작해야 하는 코드

fun main(){
	val a = Test1()
}

class Test1(){

	init{
    	//클래스 인스턴스화 될 때 가장 먼저 실행
    }
    
}

 

기본생성자

클래스 이름 오른쪽에 정의되는 생성자

매개변수는 멤버변수로 등록

class Test1 construct(val a :Int){
		//원래는 위와 같이 construct를 붙여야하지만 생략 가능하다
}

 

보조생성자

매개변수나 자료형을 달리하여 여러개 만들어서 사용 가능

 

fun main (){
    val a = Person("홍길동", 12)
}

class Person{

    constructor(){
        println("매개변수 없는 생성자")     //메인함수 생성자에 매개변수가 없는 값이 없어서 호출 안됨
    }

    constructor(name : String, age : Int){
        println("$name, $age")
    }
}

//출력값 - 홍길동, 12

 

응용 문제

fun main() {

    val test1 = Test1("홍길동")

    val test2 = Test1("홍길순",30,"010-1234-5678")

}

class Test1 (name : String) {
    var name1 : String
    var age1 : Int
    var phone1 : String

    init {
        println("initblock")
        this.name1 = name
        this.age1 = 100
        this.phone1 = "비밀"

        println(name1)
        println(age1)
        println(phone1)
    }

    constructor(name: String, age:Int, phone:String) : this(name) {
        println("constructor")
        this.name1 = name
        this.age1 = age
        this.phone1 = phone
        println(name)
        println(age)
        println(phone)
    }

}

//출력값 - initblock    // val test1 실행
	 홍길동               
	 100           
	 비밀                     
	 initblock    // val test2 실행
	 홍길순
	 100
	 비밀
	 constructor
	 홍길순
	 30
	 010-1234-5678
더보기

실행 순서 요약

 

 

객체, 인스턴스, 클래스 공부하던 중 개념이 안잡혀서 조금 시간이 걸렸다..

대부분 객체 == 인스턴스다 라는 글이 많아서 조금 개념 잡기는 힘들었지만 그래도 어느정도 정리가 된 것 같다!