본문 바로가기

TIL

[TIL] 20230808 5일차

[오늘 배운 내용]

-1- Data Class

  • 데이터 클래스는 이름처럼 데이터를 저장하는 것을 목적으로 하는 클래스이다.
  • 데이터 클래스는 abstract, open, sealed, inner 일 수 없다.
  • 데이터 클래스 생성 방법은 기존에 생성하던 class 앞에 data 를 입력해주고, 데이터 클래스 이름을 설정한 뒤 반드시 1개 이상의 변수 또는 상수의 객체를 생성해 주어야 한다.
data class Liqueur(
    var name : String,
    var size : Int
)

왜 데이터 클래스를 이용할까??

  • 데이터 클래스로 정의하면 .toString , .equals, hashCode(), copy(), componentN() 함수를 자동으로 생성해준다.
    • 이 부분에서 .toString 부분은 쉽게 자동으로 String으로 변환해주는 구나 했지만 나머지 함수들은 익숙하지가 않아서 더 찾아보았다.
  • toString
// toString X
class ToStringLiqueur1(
    var name: String,
    var size: Int
)
// toString O
class ToStringLiqueur2( var name: String, var size: Int) {
    override fun toString(): String {
        return "Liqueur($name, ${size}ml)"
    }
}
// data class 자동 toString
data class ToStringLiqueur3(
    var name: String,
    var size: Int
)

fun main() {
    val toStringLiqueur1 = ToStringLiqueur1("jager", 350)
    val toStringLiqueur2 = ToStringLiqueur2("jager", 350)
    val toStringLiqueur3 = ToStringLiqueur3("jager", 350)

    println(toStringLiqueur1) // 출력 : ToStringLiqueur1@7e0ea639
    println(toStringLiqueur2) // 출력 : Liqueur(jager, 350ml)
    println(toStringLiqueur3) // 출력 : ToStringLiqueur3(name=jager, size=350)
}
  • equals(),hashCode()
    • equals() 함수는 두 객체의 동등성을 비교하기 위한 함수이다 equals() 함수가 == 라는 연산자와 동일한 의미라고 한다. 객체를 생성할 때, 동등한 입력값이라고 해도 == 로 비교하게 되면 false를 반환한다, 이때 그 객체의 프로퍼티 값이 전부 동일하다면 같은 객체라고 여기고 싶을때 equals() 함수를 override 하여서 같은 객체로 처리할 수 있다고 한다.
      두 객체의 참조값 값을 비교하려면 === 연산자를 사용한다고 한다.
// equals() X
class EqualsLiqueur1(var name: String, var size: Int)
// equals() O
class EqualsLiqueur2(var name: String, var size: Int){
    override fun equals(other: Any?): Boolean {
        if (other==null||other !is EqualsLiqueur2)
            return false
        return name == other.name && size == other.size
    }
}
// data class 자동 equals,hashcode()
data class EqualsLiqueur3(var name: String, var size: Int)

fun main() {
    var equalsLiqueur1 = EqualsLiqueur1("kahlua",280)
    var equalsLiqueur2 = EqualsLiqueur2("kahlua",280)
    var equalsLiqueur3 = EqualsLiqueur3("kahlua",280)


    println(equalsLiqueur1==EqualsLiqueur1("kahlua",280))// 출력 false
    println(equalsLiqueur2==EqualsLiqueur2("kahlua",280))// 출력 true
    println(equalsLiqueur3==EqualsLiqueur3("kahlua",280))// 출력 true

}
  • HashCode
    • HashCode는 객체를 식별하기 위한 ID 라고 한다. 메모리에서 객체의 Hash 주소값을 반환 한다
    • HashCode는 어떤 객체에서 여러번 호출해도 객체의 정보가 수정되지 않는 한 항상 같은 값을 반환 한다.
    • 특정 개체의 equals() 결과가 참이면, HashCode의 결과도 같다.
  •  copy
    • copy 는 변수, 상수 등을 생성할 때 자주 쓰던 이꼴 ' = ' 하나만 있던 것이 얕은복사(Shallow Copy) 였다.
    • 이때 얕은 복사란 주소 값을 복사하는 것이고, 깊은 복사란 주소 값이 아닌 전체 값을 복사한다는 의미이다.
class Size (var capacity:Int)

fun main() {
    var soju1 = Size(350)
    var soju2 = soju1
    soju1.capacity = 280
    println(soju2.capacity) // 출력 : 280
}

 

    • soju2 는 soju1과 초기 용량이 같았는데, soju1 의 용량이 줄어드니 soju2 까지 양이 줄어든 상황.
    • data class 로 클래스 변경 후 copy() 함수 사용.
data class Size (var capacity:Int)

fun main() {
    var soju1 = Size(350)
    var soju2 = soju1.copy()
    soju1.capacity = 280
    println(soju2.capacity) // 출력 : 350
   
}
    • 데이터 클래스를 사용해도 완벽한 Deep Copy는 아니라고 한다 (?) 자세한 내용은 추후에 다시 다뤄봐야 할 듯
  • componentN
    • 해당 함수는 구조 분해 선언에 관련되어 설명되어진다.
data class Person1 (val name:String,val age:String)

fun main() {
    val person1 = Person1("홍길동","31")
    val (name, age) = person1 // 변수 선언함과 동시에 컴포넌트1,2로 분해
    println("$name,$age") // 홍길동,31
}

 

 

    • 이때, 컴파일러 과정에서 자동적으로 person1.component1() , person1.component2()... n() 로 분해 시킨다.
    • 해당 함수를 사용하기 보다는, 프로퍼티의 이름을 이용해서 직접 가져오는 것이 더 직관적이라는 의견이 있어서 추후에 구조 분해를 하게 되는 경우가 생기면 더 깊숙히 알아 봐야겠다.

 

[오늘 복습한 내용]

1. GIt Hub Resository 코드 클론하기

  • 기존에 쓰던 노트북이 램이 8gb라 xml 파일에서 작업하다보면  2-3초 멈추는 현상이 계속 되어서 아쉽지만 보내주기로 했다. 새로 가져온 노트북에 기존에 작업하던 파일들을 옮기다가 깃허브를 이용해서 클론한 뒤 작업하던 내용을 이어서 하면 좋을 것 같다고 생각했다.
  • Android Studio 좌측 상단에 file/settings 에 들어간 뒤 Github 아이디 연동부터 해줬다.

4번 클릭하면 깃허브에서 로그인이 가능하다, 안되는 경우도 있는데 토큰 키 발행 받아서 토큰으로도 연동 가능.

  • 연동이 되었으면 상단에 VCS 였던 툴바가 GIt 으로 바뀐 것을 확인할 수 있다. File 탭 누르고 Close Project를 눌러서 초기화면으로 가보자

  • 래파지토리 URL을 입력해서도 클론할 수 있지만 기존에 내 깃허브에 올려둔 래파지토리니 좌측에 연동된 깃허브 아이디 클릭하면 내 래파지토리에 있는 내용들을 확인할 수 있다.

클론 원하는 파일 명 선택 후 Clone 버튼 누르면 끝

 

 


[오류,에러 등등]

- 문법공부 위주로 진행-


[느낀 점]

1.  남들이 어려우면 나도 어렵고 나는 쉬운 게 없다.

2. 시간적 여유가 있다면, 막히는 부분이 있으면 해결할 때 까지 멈추지 말고, 해결하게 되더라도 막히던 부분 외에 주변 부분까지도 학습하고 정리하는 시간을 갖을 것

3. 쓸 데 없는 데에 시간 낭비하지 말고 스트레스 받지 말자.

'TIL' 카테고리의 다른 글

[TIL] 0816 Enum Class  (0) 2023.08.16
[TIL] 20230809  (0) 2023.08.09
[TIL] 20230804 - 4일차  (0) 2023.08.05
[TIL]20230803 - 3일차  (0) 2023.08.03
[TIL] 20230802 - 2일차  (0) 2023.08.02