반응형
class 생성 하기
클래스 내부에 정의한 변수 혹은 상수를 속성(property)라고 하며(자바의 필드) 함수는 메소드(method)라고 함
참고 )
package com.greedy.`class`
자바에서 class는 예약어여서 해당 네임으로 class를 만들 수 없지만, 코틀린에서는 ``백틱을 자동으로 붙여서 생성되어 예약어가 아닌 class 이름으로 인식할 수 있음
class Car {
/* 속성 정의 */
/* 현재 속도 */
var speed: Int = 0
/* 시동 걸려있는지 여부 */
var isOn: Boolean = true
/* 메소드 정의 */
/* 가속해서 속도 증가 */
fun accelerate(){
speed += 10
}
/* 감속해서 속도 감소 */
fun decelerate(){
speed -= 10
if(speed < 0) speed = 0
//10을 줄이는데 -까지 가지 않기위해서 0까지로 제한 줌
}
/* 시동을 켠다 */
fun turnOn(){
isOn = true
}
/* 시동을 끈다 */
fun turnOff(){
isOn = false
}
/* 현재 속도 확인용 출력 메소드 */
fun shewSpeed(){
println("current speed : $speed")
}
}
//클래스 범위를 벗어나서 메인 함수 만들어서 테스트 하기
fun main(){
//객체 생성
var c = Car()
c.turnOn()
println(c.isOn)
println(c.speed)
c.accelerate()
c.shewSpeed()
c.decelerate()
c.turnOff()
println(c.isOn)
}
출력 결과
true
0
current speed : 10
false
클래스 정의 방법
1. 생성자가 없는 클래스
class Person1{
/* 속성 초기화 */
var name: String = "홍길동"
var age: Int = 0
}
fun main(){
var p1 = Person1() //생성자가 없어도 객체 생성 가능
println("${p1.name}, ${p1.age}") //속성 값 확인
p1.name = "또치" //속성에 접근하여 값 변경 가능
p1.age = 20
println("${p1.name},${p1.age}살")
}
출력 결과
홍길동, 0
또치,20
2. 주 생성자가 포함 된 클래스
class Person2 (val name: String, var age: Int, val gender: String){
//매개변수로 전달 받은 값을 전역에서 사용할 수 있다.(전달 받자마자 속성으로 추가 된다)
fun test(){
println(name)
}
}
fun main(){
//객체를 생성하면서 초기값을 바로 전달한다
//var p2 = Person2(30,"짱구","남성") 사용x
// var p2 = Person2(age=30,name="짱구", gender="남성")
// 정의한 속성 순서대로 전달해야하지만 각 속성에 값을 대입하며 호출하는 경우에는 순서가 상관 없다.
var p2 = Person2("짱구",5,"남성")
println("${p2.name}, ${p2.age}, ${p2.gender}")
p2.test()
}
출력 결과
짱구, 5, 남성
짱구
3. 주 생성자를 통해서 값만 전달 받는 클래스
- 매개변수에 val, var 키워드가 생략 된다.
- 속성에 val, var를 생략하면 생성자에 선언 된 매개변수로 취급하게 된다.(속성으로 취급x)
- val와 var를 작성해야 속성으로 취급 된다.
class Person3(name: String, age: Int, gender: String){
// 값은 전달되지만, 속성 값이 되는 일은 일어나지 않는다. 전달 받은 값이지 속성은 아님
/* 속성 화 시키기*/
var name: String = name
var age: Int = age
var gender: String = gender
/* 속성에 대입할 값으로만 사용 될 수 있다.
속성을 주석처리하면 선언되지 않은 변수라는 커파일 에러가 발생한다.*/
fun test(){
println(name)
}
}
fun main(){
var p3 = Person3("희동이",5,"남성")
println("${p3.name}, ${p3.age}, ${p3.gender}")
p3.test()
}
출력 결과
희동이, 5, 남성
희동이
반응형
4. 주 생성자에 기본 값이 설정 된 클래스
class Person4(val gender: String, val name: String = "스폰지밥", var age: Int = 20){}
fun main(){
var p4 = Person4("여성")
println("${p4.name}, ${p4.age},${p4.gender}")
p4 = Person4("남성", age=100)
println("${p4.name}, ${p4.age},${p4.gender}")
}
출력 결과
스폰지밥, 20,여성
스폰지밥, 100,남성
init 블록을 이용해서 속성 값 초기화
init 블록은 주 생성자를 통한 속성 ㄱ밧 초기화 작업이 끝난 직후에 실행된다.
속성 값을 초기화 할 때 필요한 코드가 있다면 init 블록을 사용하면 된다.
class Overlap1(var originName: String, var originAge: Int, var originGender: String){
//가공할 공간이 없기 때문에 가공처리가 필요하면 init 블럭에 가공하면 된다.
var overName: String
var overAge: Int
var overGender: String
/* 주 생성자에서는 코드를 작성할 수 없으므로 주 생성자 호출 이후 바로 호출 되는 init 블록 내부에
전달 받은 원래 이름, 나이, 성별 정보를 덮어 씌울 수 있다.*/
init{
overName = originName.reversed()
overAge = originAge * 2
overGender = if(originGender == "남성") "여성" else "남성"
} //추가적인 초기화 작업, 전달받은 값을 over~ 에 초기화해라
}
fun main(){
var over1 = Overlap1("징징이",23,"남성")
println("${over1.overName}, ${over1.overAge}, ${over1.overGender}")
}
출력 결과
이징징, 46, 여성
주 생성자의 var 키워드를 생략하여 전달 된 원래 이름, 나이, 성별을 저장하는 속성이 생성되지 않도록 수정
class Overlap2(originName: String, originAge: Int, originGender: String){
var overName: String
var overAge: Int
var overGender: String
init{
overName = originName.reversed()
overAge = originAge * 2
overGender = if(originGender == "남성") "여성" else "남성"
}
}
fun main(){
var over2 = Overlap2("뚱이",16,"여성")
println("${over2.overName}, ${over2.overAge}, ${over2.overGender}")
}
출력 결과
이뚱, 32, 남성
속성 값 초기화 작업에 간단한 한 줄의 코드만 필요하다면 init 블록을 사용하지 않고 바로 대입 가능
class Overlap3(originName: String, originAge: Int, originGender: String){
var overName: String = originName.reversed()
var overAge: Int = originAge * 2
var overGender: String = if(originGender == "남성") "여성" else "남성"
}
fun main(){
var over3 = Overlap3("잠만보",30,"남성")
println("${over3.overName}, ${over3.overAge}, ${over3.overGender}")
}
출력 결과
보만잠, 60, 여성
반응형
'프로그래밍 > Kotlin' 카테고리의 다른 글
[코틀린 / Kotlin] open class, private , protected 속성 설정 (0) | 2022.10.20 |
---|---|
[코틀린 / Kotlin] 보조 생성자 활용하기 (0) | 2022.10.19 |
[코틀린 / Kotlin] 반복문(while문, do-while문, for문 , break, continue) (0) | 2022.10.19 |
[코틀린 / Kotlin] 조건문 (if 문, when case 문) (0) | 2022.10.19 |
[코틀린 / Kotlin] 연산자 (산술, 복합, 대입, 인덱스 연산자, in 연산자, .. 연산자 ) (0) | 2022.10.19 |