> For the complete documentation index, see [llms.txt](https://seunghyun-kim-1.gitbook.io/my-knowledge-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://seunghyun-kim-1.gitbook.io/my-knowledge-library/jetbrains-academy/kotlin-basics/coffee-machine/brush-up-your-code/objects.md).

# Objects

## Everything is an object

우리는 항상 사물(객체)에 둘러싸여 있습니다: 운전, TV 시청, 책 읽기, 핸드폰으로 바나나 구매하기 등 Kotlin 은 변수를 사용하여 작업할 때마다 객체를 사용하여 작업합니다. 예를들어 정수 5와 문자열 "love" 는 객체입니다. 프로그래머는 사람이고, 사람은 사물(객체)을 다루는 데 익숙하기 떄문에 편리합니다. 이번 주제에서는 객체의 내부 구조, 상태와 행동 그리고 독특한 특징에 대해서 배울 것 입니다.

## State and behavior

객체는 일부 데이터를 저장하고 무언가를 할 수 있는 복잡한 구조입니다. 객체를 어떻게 얻을 수 있을까요? 음, 객체는 어떤 정보를 저장하는 메모리의 한 부분입니다. 변수와 값은 객체를 가리킬 뿐입니다. 그래서, 변수의 도움을 받아 객체 작업을 수행할 수 있습니다. 간단한 객체와 관련된 예제로 메시지를 저장하는 `String` 이 있습니다.

메시지는 상태(**state**)를 가집니다: 이것은 기호만 포함하는 것이 아닌 크기와 메시지의 길이를 포함합니다. Kotlin 에서는 어떤 객체의 상태에 접근하는 것을 속성(**property**) 이라고 합니다. 그저 `.` 뒤에 속성의 이름을 작성하면 됩니다. 단순 문자열 변수 `msg` 가 있다고 가정하겠습니다 length 속성은 문자열의 길이를 알 수 있습니다:

```kotlin
val msg = "Hi"
println(msg.length) // 2
```

함수는 객체의 동작을 나타낼 수 있으므로 보다 논리적으로 사용할 수 있습니다. 이러한 함수는 **멤버함수** 또는 **메서드**라고 합니다. 멤버함수 `repeat()` 를 사용하여 메시지를 반복할 수 있습니다:

```kotlin
val msg = "Hi"
println(msg.repeat(3)) // "HiHiHi"
```

Will print:

```kotlin
HiHiHi
```

보시다시피 `String` 타입은 내부 구조가 매우 복잡합니다.

## Copying by reference

프로그래밍에서 무언가를 복사하는 것은 흔한 일입니다. 거의 모든 경우에 `=` 을 사용합니다. 은행 계좌를 예시로 들어 살펴보겠습니다.

당신은 아마 한 계좌에 여러 카드가 있을 것 입니다. 이 중 하나의 카드로 무언가를 살 때, 비록 카드는 다르지만 연결된 계좌에서 돈을 사용합니다.

Kotlin 에서도 비슷하게 적용됩니다. 변수를 생성하고 변수에 객체를 할당하면 다른 변수도 동일한 객체를 가리킬 수 있습니다.

```kotlin
val msg1 = "Hi"
val msg2 = msg1
```

두 변수 모두 "Hi" 라는 객체를 가리키고 있습니다.

다른 말로, `=` 는 객체 자체를 복사하지 않고, 객체에 대한 **참조**만 복사합니다.

## Mutability

이러한 변수 중 하나의 값을 변경하여 여러 변수에 할당된 객체가 변경되면 무슨 일이 일어날까요? 이는 객체의 종류에 따라 달라집니다.

```kotlin
var a: Int = 100
val anotherA: Int = a
println(a == anotherA)  // true
println(a === anotherA) // true
a = 200
println(a == anotherA)  // false
println(a === anotherA) // false
```

보다시피 `a = 200` 으로 값을 변경했을 때, 이미 참조된 객체는 변경할 수 없습니다. 변수 `a` 에는 값 `200` 이라는 새 참조가 할당됩니다.

값의 타입이 `Double` 인 다른 예제를 살펴보겠습니다:

```kotlin
var d1: Double = 1.5
val d2 = d1
println(d1 === d2) // true
d1 += 1            // d1 is 2.5 now
println(d1 === d2) // false
```

만약 객체가 변경할 수 없는 경우 다른 객체를 사용하여 이 새 객체를 동일한 변수에 할당할 수 있습니다. 변수의 값을 재할당 하면 새로운 객체를 가리키고 다른 변수는 여전히 기존의 객체를 가리킬 것입니다. 문자열이나 숫자와 같은 표준 타입은 변경할 수 없으므로 참조하여 복사하는 것이 안전합니다.
