val a1:Any = TestClass1()
val a2:Any = TestClass2()
class TestClass1
class TestClass2
class TestClass3(var a1:Int, var a2:Int){
// toString 메서드 구현
// toString : 객체를 문자열로 변환하는 의미의 메서드
// 객체의 주소값을 가지고 있는 변수를 출력하면 toString 메서드가 호출되고
// 여기서 반환하는 문자열을 출력해준다.
override fun toString(): String {
println("a1 : $a1")
println("a2 : $a2")
return "TestClass3을 통해 만든 객체입니다"
}
지연초기화. init 블럭이나 생성자에서 값을 저장하지 않고 메서드에서 값을 저장하는 경우 사용한다.
코틀린은 프로퍼티 정의 시 무조건 값을 지정해야한다.
코드를 수행시켜서 얻어진 값을 저장해야하는 경우, 아무 값이나 넣어둔 다음에 나중에 값 변경해줘야 하는 번거로움이 있다. 그럴 때 쓰는게 지연초기화이다.
한마디로 값을 추후에 지정하는 기능이다.
// Kotlin에서는 Property를 정의할 때 저장할 값을 무조건 지정해야한다.
var a1:Int = 100
var a2 = 200
// 아래처럼 정의할 경우 init이나 construtor 또는 lateinit을 통해
// 값을 지정하지 않으면 오류가 난다
var a3:Int
var a4:Int
var a5:String
// 2. main 적용
fun main(){
val t1 = TestClass1()
println("t1.a1 : ${t1.a1}")
println("t1.a2 : ${t1.a2}")
println("t1.a3 : ${t1.a3}")
println("t1.a4 : ${t1.a4}")
t1.testMethod1()
}
// 1. 테스트 클래스생성
class TestClass1{
var a1:Int = 100
var a2 = 200
var a3:Int
var a4:Int
// 생성자를 통해 설정
constructor(){
a4 = 400
}
// init 블록으로 설정
init{
a3 = 300
}
// lateinit 설정
lateinit var a5:String
fun testMethod1(){
a5 = "지연초기화 완료"
println("a5 : $a5")
}
}
객체 자기 자신을 가리킨다.
참고)
멤버 메서드: 클래스 내부에 직접 선언된 메서드. 클래스의 프로퍼티와 다른 멤버에 접근할 수 있다.
지역 메서드: 코틀린에선 메서드 내에 메서드를 생성할 수 있다. 지역 메서드는 특정 메서드 내에 선언된 메서드를 말한다. 메서드 밖에선 접근 불가.
부모 클래스를 가리킨다.
이름이 같은 경우
: 프로퍼티와 매개변수 이름 둘다 value1으로 같을 경우, 기본적으로 매개변수를 출력한다. 프로퍼티를 출력하고 싶다면 this를 붙여야 한다.
같은 클래스 내 다른 멤버메서드를 호출할 경우
: this를 붙여줘야한다.
// this : 객체 자기자신을 가리킨다.
// this.변수 : property를 지칭하는 용도로 사용한다.
// constructor() : this() = 다른 생성자를 호출하기 위해 사용한다.
// this.메서드() : 멤버 메서드와 지역 메서드를 구분하기 위해 사용한다.
fun main(){
// 예시1 출력
var t1 = TestClass1()
t1.testMethod1(10)
// 예시2 출력
t1.testMethod2()
// 예시3 출력
t1.testMethod3()
}
class TestClass1{
// 프로퍼티 value1 정의
var value1 = 100
// 매개변수 value1 정의
// 예시1. 프로퍼티와 매개변수 이름 둘다 value1으로 같을 경우
fun testMethod1(value1:Int){
// value1 호출 시 매개변수가 호출된다.
println("매개변수 value1 : $value1")
// 프로퍼티를 호출하고 싶다면 this 사용
println("프로퍼티 value1 : ${this.value1}")
}
// 예시2. 내부메서드
// 코틀린은 메서드 안에 메서드를 만들 수 있다.
// 내부메서드는 외부에서만 사용 가능하다.
fun testMethod2(){
fun innerMethod(){
println("innerMethod 호출")
}
innerMethod()
// 메서드 내부에 만든 메서드(innerMethod)가 호출된다
// 예시3. 만약 같은 클래스 내 다른 멤버메서드를 호출하고 싶다면 this 사용
this.testMethod3()
}
fun testMethod3(){
println("TestClass1의 testMethod3")
}
}
fun main(){
var t2 = TestClass2()
}
class TestClass2{
// this(): 다른 생성자를 호출한다.
// 만약 클래스에 주 생성자가 정의되어 있다면 무조건 주 생성자를 반드시 호출하도록 해야한다.
// 예시1. 다른 생성자 A 호출하기
// constructor() <- 괄호가 비어져있다. 매개변수 없음
constructor() : this(100){
println("매개 변수가 없는 생성자 호출")
}
// 호출할 다른 생성자 A
// constructor(a1:Int) <- 괄호안의 (a1:Int)가 매개변수이자 주생성자
constructor(a1:Int){
println("매개변수가 있는 생성자 호출")
println("a1 : $a1")
}
}
open class Parent {
open fun greet() {
println("Hello from Parent")
}
}
class Child : Parent() {
override fun greet() {
super.greet() // 부모 클래스의 메서드 호출
println("Hello from Child")
}
}
fun main() {
val child = Child()
child.greet()
}