돌아오신 것을 환영합니다
이번 영상에서는 커피 예시로 돌아가 보려고 합니다
커피를 만들려고 했었습니다
그리고 Daisy 코드와 Dog 생성 코드는 다 지워주었습니다
Dog 클래스는 아직 존재하므로 괜찮습니다
여기에 아직 있습니다
지금은 닫아주고 커피 작업에 집중해 보도록 하겠습니다
이것을 위해 클래스를 살펴본 것이었습니다
커피 주문 정보를 각 사용자별로 따로 받아오려고 했습니다
그리고 그것을 이 makeCoffee()메소드 혹은 함수에 전달하여
커피를 만드는 것입니다
기억나시죠?
그러기 위해서는 어떻게 해야 할까요?
당연하게도 coffeeDetails(커피주문정보)라는 클래스를 만들어 주면
됩니다
하지만 함수나 프로퍼티 같은 클래스의 모든 기능들이 필요하지는
않습니다
그리고 data class(데이터 클래스)라는 것이 있습니다
Kotlin에서 데이터 클래스란 데이터를 보관하는 것이 주 목적인 클래스입니다
그리고 그것은 커피 주문 정보 클래스를 위해 딱 필요한 것입니다
아무것도 실행하지 않아도 됩니다
커피를 만들지도 않습니다
아무것도 하지 않아도 됩니다
그저 할 일은 커피 주문 정보를 담고 유지하는 것입니다
자
이것은 자동적으로 추가적인 멤버 함수가 포함되며 인스턴스를 읽을 수 있는 결과로
출력해 주기도 하고 data로 표시된 인스턴스 및 클래스를 비교할 수도 있습니다
그리고 class 키워드 대신 data class 키워드를 사용합니다
그리고 정의된 그 클래스의 프로퍼티를 사용할 수 있는 것입니다
그것 뿐먼 아니라 사용할 수 있는 함수들이 있는 예를 들어 .toString은 객체의
정보를 제공합니다
그리고 그것을 서로 비교해 볼 수도 있고
그 데이터나 클래스 객체들을 복사할 수도 있습니다
그러면 한 번 생성해 봅시다
데이터 클래스를 위한 가장 좋은 접근법이 무엇일까 고민했습니다
데이터 클래스를 위한 파일을 따로 만들어야 할지 데이터 클래스를 사용할
동일한 파일에서 사용해야 할지 말입니다
우리의 경우 그것은 Basics.kt 파일일 것입니다
그리고 이를 위해 ChatGPT의 자문을 구했습니다
여러분께도 추천드리는 방법입니다
확실하지 않은 것이 있을 땐 ChatGPT의 도움을 받아보시기 바랍니다
물론 모든 것을 알지는 못하기 때문에 이러한 정보를 사용할 때는 주의해야 합니다
아무튼 물어보았습니다
Kotlin에서 데이터 클래스를 추가할 때, 이것이 사용되는 동일한 클래스에 추가해야 할까요, 아니면 별도의 파일을 만들어야
할까요?
ChatGpt는 두 방법 모두 자주 사용되며 선택 기준은 프로젝트 구조나
개발진의 선호도 등에 달렸다고 대답합니다
그리고 장, 단점들을 제공해 줍니다
장점은 데이터 클래스가 다른 곳에서 사용되지 않을 거라는 전제 하에
같은 파일에서 사용하면 한 번에 볼 수 있어 가독성을 높혀준다고
합니다
이 뜻은 데이터 클래스의 객체와 그 데이터 클래스만을 사용할 것이고
이를 프로그램 내 다른 어떤 곳에서든 사용하지 않을 것이라면
같은 클래스에 담아도 괜찮다는 것입니다 그게 아니라면 분리된 파일에 넣는 것을 추천한다고 합니다
이러한 정보를 얻었습니다
그러면 데이터 클래스를 여기에 생성해 보겠습니다
이번에는 Basics가 아니라 CoffeeDetails(커피주문정보)라고 하겠습니다
이런 데이터 클래스를 생성했습니다
굉장히 간단합니다
온갖 부수적인 것들을 추가하지 않아도 되고
별도의 클래스 파일을 생성하지 않아도 됩니다
initializer 같은 것들도 생성할 필요가 없습니다
그러면 정보를 생성해 봅시다
자 커피에는 어떠한 정보들이 필요할까요?
즉 어떠한 프로퍼티(속성)들이 필요할까요?
밑으로 내려가서 살펴보면 sugarCount(설탕 양)과 name(이름)을 필요로 했었습니다
그러면 이것들을 복사해 봅시다
name도 프로퍼티여야 한다는 것을 깜빡하시면 안 됩니다
그러므로 여기 val을 추가하는 것입니다
이를 다른 줄에 사용하면 더 읽기 쉽습니다
예를 들어 이런 식으로 말입니다
이제 데이터 클래스가 무엇이고 그 클래스의 프로퍼티들에는 무엇이 있는지 읽기가
편해졌습니다
저는 이것보다 쉼표를 이 끝에 두는 것을 더 선호합니다
그래야 한 줄에 있습니다
이 외에도 CoffeeDetail에 담고 싶은 것이 있을까요?
이 외에도 커피에 필요한 정보들은 무엇일까요?
일단 설탕 양과 커피를 줄 사람의 이름은 준비되었고
size(사이즈)도 있으면 좋을 것 같습니다 종류는 String입니다
예를 들어 XL, L, M, S과 같은 사이즈들입니다
저는 개인적으로 ml(밀리리터)를 선호하지만 아무도 원치 않을 것입니다
아무튼 그리고 creamAmount(크림 양)도 필요합니다
얼만큼의 크림을 원하는지 말입니다
이것은 Int일 것입니다
그러면 데이터 클래스가 완성되었습니다
만약 데이터 클래스로 객체를 생성하면 단순화된 객체가 될 것입니다
프로퍼티로써 데이터나 정보를 담을 수만 있고 다른 코드는 실행할 수 없으며
그럴 필요도 없습니다
우리가 정확히 원하는 바입니다
그러면 새로운 변수를 생성해 봅시다
변수 이름은 coffeeForDenis(Denis를위한커피)로 할 것이고 CoffeeDetails를 담을 것입니다
이는 CoffeeDetails의 객체가 되는 것입니다
그리고 이 위 순서대로 모든 정보들을 추가해야 합니다
저는 설탕을 좋아하지 않으므로 sugarCount는 0라고 하겠습니다
name은 denis일 것이고 소문자여도 상관 없습니다
size는
저는 많이 마시므로 xxl로 하고 creamAmount는 0로 하겠습니다 크림도 좋아하지
않습니다
이것이 저의 coffeeDetails(커피주문정보)입니다
따라서 제가 이 객체에 전달할 정보들인 것입니다
그리고 신기한 것은 이제 객체를 매개변수로 전달할 수 있다는 것입니다
어떻게 할 수 있을까요?
어떻게 coffeeForDenis를 makeCoffee()에 전달할 수 있냐면 우리가 전달하고자 하는
coffeeDetails의 종류가 CoffeeDetails가 되는 것입니다
이제 CoffeeDetails를 직접적으로 makeCoffee() 함수에 전달할 수 있습니다
CoffeeDetails라는 종류의 객체, 예를 들어 coffeeForDenis입니다
이는 CoffeeDetails라는 종류인 것입니다
따라서 클래스나 데이터 클래스를 생성함은 새로운 type(종류)를 생성하는 것입니다
그러니까 String이나 Int로 된우리만의 종류를 생성하는 것입니다
자
그것이 클래스와 데이터 클래스를 생성한다는 것입니다
보시다시피 많은 오류가 발생하는데 더 이상 sugarCount가 존재하지 않기 때문입니다
하지만 CoffeeDetails 안에 sugarCount 정보가 있습니다
그러므로 전달 받을 변수는 sugarCount를 담고 있을 것입니다
왜냐하면 CoffeeDetails 클래스를 살펴보면
이 데이터 클래스는 sugarCount라는 변수 혹은 프로퍼티를 갖고 있습니다
따라서 전달될 CoffeeDetails 객체에서 해당 정보를 사용할 수 있습니다
이것는 함수이며 모든 것을 정의하고 있습니다
실질적으로
이 함수 선언 안에 아무것도 전달하고 있지 않습니다
이 함수 정의를 계속해서 마무리해 봅시다
sugarCount를 사용하고 싶으면 앞서 보셨듯이 중괄호를 추가해야 합니다
자
String을 다루는 방법을 복기해 보시면 이런 식으로 중괄호를
사용해야 했습니다
이것은 name입니다
그리고 coffeeDetails.name이라고 수정하겠습니다
sugarCount도 마찬가지로 coffeeDetails.sugarCount입니다
"설탕 추가 없음"
여기도 중괄호로 열고 coffeeDetails.name을 입력합니다
여기도 coffeeDetails.sugarCount로 바꾸고 중괄호를 닫습니다
그리고 마지막 줄은 다음 줄로 보내겠습니다
똑같은 것입니다
그러면 무슨 일이 벌어지는 것이냐면
저는 이해하기가 쉽지만
여러분은 조금 헷갈리실 수도 있습니다
정리하자면 coffeeDetails는 우리가 커피에 원하는 모든 정보를
갖고 있습니다
그리고 그저 그 프로퍼티들에 접근을 하는 것입니다
makeCoffee()함수에 전달될 객체에 할당된 값들에 접근을
하는 것입니다
이제 makeCoffee() 함수가 준비되었으니 사용해 봅시다
하지만 askCoffeeDetails에서는 사용하지 않을 것이며 이것은 주석 처리해주겠습니다
main() 함수에서 직접적으로 사용해 봅시다
여기서 사용할 것인데
이름이
askCoffeeDetails가 아니라
makeCoffee()입니다
커피를 만드는 것입니다
그리고 커피를 만들기 위해 coffeeForDenis를 전달해야 합니다
그러면 이제 모든 정보들, 즉 sugarCount, name, size, creamAmount 등을
전부 전달하는 것입니다
이러한 정보들을 makeCoffee() 함수에 전달합니다
이곳에 말입니다
그런 다음 여기 있는 것들을 실행하는 것입니다
그러면 denis가 원하는 설탕 양에 따라 이 세 문장 중 하나가
출력되는 것입니다
이 정보에 따라 출력되는 것입니다
이제 크림 양에 따라서도 추가적인 정보를 제공할 수 있습니다
그러면 달러 기호와 함께
다음 줄에 입력해 보겠습니다
달러 기호 다음에 중괄호를 열고
creamAmount를 사용합니다
이는 크림 양을 표시해 줄 것이며 "cream :"(크림: )문구도 추가합니다
다른 줄에도 이런 식으로 추가해줄 수 있습니다
이런 식으로 말입니다
불필요한 문구가 조금 많지만
일단 실행해 봅시다 S
다른 것은 바꿀 필요 없습니다
보시다시피 "Coffee with no sugar for denis + and cream:" +"0" (커피에 설탕 추가 없음, 주문자 denis + 크림:" +"0)가 보입니다
네
깔끔하지 않습니다
여길 다시 보시면
불필요한 별도의 줄들이 너무 많습니다
일단 설탕 추가가 없는 커피만 수정하고 다시 실행해 보면
"...주문자, denis + 크림: 0"가 출력됩니다
자
이런 식으로 데이터 클래스에 대해 보여드리고 싶었습니다
이런 식으로 데이터 클래스를 생성하는 것입니다
데이터 클래스를 어떻게 활용하는지도 살펴보았습니다
그리고 데이터 클래스와 일반 클래스의 차이는 데이터 클래스에서는
별도의 함수를 정의할 수 없다는 것입니다
물론 일반 클래스에서는 가능합니다