1. 생성자
: 클래스를 실체화할 때 최초로 실행할 로직 작성
(인스턴스를 만드는 과정st... 붕어빵 틀을 가지고 붕어빵 찍어내는)
1) 기본 생성자
: 클래스 이름 옆에 생성자를 위한 인자를 입력받아 초기화 (함수와 유사)
class 클래스이름1(temp:String){
var myTemp = temp
}
fun main(){
val ex1 = 클래스이름1("가")
}
2) 명시적 생성자
(1) 주 생성자 Init
: { } 초기화 블록 사용하면 객체 실행과 함께 자동실행됨
- 한 가지의 형태로 클래스를 실체화할 때
- 클래스 선언부에 생성자를 명시함
- 매개변수를 직접 넘기지 않음
@@@ 클래스 이름옆 ()에 적는 순서대로 필드의 변수가 채워지는거 맞나?? ->> 이건 다른거... 코드 정리하기
// 클래스 선언부에 생성자를 명시함
class Character(_name:String, _hairColor:String, _height:Double) {
//_ 는 매개변수임을 나타내기 위한 표시. this.처럼 구별하는 도구
var name:String = ""
var hairColor:String = ""
var height:Double = 0.0
// 매개변수를 직접 넘기지않음
init {
println("매개변수없는 생성자 실행 완료!")
}
fun fireBall() {
println("파이어볼!")
}
fun compositing(device1:String, device2:String): String {
var device3 = device1 + device2
println("새로운 무기인 ${device3}입니다")
return device3
}
}
class 클래스이름2(_temp:String){
var myTemp:String
init{
myTemp = _temp
}
}
fun main(){
val ex2 = 클래스이름2("나")
}
class Birt(var name:String, var wing:Int, var color:String){
//매개변수 안에 var을 사용, 선언됨!!
fun fly() = println("$wing")
}
fun main(){
val sparrow = Birt("mySparrow", 2, "red")
sparrow.color = "blue"
println("${sparrow.color}")
sparrow.fly()
}
(2) 부 생성자 Constructor //java랑 헷갈림... 개념 비교하기..
(+) 입력 인자 따라 여러개 만들 수 있음
class 클래스이름3 { //클래스 이름 옆이 아님!!
var myTemp : String
constructor(_temp:String){
myTemp = _temp
}
}
fun main(){
var ex3 = 클래스이름3("다")
}
2. 객체
: 클래스 타입으로 실체화된, 선언된 것들. 모든 인스턴스를 포함
- 클래스를 실체화해 메모리에 적재
- 정보, 행위가 그대로 로딩되는 게 아님. 위치정보를 메모리에 로딩함
- 객체의 위치정보를 변수에 저장한 뒤, 참조함
open class Person{
constructor(firstName: String){
println("[Person] firstname: $firstName")
}
constructor(firstName: String, age: Int){ //5번째
println("[Person] firstName: $firstName, $age") //6번째
}
}
class Developer : Person{
constructor(firstName: String) : this(firstName, 10){ //1번째 : 2번째
println("[Developer] $firstName") //8번째
}
constructor(firstName: String, age: Int) : super(firstName, age){ //3번째 : 4번째
println("[Developer] $firstName, $age") //7번째
}
}
fun main(){
val choi = Developer("Choi") // 9번째 = 0번째
}
//[Person] firstName: Choi, 10
//[Developer] Choi, 10
//[Developer] Choi
//만약 주생성자가 있다면 this()
class Person(firstName: String, out: Unit = println("[Primary Constructor] Parameter")) {
val fName = println("[Property] Person fName: $firstName") //프로퍼티에 출력문 할당
init{
println("[init] Person init block")
}
//그럼, 여기서 철이, 20이 firstName, age에는 들어와 있는건가?@@ 이 값을 변경하질 못하니까 변경하려면 변수를 받아서 쓰는거...?
constructor(firstName: String, age: Int, out: Unit = println("[Secondary Constructor] Parameter")): this(firstName){
println("[Secondary Constructor] Body: $firstName, $age")
}
}
fun main(){
val p1 = Person("철이", 20)
println()
val p2 = Person("미애")
}
//[Secondary Constructor] Parameter
//[Primary Constructor] Parameter
//[Property] Person fName: 철이
//[init] Person init block
//[Secondary Constructor] Body: 철이, 20
//[Primary Constructor] Parameter
//[Property] Person fName: 미애
//[init] Person init block
//out은 키워드 인자. 인자에 접근할 때, 기본값으로 설정된 println()이 동작하게 됨
* 익명 객체
interface Switcher{
fun on(): String
}
class Smartphone(val model: String){
fun powerOn(): String{
class Led(Val color: String){
fun blink(): Stirng = "Blinking $color on $model"
}
val powerStatus = Led("Red")
val powerSwitch = object : Switcher{ //익명 객체를 사용해 switcher의 on() 구현
override fun on(): String{
return powerStatus.blink()
}
}//익명(object)객체 블록의 끝
}
}
- 인터페이스의 메소드 구현을 익명 객체 안에서 해도 됨 (밖에 따로 만든 걸 받아와도 ㄱㅊ)
'언어 > Kotlin' 카테고리의 다른 글
[Kotlin 문법 종합] - 오버라이딩, 오버로딩 # 수정하기 (0) | 2024.03.05 |
---|---|
[Kotlin 문법 종합] - 상속 (0) | 2024.03.05 |
[Kotlin 문법 종합] - 메소드, 클래스 (0) | 2024.03.05 |
[Kotlin 문법 종합] - 조건식, 반복문 (0) | 2024.03.05 |
[Kotlin 문법 종합] - 변수와 상수, 연산자 (0) | 2024.03.05 |