돌아오신 것을 환영합니다
이번 영상에서는 일반적인 클래스 또는 Dog 클래스가 지닐 수 있는 프로퍼티에 대해 알아보려고
합니다
그리고 constructor(생성자)를 사용해 볼 것입니다
생성자는 쉽게 말해서 initializer를 선행하거나 initializer를 시작합니다
하지만 만약 생성자가 없어도 initializer는 실행됩니다
그리고 여기 우리만의 생성자를 만들어 볼 것입니다
constructor 키워드를 사용하시면 됩니다
그리고 Dog 클래스 안에 어떤 종류의 변수를 원하는지 적을 수 있습니다
그러나 생성자 내에서 해당 항목들의 가시성을 명시적으로 수정하고 싶지 않다면
생략해도 좋습니다
처음에는 이것이 이해가 되지 않을 수도 있습니다
강의가 더 진행될 때까지 이해하지 못할 수도 있는데 전혀 문제가 되지 않으며
일단 Dog에 이름이 있어야 한다고 해봅시다
그러면 Dog에 String 종류의 name(이름)을 생성해 보겠습니다
이는 여러 방법 중 하나인데 그러면 이는 매개변수가 됩니다
그래서
이 val 키워드를 사용하면 됩니다
그러면 이는 프로퍼티가 됩니다
차이가 무엇일까요?
이렇게 하면 매개변수이고
방금 것은 프로퍼티입니다
마우스를 롤려보면 아직 사용되지 않은 매개변수라는 설명이 나옵니다
하지만 val을 추가하면 사용되지 않은 프로퍼티라고 바뀝니다
무슨 일이 일어나는 것일까요?
몇 가지 예시를 통해 알아보겠습니다
먼저 해볼 것은 이 name을 가지고 bark()에
전달해 주겠습니다
좋습니다
이런 식으로 name을 전달하는 것입니다
그리고 나서 출력 문구 "$name says"($name이 말합니다)
를 추가합니다
그러면
자
이것도 String이라고 알려주어야 합니다
이게 무슨 뜻이냐면 Dog 객체를 생성할 때 Dog의 name을 꼭 제공해 달라는 것입니다
그러면 이 bark() 함수를 실행할 것이며 Dog의 name을 bark() 함수에 전달해 줄 것입니다
그러면 Dog는 그의 name을 사용해 bark(짖는) 것입니다
또는 println()을 사용해 "name이 말합니다 멍멍"을 출력하는 것입니다
이제 문제는 더 이상 이 Dog 정의가 알맞지 않다는 것입니다
Dog은 name을 필요로 합니다
그리고 "Daisy"를 입력해 주겠습니다
그리고 Basics를 실행해 봅시다
그러면 "Daisy says woof woof"(데이지가 말합니다 멍멍)이 출력됩니다
이는 클래스를 함수처럼 다룬 것이며 그 함수가 또 다른 함수를
호출한 것입니다
그게 무슨 뜻일까요?
왜 그렇게 해야 하는 것일까요?
사실 꼭 이렇게 하지 않아도 됩니다 왜냐하면 이는그저 여러 방법 중 한 가지였기 때문입니다
따라서 클래스에 매개변수를 전달해도 되긴 하지만 더 좋은 방법은 이를 프로퍼티로 만드는 것입니다
그건 또 무슨 뜻일까요?
프로퍼티는 실제 객체의 일부라는 뜻입니다
자
매개변수를 사용했을 때는 그저 객체에 정보를 전달한 것입니다
하지만 이제 Dog와 아무 상관이 없는 단어를 전달해도
name(이름)을 부여하면 그때부터는 Dog의 일부가 됩니다
따라서 Dog는 Dog의 특성인 name(이름)을 갖게 되는 것입니다
Dog에게 name(이름)이 생긴 것입니다
하지만 Dog(강아지)가 지닐 수 있는 것들에는 또 어떤 것이 있을까요?
강아지는 breed(품종)도 있습니다
자
이 또한 String이 될 것입니다
여기도 val을 추가해야 breed도 Dog의 일부이자 Dog가 지닌 특징의 일부
즉 Dog의 프로퍼티가 되도록 하는 것입니다
그러면 Dog는 스스로 어떤 breed(품종)인지를 식별합니다
이를 Basics로 돌아가 살펴보면 이제 name만 전달하는 것은 충분하지
않습니다
breed도 전달해야 합니다
앞서 말했듯 제 강아지는 "dwarfpoodle"(미니어처푸들)입니다
그런 비슷한 것이었습니다
아마 따로 적는 게 맞는 것 같습니다
"Dwarf poodle"(미니어처 푸들)
제가 키우는 강아지의 품종입니다
그러면 다시 실행해 봅시다
재실행했지만 바뀐 것이 없습니다
보이시죠?
여전히 "Daisy가 말합니다 멍멍"이 출력됩니다
하지만 차이점은 이제 Dog의 프로퍼티(속성)에 접근할 수 있다는 것입니다
우리는 이제 이 daisy라는 강아지가 Dog의 객체라는 것을 압니다
daisy는 객체입니다
그리고 이제 daisy의 프로퍼티에 접근하려면 daisy.을 입력해서
보시다시피 breed와 name 그리고 bark()가 제안되는 것이 보입니다
그러니까 이제 Dog가 생성될 때 bark()가 실행되는 것이 아니라 언제든 실행할 수 있습니다
하지만 지금 시점에서 제가 원하는 것은 아닙니다
breed를 가져오고 싶습니다
그러면 breed를 가져온후 그 앞에 이름을 넣어줄 건데 그냥 이름을 입력하는 대신 이것도 daisy.name을 사용합니다
보시다시피 변수나 클래스의 프로퍼티를 String으로 다루고 싶다면
이런 식으로 중괄호를 추가해 어디서부터 어디까지가 영역인지
구분지어야 합니다
하지만 중괄호를 사용할 땐 무엇을 출력하고자 하는지를 정확하게 알아야
합니다
자 그럼 이제 "(daisy의 이름)은 (daisy의 품종)"이 출력될 것입니다
실행해 봅시다
보시다시피
우선 "Daisy가 말합니다 멍멍"이 출력되는데 이는 Dog가 생성되었다는 것입니다
그리고 "Daisy is a Dwarf poodle"(Daisy는 미니어처 푸들)이 보입니다
따라서 객체 daisy의 특성인 프로퍼티를 받아온 것이며
처음에 생성이 되었기 때문입니다
여기서 생성된 것이고
여기서 그 클래스의 프로퍼티 재할당이 이루어진 것입니다
그리고 사용을 할 수 있게 된 것입니다
다른 프로그래밍 언어에서는 이 과정이 두 단계로 나뉠 것입니다
데이터를 매개변수로 전달한 다음
여기서 바로 프로퍼티를 생성하는 것입니다
그러니까 여기서 name을 이런 식으로 생성하는 것입니다
하지만 다행히 Kotlin은 더 유능하여 한 줄로 이 과정이 가능합니다
그래서
그럴 필요가 없습니다
만약 앞서 보여드린 것처럼 이것들을 매개변수로 사용하여 breed도 매개변수라면
더 이상 프로퍼티가 아니게 되며
이것도 더 이상 동작하지 않습니다
자
전달된 매개변수에 접근할 수 없습니다
하지만 전달된 프로퍼티에는 접근할 수 있습니다
보시다시피 daisy의 name을 알 수 없으며 이 name 자체가 존재하지 않기 때문입니다
여기 있는 이 줄이 정의하는 것은 모든 Dog들이 자동으로
String 종류의 name과 breed라는 프로퍼티를 가져야 한다고 알려주는 것입니다 h
공식 문서의 설명을 살펴보시면 더 이해하기 쉬운 부분들도
있을 것입니다
이제 이 매개변수 관련 내용이 이해되실 것입니다
여기서는 primary constructor라는 키워드를 사용하는데
이런 식으로 primary constructor(주 생성자)와 secondary constructor(보조 생성자)를 사용할 수도 있습니다
그건 곧 살펴볼 것입니다
그러니까 Kotlin이 프로퍼티를 선언하고 주 생성자에서 초기화할 수 있는
간결한 구문을 가지고 있다는 것입니다 우리가 방금 작업한 내용입니다
val과 프로퍼티 이름, 그리고 프로퍼티의 종류를 사용했습니다
마지막 부분은
이 부분입니다
이러한 선언에는 클래스 프로퍼티의 기본 값들도 포함될 수 있다는 것입니다
좋습니다
무슨 뜻인지 보여드리겠습니다
그러니까 클래스의 객체가 생성될 때마다 이를 고칠 수 있는데
특정 값이든 여러 값이든 기본 값이라는 게 있습니다
그러니까 여러분이 특정하게 값을 주거나 덮어씌우지 않아도 존재한다는 것입니다
어떻게 할 수 있을까요?
하나를 더 추가해 봅시다
이번에는 var age(나이)를 생성하고
종류는 Int입니다
그리고 이를 0으로 지정합니다
= 0라고 말입니다
이는 기본 값으로 age가 0이라고 알리는 것입니다
따라서 새로운 Dog을 생성할 때마다 새로 태어난 Dog는 age가 0인 것입니다
만약 daisy를 생성할 때도
daisy는 age를 갖고 있지 않지만
여기 출력 문구에 "and is ${daisy.age}"(그리고 ${daisy.age}살입니다)을 추가합니다
이걸 실행해 보면 "그리고 0살입니다"라고 할 것입니다
우리가 전혀 값을 정의하지 않았음에도 "Daisy is a Dward poodle and is 0 years old" (Daisy는 미니어처 푸들 그리고 0살입니다)가
출력됩니다
하지만 여기에 기본 값을 추가했기 때문에 Daisy가 0인 것입니다
만약 이것을 재할당하고 싶으면 여기에 값을 추가할 수 있습니다
daisy는 1살이라고 해봅시다
여기 age를 추가한 다음 다시 실행하면 "~그리고 1살입니다"가 보입니다
자
이런 식으로 프로퍼티에 기본 값을 할당할 수 있었습니다
함수도 이런 식으로 사용할 수 있습니다
그리고 그것은 조금 더 나중에 살펴볼 것입니다
이번 영상은 여기까지입니다
다음 영상에서는 생성자에 대해 이어가 보도록 하겠습니다
그럼 거기서 뵙겠습니다