본문으로 바로가기

[Kotlin] Class(클래스) / Constructor(생성자)

category Android 2020. 3. 30. 11:05

Class 정의하기


1
2
3
4
5
6
7
8
9
10
//클래스 정의하기
class MyClass
 
//클래스 정의하기
class YourClass{
    //멤버 함수
     fun printInfo(){
        println("YourClass 의 메소드(함수) 호출됨")
    }
}
cs

2행 : 클래스 내에 선언된게 아무 것도 없으면 예약어와 클래스명만 작성해 주어도 된다.

5-10행 : 클래스 안에 정의할 것이 있는 경우 { }를 사용해서 클래스 영역을 설정해주고, 그 안에 필요한 내용을 작성해주면 된다.

 

 

생성자(Constructors)


[대표 생성자 (Primary Constructor)]

1
2
3
4
5
6
7
8
9
10
11
12
//대표(primary) 생성자는 클래스명 우측에 선언하고 생략가능하다.
class OurClass1 constructor(){ //1.대표(primary) 생성자는 클래스명 우측에 선언
 
}
 
class OurClass2(){ //2.대표(primary) 생성자 예약어 consturctor 예약어 생략 가능
 
}
 
class OurClass3{ //3. 인자로 전달 받을게 없으면 ()도 생략 가능
 
}
cs

2행 : 대표(primary) 생성자는 클래스명 우측에 선언

6행 : 대표(primary) 생성자 예약어 consturctor 예약어 생략 가능

10행 : 인자로 전달 받을게 없으면 ()도 생략 가능

 

-예시-

1
2
3
4
5
6
//생성자의 인자로 문자열을 전달 받는 생성자
class Car(name:String){ /***/}
 
fun main(){
    var c1=Car("samsung")
}
cs

 

 

[생성자 (Constructor)]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Car(name:String){
    //String type을 담을 수 있는 필드 선언
    var name:String
    //초기화 블럭(객체가 생성되는 시점에 무언가 작업할 수 있는 블럭)
    init {
        println("Car 클래스 init")
        //생성자의 인자로 전달 받은 문자열을 필드에 저장
        this.name=name;
    }
 
    //함수
    fun drive(){
        println("$name 이(가) 달려요")
    }
 
}
cs

4행 : init{ } 초기화 블럭 으로 객체가 생성되는 시점에 무엇인가 작업할 수 있는 블럭이다.

5행 : kotlin에서는 멤버변수의 값이 자동으로 초기화 되지 않는다. 따라서 반드시 변수 선언시 초기값을 설정해 주거나 init()블럭에서 초기값을 넣어 주어야한다

8행 : 생성자의 인자로 전달된 값은 클래스 내에서 참조 가능하다.

 

생성자의 인자로 var|val을 선언 하는 것 만으로 위의 긴코드를 짧게 해결할 수 있다.

아래를 살펴보자

 

1
2
3
4
5
6
7
8
9
10
11
class YourCar(var name: String){
    /*
    var name: String
    init {
        println("Car 클래스 init")
        //생성자의 인자로 전달 받은 문자열을 필드에 저장
        this.name=name;
    }
    */
 
}
cs

1행 : var 예약어를 생성자의 인자에 선언해 놓으면 알아서 멤버변수(필드)를 만들어주고, 전달된 값을 필드에 저장도 해준다. (var 로 선언하면 getter, setter가 모두 가능 | val로 선언하ㅏ면 getter만 가능)

 

 

[두번째 생성자 정의 하기]

  • primary 생성자는 클래스명 옆에 괄호를 붙이거나 생략해서 만들 수 있다.
  • 두번째 생성자를 정의하고 싶다면
    constructor 예약어를 사용하여 생성자를 정의하고,
    primary 생성자를 전달해준다.
  • 상속받은 클래스가 있다면 super라는 예약어를 사용하여 생성자를 만들어 주면된
    예)constructor(name:String):super(){}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class OurCar(){ //Primary 생성자
 
    //property(멤버 변수) 정의
    var name:String?=null
 
    //두번째 생성자 정의 하기
    constructor(name: String):this(){ //primary 생성자를 호출해야한다.
        //property(필드)에 값 대입하기
        this.name=name
    }
 
    fun drive(){
        println("$name 이(가) 달려요")
    }
}
cs

7-10행 : 두번째 생성자 정의시 primary 생성자를 호출 해야한다.

         또한 전달되는 인자에 var 예약어는 사용할 수 없다.

 

 

-결과-

1
2
3
4
5
6
7
fun main(){
    var c3=OurCar()
    var c4=OurCar("그렌저")
 
    c3.drive() //null 이(가) 달려요
    c4.drive() //그렌저 이(가) 달려요
}
cs