참조: 유튜브 디모의 코틀린
코드테스트사이트:play.kotlinlang.org
단축키(맥북):
맥북 스크린샷 바로 클립보드에 붙여넣기
-control+command+shift+3 or 4(3은 전체화면, 4는 마우스로 지정한 영역, 4일때 스페이스바 누르면 창캡처가능)
화면에 분할해놓은 창끼리 이동
-command+'
한 창에서 탭끼리 이동
-command+shift
//특별한 기능이나 형태를 가진 클래스들을 알아보자
//Data class
//:데이터 다루는 데에 최적화된 class, '5가지 기능'을 내부적으로 자동생성함
// 5가지
// -equals():내용의 동일성을 판단
// -hashCode():객체의 내용에서 고유한 코드를 생성
// -toString():포함된 속성을 보기쉽게 나타냄
// -copy():객체를 복사하여 똑같은 내용의 새 객체를 만듦
// *copy()함수 통해 새 객체 생성할 때는
// 아무패러미터가 없으면 똑같은 내용으로 생성함
// ex.val a=Data("A",7)
// val b=a.copy
// 패러미터가 있다면 해당 패러미터를 교체하여 생성함
// ex.val b=a.copy("B")
// -->b는 Data("B",7)로 생성됨
// -componentX():속성을 순서대로 반환함
// copy()함수의 예시에서
// "A"를 component1(), 7을 component2()같은 내용으로
// 속성의 내용을 반환함
//사실 사용자가 직접 호출하기 위한 함수가 아닌, 배열이나 리스트 등에
//데이터 클래스의 객체가 담겨있을 때,
// ex)listOf(Data("A",7),Data("B",1))
//이 내용을 자동으로 꺼내쓸 수 있는 기능을 지원하기 위한 함수들임
//일반 클래스와 데이터 클래스의 기능을 1:1로 비교해보자
fun main(){
val a=General("보영",212)
//일반클래스의 객체 하나 만들고
println(a==General("보영",212))//??이게몰깡 훔..
//equals()함수 있는지 테스트
//a와 똑같이 만든 객체와 내용이 동일한지 비교하여 출력
println(a.hashCode())
//해쉬코드() 함수값 출력해봄
println(a)
//toString 결과값 보기 위해 a 그대로 출력해봄
val b=Data("루다",306)
//데이터 클래스 객체 생성
println(b==Data("루다",306))
println(b.hashCode())
println(b)
println(b.copy())//copy()함수 사용
println(b.copy("아린"))//copy()함수로 속성 바꿔서 생성도 해봄
println(b.copy(id=618))
//named agrument를 통해 아이디만 바꿔서 출력해봄
}
class General(val name:String, val id:Int)
//일반 클래스 만들고 이름과 id 받음
data class Data(val name:String, val id:Int)
//데이터클래스 만들고 똑같이 이름과 아이디 받아봄
//실행결과 보면
//일반클래스로 만든 a는 equals()나 hashCode(),toString()
//함수의 결과가 제대로 구현되지 않은 반면
//data클래스로 만든 b는 세 함수 모두 의미있는 기능으로 자동 구현됨
//copy()함수 역시 원본을 복사한 새 객체를 쉽게 만들 수 있음
//componentX()계열 함수의 동작을 확인해보자
fun main(){
val list = listOf(Data("보영",212),
Data("루다",306),
Data("아린",618))
//데이터 클래스의 객체들이 담긴 list 작성
//이 리스트에 담긴 Data객체의 내용을 for문에서 모두 순회하려면 (?)
//두개의 속성을 받을 수 있는 이름(a,b)을 지정하여 in앞에 써주면 됨
for((a,b) in list)
{
println("${a}, ${b}")//아 a가 component1() b가 comopnent2()에 대응하나보다
}
//이렇게 하면 내부적으로 component1(),component(2)라는 함수 사용하여
//순서대로 값을 불러오게 됨
//실행해보면
//리스트에서 각각의 Data객체를 참조하여 속성을 모두 출력하였음을 알수있음
}
class General(val name:String, val id:Int)
//일반 클래스 만들고 이름과 id 받음
data class Data(val name:String, val id:Int)
//데이터클래스 만들고 똑같이 이름과 아이디 받아봄
//Enum class(이늄 클래스)
//enumerated type(열거형)의 준말로
//이늄 클래스 내에 상태를 구분하기 위한 객체들을 이름을 붙여
//여러개 생성해두고 그중 하나의 상태를 선택하여 나타내기 위한 클래스
//ex. enum class Color{
// RED,
// BLUE,
// GREEN
// *특이한 형태이지만 모두 enum class인 Color의 객체를
// 생성하기 위한 선언이다.
// }
//enum클래스 안의 객체들은 관행적으로 상수를 나타낼 때 사용하는
// '대문자로 기술'한다.
//또한, enum의 객체들은 고유한 속성을 가질 수 있다.
//enum의 생성자를 만들어 속성을 받도록 하면,
// 객체를 선언할때 속성(1,2,3처럼)도 설정할 수 있다.
//또, 일반 클래스처럼 함수도 추가할수있다.
//ex. enum class Color(val number:Int){
// RED(1),
// BLUE(2),
// GREEN(3); //세미콜론 추가하고 함수 기술할 수 있음
//
// fun isRed()=this==Color.RED
// }
fun main(){
var state = State.SING
//변수에 초기값으로 State.SING 넣어줌
//*enum은 선언시에 만든 객체를 이름으로 참조하여 그대로 사용하게 됨
println(state)//그대로 출력해보자
//-->SING으로 출력됨.
state = State.SLEEP
//변수의 값을 SING대신 SLEEP으로 바꿔줌
println(state.isSleeping())
//함수 수행해서 잠자는지 여부를 출력
//-->true라고 출력됨
state = State.EAT
println(state.message)
//한번더 변수값(?) 변경하고 메시지 출력하기
//-->"밥을 먹습니다"라고 출력됨
//enum변수를 그대로 출력할 때는
// toStrng()을 통해 '상태 객체의 이름'이 출력되고
//같은 객체끼리 비교했기 때문에 true가 반환되었으며
//EAT객체의 message속성에 담긴 "밥을 먹습니다"가 출력됨
}
enum class State(val message:String){
//enum클래스 만들고 String으로 속성 하나 받음
//이제 객체 나열해보자
SING("노래를 부릅니다"),//객체 만들고 message속성 넣음
EAT("밥을 먹습니다"),
SLEEP("잠을 잡니다");
fun isSleeping()=this==State.SLEEP
//잠을 자는지 여부를
//boolean값을 반환하는 함수인 isSleeping을 만들어보자
//이때, 비교할 대상은 State객체 자기자신이므로 'this'로
//해주어야함
}
//data class와 enum class는 일반클래스에서 제공되지 않는
//특정한 용도의 기능들을 제공하고 있으므로 여러가지 상황에서 유용하게 사용해보세요~
'코틀린 문법' 카테고리의 다른 글
19. 컬렉션함수(1) (0) | 2023.06.03 |
---|---|
18. Set과 Map (0) | 2023.05.31 |
16. 중첩클래스와 내부클래스 (0) | 2023.05.14 |
15. 함수의 argument를 다루는 방법과 infix 함수 (0) | 2023.05.14 |
14. null값을 처리하는 방법, 동일한지 확인하는 방법 (0) | 2023.05.14 |