Skip to content

Latest commit

Β 

History

History
304 lines (232 loc) Β· 10.2 KB

Enums.md

File metadata and controls

304 lines (232 loc) Β· 10.2 KB

μ—΄κ±°ν˜• (Enums)

μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•˜λ©΄ 이름이 μžˆλŠ” μƒμˆ˜λ“€μ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ—΄κ±°ν˜•μ˜ μ‚¬μš©μ€ λ¬Έμ„œμ˜ μ˜λ„λ‚˜ λͺ…ν™•ν•œ 사둀듀을 μ‰½κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
TypeScript λŠ” 숫자 및 λ¬Έμžμ—΄ 기반 μ—΄κ±°ν˜•μ„ λͺ¨λ‘ μ œκ³΅ν•©λ‹ˆλ‹€.

숫자 μ—΄κ±°ν˜• (Numeric enums)

λ¨Όμ € 숫자 μ—΄κ±°ν˜•μœΌλ‘œ μ‹œμž‘ν•©λ‹ˆλ‹€.
λ‹€λ₯Έ μ–Έμ–΄μ—μ„œ μ—΄κ±°ν˜•μ„ μ ‘ν•΄λ΄€λ‹€λ©΄ 더 μ΅μˆ™ ν•  κ²ƒμž…λ‹ˆλ‹€.
μ—΄κ±°ν˜•μ€ enum ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

μœ„μ—μ„œ Up λŠ” 1 둜 μ΄ˆκΈ°ν™”λœ 숫자 μ—΄κ±°ν˜•μž…λ‹ˆλ‹€.
μ•„λž˜μ— μ΄μ–΄μ„œ λ“±μž₯ν•˜λŠ” 멀버듀은 μžλ™μœΌλ‘œ μ¦κ°€ν•©λ‹ˆλ‹€.
즉, Direction.Up 은 1, Down 은 2, Left λŠ” 3, Right λŠ” 4 μž…λ‹ˆλ‹€.

μ›ν•œλ‹€λ©΄ μ΄ˆκΈ°ν™”λ₯Ό μ™„μ „νžˆ 없앨 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

enum Direction {
    Up,
    Down,
    Left,
    Right,
}

μ—¬κΈ°μ—μ„œλŠ” Up 은 0 이며, Down 은 1 이 λ©λ‹ˆλ‹€.
이 μžλ™ 증가 λ™μž‘μ€ λ©€λ²„μ˜ κ°’ μžμ²΄μ— μ‹ κ²½ 쓰지 μ•Šκ³  각 μ—΄κ±°ν˜•μ΄ λ™μΌν•œ μ—΄κ±°ν˜•μ˜ λ‹€λ₯Έ κ°’κ³Ό κ΅¬λ³„λ˜λŠ” κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€.

μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•˜λŠ” 것은 κ°„λ‹¨ν•©λ‹ˆλ‹€: μ—΄κ±°ν˜• 자체의 μ†μ„±μœΌλ‘œ λͺ¨λ“  멀버에 μ—‘μ„ΉμŠ€ν•˜κ³ , μ—΄κ±°ν˜•μ˜ 이름을 μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ„ μ„ μ–Έν•©λ‹ˆλ‹€.

enum Response {
    No = 0,
    Yes = 1,
}

function respond(recipient: string, message: Response): void {
    // ...
}

respond("Princess Caroline", Response.Yes)

숫자 μ—΄κ±°ν˜•μ€ κ³„μ‚°λœ, μƒμˆ˜ 멀버 (computed and constant members)에 ν˜Όν•©λ  수 μžˆμŠ΅λ‹ˆλ‹€.
λ‹¨νŽΈμ μœΌλ‘œ μ΄ˆκΈ°ν™”κ°€ μ—†λŠ” μ—΄κ±°ν˜•μ€ μƒμˆ˜ λ˜λŠ” λ‹€λ₯Έ μƒμˆ˜ μ—΄κ±°ν˜•μ˜ λ©€λ²„λ‘œ μ΄ˆκΈ°ν™”λœ 숫자 μ—΄κ±°ν˜•μ„ 따라야할 ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.
즉, λ‹€μŒμ€ ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€:

enum E {
    A = getSomeValue(),
    B, // 였λ₯˜ ! A λŠ” μƒμˆ˜λ‘œ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ Bμ—λŠ” μ΄ˆκΈ°ν™”κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
}

문자 μ—΄κ±°ν˜• (String enums)

문자 μ—΄κ±°ν˜•μ€ λΉ„μŠ·ν•œ κ°œλ…μ΄μ§€λ§Œ μ•„λž˜μ— μ„€λͺ… 된 것과 같이 μ•½κ°„μ˜ λ―Έλ¬˜ν•œ μ‹€ν–‰μ‹œ 차이 (runtime differences)κ°€ μžˆμŠ΅λ‹ˆλ‹€.
문자 μ—΄κ±°ν˜•μ—μ„œ 각 λ©€λ²„λŠ” λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ λ˜λŠ” λ‹€λ₯Έ 문자 μ—΄κ±°ν˜• λ©€λ²„λ‘œ μƒμˆ˜μ΄ˆκΈ°ν™”λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

enum Direction {
    Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",
}

문자 μ—΄κ±°ν˜•μ€ μžλ™ 증가 λ™μž‘μ„ ν•˜μ§€ μ•Šμ§€λ§Œ 문자 μ—΄κ±°ν˜•μ€ "직렬화(serialize)"ν•˜λŠ” 이점이 μžˆμŠ΅λ‹ˆλ‹€.
즉, 디버깅 쀑이며 숫자 μ—΄κ±°ν˜•μ˜ λŸ°νƒ€μž„ 값을 μ½μ–΄μ•Όν•˜λŠ” 경우 이 값은 μ’…μ’… 뢈투λͺ…ν•©λ‹ˆλ‹€ - 즉, 자체적으둜 μœ μš©ν•œ 의미λ₯Ό μ „λ‹¬ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.(μ—­ 맀핑 (enums-at-runtime)이 도움이 λ κ²ƒμž…λ‹ˆλ‹€)
문자 μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•˜λ©΄ μ—΄κ±°ν˜• 멀버 자체의 이름과 λ…λ¦½μ μœΌλ‘œ μ½”λ“œκ°€ 싀행될 λ•Œ 의미있고 읽기 μ‰¬μš΄ 값을 μ œκ³΅ν•©λ‹ˆλ‹€.

별쒅 μ—΄κ±°ν˜• (Heterogeneous enums)

μ—„λ°€νžˆ λ§ν•˜μžλ©΄ μ—΄κ±°ν˜•μ€ λ¬Έμžμ—΄κ³Ό 숫자 멀버와 μ„žμΌ μˆ˜λŠ” μžˆμ§€λ§Œ κ·Έλ ‡κ²Œ ν•  μ΄μœ λŠ” μ—†μŠ΅λ‹ˆλ‹€.

enum BooleanLikeHeterogeneousEnum {
    No = 0,
    Yes = "YES",
}

JavaScript의 λŸ°νƒ€μž„ λ™μž‘μ„ μ‹€μ œλ‘œ μ‚¬μš©ν•˜λ €κ³  ν•˜μ§€ μ•ŠλŠ” ν•œ, μ΄λ ‡κ²Œ ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

κ³„μ‚°λœ μƒμˆ˜ 멀버 (Computed and constant members)

각 μ—΄κ±°ν˜• λ©€λ²„μ—λŠ” constant λ˜λŠ” computed 쀑 ν•˜λ‚˜μΌ 수 μžˆλŠ” 값이 μžˆμŠ΅λ‹ˆλ‹€.
μ—΄κ±°ν˜• λ©€λ²„λŠ” λ‹€μŒκ³Ό 같은 경우 μƒμˆ˜λ‘œ κ°„μ£Όλ©λ‹ˆλ‹€:

  • μ—΄κ±°ν˜•μ˜ 첫 번째 멀버이며 μ΄ˆκΈ°ν™”κ°€ μ—†μœΌλ©΄ 값이 0 으둜 μ§€μ •λ©λ‹ˆλ‹€:

    // E.X λŠ” μƒμˆ˜μž…λ‹ˆλ‹€:
    enum E { X }
  • μ΄ˆκΈ°ν™”κ°€ μ—†κ³  μ•žμ˜ μ—΄κ±°ν˜• 멀버가 숫자 인 μƒμˆ˜μž…λ‹ˆλ‹€.
    이 경우 이후 λ‚˜μ˜€λŠ” μ—΄κ±°ν˜• λ©€λ²„μ˜ 값은 이전 μ—΄κ±°ν˜• λ©€λ²„μ˜ 값에 1을 λ”ν•œ 값이 λ©λ‹ˆλ‹€.

    // E1 및 E2의 λͺ¨λ“  μ—΄κ±°ν˜• λ©€λ²„λŠ” μƒμˆ˜μž…λ‹ˆλ‹€.
    
    enum E1 { X, Y, Z }
    
    enum E2 {
        A = 1, B, C
    }
  • μ—΄κ±°ν˜• λ©€λ²„λŠ” μƒμˆ˜ μ—΄κ±°ν˜• ν‘œν˜„μ‹μœΌλ‘œ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
    μƒμˆ˜ μ—΄κ±°ν˜• ν‘œν˜„μ‹μ€ 컴파일 μ‹œκ°„μ— μ™„μ „νžˆ 평가될 수 μžˆλŠ” TypeScript의 ν•˜μœ„ μ§‘ν•©μž…λ‹ˆλ‹€.
    ν‘œν˜„μ‹μ€ λ‹€μŒκ³Ό 같은 경우 μƒμˆ˜ μ—΄κ±° ν‘œν˜„μ‹μž…λ‹ˆλ‹€:

    1. λ¦¬ν„°λŸ΄ μ—΄κ±° ν‘œν˜„μ‹ (기본적으둜 문자 λ¦¬ν„°λŸ΄ λ˜λŠ” 숫자 λ¦¬ν„°λŸ΄)
    2. 이전에 μ •μ˜λœ μƒμˆ˜ μ—΄κ±°ν˜• 멀버 (λ‹€λ₯Έ μ—΄κ±°ν˜•μ—μ„œ 올 수 있음)에 λŒ€ν•œ μ°Έμ‘°
    3. κ΄„ν˜Έλ‘œ 묢인 μƒμˆ˜ μ—΄κ±°ν˜• ν‘œν˜„μ‹
    4. μƒμˆ˜ μ—΄κ±°ν˜• ν‘œν˜„μ‹μ— 적용된 +, -, ~ 단항 μ—°μ‚°μž 쀑 ν•˜λ‚˜
    5. +, -, *, /, %, <<, >>, >>>, &, |, ^ λ°”μ΄λ„ˆλ¦¬ μ—°μ‚°μžμ— μ‚¬μš©λœ μƒμˆ˜ μ—΄κ±°ν˜• ν‘œν˜„μ‹ μƒμˆ˜ μ—΄κ±°ν˜• ν‘œν˜„μ‹μ΄ NaN λ˜λŠ” Infinity 둜 ν‰κ°€λ˜λŠ” 것은 컴파일 νƒ€μž„ μ—λŸ¬μž…λ‹ˆλ‹€.

λ‹€λ₯Έ λͺ¨λ“  κ²½μš°μ—λŠ” μ—΄κ±°ν˜• 멀버가 κ³„μ‚°λœ(computed) κ²ƒμœΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.

enum FileAccess {
    // μƒμˆ˜ 멀버
    None,
    Read    = 1 << 1,
    Write   = 1 << 2,
    ReadWrite  = Read | Write,
    // κ³„μ‚°λœ 멀버
    G = "123".length
}

톡합 μ—΄κ±°ν˜• 및 μ—΄κ±°ν˜• 멀버 νƒ€μž… (Union enums and enum member types)

κ³„μ‚°λ˜μ§€ μ•Šμ€ μƒμˆ˜ μ—΄κ±°ν˜• λ©€λ²„μ˜ 특수 ν•˜μœ„ 집합이 μžˆμŠ΅λ‹ˆλ‹€: λ¦¬ν„°λŸ΄ μ—΄κ±°ν˜• λ©€λ²„μž…λ‹ˆλ‹€.
λ¦¬ν„°λŸ΄ μ—΄κ±°ν˜• λ©€λ²„λŠ” μ΄ˆκΈ°ν™”λœ 값이 μ—†κ±°λ‚˜ λ‹€μŒ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” 된 값이 μžˆλŠ” μƒμˆ˜ μ—΄κ±°ν˜• λ©€λ²„μž…λ‹ˆλ‹€.

  • λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ (예: "foo", "bar", "baz")
  • 숫자 λ¦¬ν„°λŸ΄ (예: 1, 100)
  • 숫자 λ¦¬ν„°λŸ΄μ— μ μš©λ˜λŠ” 단항 λ§ˆμ΄λ„ˆμŠ€ (예: -1, -100)

μ—΄κ±°ν˜•μ˜ λͺ¨λ“  멀버가 λ¦¬ν„°λŸ΄ μ—΄κ±°ν˜• 값을 κ°€μ§ˆ λ•Œ 일뢀 νŠΉμˆ˜ν•œ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ²«λ²ˆμ§ΈλŠ” μ—΄κ±°ν˜• 멀버도 νƒ€μž…μ΄ λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ νŠΉμ • λ©€λ²„λŠ” μ—΄κ±°ν˜• λ©€λ²„μ˜ κ°’λ§Œ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

enum ShapeKind {
    Circle,
    Square,
}

interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
}

interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
}

let c: Circle = {
    kind: ShapeKind.Square,
    //    ~~~~~~~~~~~~~~~~ 였λ₯˜!
    radius: 100,
}

또 λ‹€λ₯Έ λ³€ν™”λŠ” μ—΄κ±° νƒ€μž… μžμ²΄κ°€ 각 μ—΄κ±°ν˜• λ©€λ²„μ˜ 합집합(union) 이 λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
[κ²°ν•© νƒ€μž… (union types)](./Advanced Types.md#union-types)에 λŒ€ν•΄ 아직 λ°°μš°μ§€ μ•Šμ•˜μ§€λ§Œ, μ•Œμ•„ 두어야 ν•  것은 μ‘°ν•© μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•˜λŠ” νƒ€μž… μ‹œμŠ€ν…œμ΄ μ—΄κ±°ν˜• μžμ²΄μ— μ‘΄μž¬ν•˜λŠ” μ •ν™•ν•œ 값듀을 μ•Œκ³ μžˆλ‹€λŠ” 사싀을 ν™œμš©ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 λ•Œλ¬Έμ— TypeScriptλŠ” 값을 잘λͺ» λΉ„κ΅ν•˜λŠ” 바보같은 버그λ₯Ό μž‘μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

enum E {
    Foo,
    Bar,
}

function f(x: E) {
    if (x !== E.Foo || x !== E.Bar) {
        //             ~~~~~~~~~~~
        // 였λ₯˜! μ—°μ‚°μž '!==' λŠ” 'E.Foo' 및 'E.Bar' νƒ€μž…μ— μ μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    }
}

이 μ˜ˆμ œμ—μ„œ, λ¨Όμ € x κ°€ E.Foo κ°€ κ°€ μ•„λ‹Œμ§€ κ²€μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€.
이 검사λ₯Ό μ„±κ³΅ν•˜λ©΄ || κ°€ μ‹€ν–‰λ˜μ§€ μ•Šκ³  'if' 의 λ‚΄λΆ€κ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ 검사λ₯Ό μ„±κ³΅ν•˜μ§€ λͺ»ν•˜λ©΄ x λŠ” 였직 E.Foo 만 될 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ E.Bar 와 λ™μΌν•œ 지 ν™•μΈν•˜λŠ” 것은 μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€.

λŸ°νƒ€μž„μ‹œμ˜ μ—΄κ±°ν˜• (Enums at runtime)

μ—΄κ±°ν˜•μ€ λŸ°νƒ€μž„μ— μ‘΄μž¬ν•˜λŠ” μ‹€μ œ κ°μ²΄μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ‹€μŒ μ—΄κ±°ν˜•μ„ 보면,

enum E {
    X, Y, Z
}

μ‹€μ œλ‘œ ν•¨μˆ˜μ— 전달 될 수 μžˆμŠ΅λ‹ˆλ‹€.

function f(obj: { X: number }) {
    return obj.X;
}

// μž‘λ™ν•©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ `E` λŠ” 숫자인 `X` λΌλŠ” 속성을 κ°€μ§€κ³ μžˆκΈ° λ–„λ¬Έμž…λ‹ˆλ‹€.
f(E);

μ—­ 맀핑 (Reverse mappings)

멀버에 λŒ€ν•œ 속성 이름이 μžˆλŠ” 객체λ₯Ό λ§Œλ“œλŠ” 것 외에도 숫자 μ—΄κ±°ν˜• λ©€λ²„λŠ” μ—΄κ±°ν˜• κ°’μ—μ„œ μ—΄κ±°ν˜•μ˜ μ΄λ¦„μœΌλ‘œ μ—­ 맀핑(reverse mapping) 을 λ°›μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒ μ˜ˆμ œμ—μ„œ:

enum Enum {
    A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"

TypeScriptλŠ” 이것을 λ‹€μŒ JavaScript둜 μ»΄νŒŒμΌν•©λ‹ˆλ‹€.

var Enum;
(function (Enum) {
    Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
var a = Enum.A;
var nameOfA = Enum[a]; // "A"

이 μƒμ„±λœ μ½”λ“œμ—μ„œ μ—΄κ±°ν˜•μ€ μ „λ°©ν–₯(forward) (name -> value) 맀핑과 μ—­λ°©ν–₯(reverse) (value -> name) 맀핑을 λͺ¨λ‘ μ €μž₯ν•˜λŠ” 객체둜 μ»΄νŒŒμΌλ©λ‹ˆλ‹€.
λ‹€λ₯Έ μ—΄κ±°ν˜• 멀버에 λŒ€ν•œ μ°Έμ‘°λŠ” 항상 속성 μ ‘κ·ΌμœΌλ‘œ 방좜되며 κ²°κ³  인라인(inline)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ¬Έμžμ—΄ μ—΄κ±°ν˜• λ©€λ²„λŠ” 역맀핑을 μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

const μ—΄κ±°ν˜• (const enums)

λŒ€λΆ€λΆ„μ˜ 경우 μ—΄κ±°ν˜•μ€ μ™„λ²½ν•˜κ²Œ μœ νš¨ν˜„ λ°©λ²•μž…λ‹ˆλ‹€.
ν•˜μ§€λ§Œ λ•Œλ–„λ‘œ μš”κ΅¬μ‚¬ν•­μ΄ 더 μ—„κ²©ν•©λ‹ˆλ‹€.
μ—΄κ±°ν˜•μ˜ 값에 μ ‘κ·Όν•  λ•Œ μ—¬λΆ€λŠμ΄ μƒμ„±λœ μ½”λ“œμ™€ 좔가적인 우회 λΉ„μš©μ„ ν”Όν•˜λ €λ©΄ const μ—΄κ±°ν˜•μ„ μ‚¬μš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
const μ—΄κ±°ν˜•μ€ μ—΄κ±°ν˜•μ— const μ§€μ‹œμžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•©λ‹ˆλ‹€.

const enum Enum {
    A = 1,
    B = A * 2
}

const μ—΄κ±°ν˜•μ€ μƒμˆ˜ μ—΄κ±°ν˜• ν‘œν˜„μ‹λ§Œ μ‚¬μš©ν•  수 있으며 일반 μ—΄κ±°ν˜•κ³Ό 달리 μ»΄νŒŒμΌν•˜λŠ” λ™μ•ˆ μ™„μ „νžˆ μ œκ±°λ©λ‹ˆλ‹€.
const μ—΄κ±°ν˜• λ©€λ²„λŠ” μ‚¬μš©ν•˜λŠ” μ‚¬μ΄νŠΈμ—μ„œ 인라인(inline)λ©λ‹ˆλ‹€.
const μ—΄κ±°ν˜•μ€ κ³„μ‚°λœ 멀버λ₯Ό κ°€μ§ˆμˆ˜ μ—†κΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•©λ‹ˆλ‹€.

const enum Directions {
    Up,
    Down,
    Left,
    Right
}

let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]

μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 컴파일 λ©λ‹ˆλ‹€.

var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

μ•°λΉ„μ–ΈνŠΈ μ—΄κ±°ν˜• (Ambient enums)

declare enum Enum {
    A = 1,
    B,
    C = 2
}

μ•°λΉ„μ–ΈνŠΈ μ—΄κ±°ν˜•κ³Ό λΉ„μ•°λΉ„μ–ΈνŠΈ μ—΄κ±°ν˜•μ˜ μ€‘μš”ν•œ 차이점 쀑 ν•˜λ‚˜λŠ” 일반 μ—΄κ±°ν˜•μ—μ„œ μ΄ˆκΈ°ν™”κ°€ μ—†λŠ” λ©€λ²„λŠ” 이전 μ—΄κ±°ν˜• 멀버가 μƒμˆ˜λ‘œ κ°„μ£Όλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
λ°˜λŒ€λ‘œ, μ΄ˆκΈ°ν™”κ°€ μ—†λŠ” μ•°λΉ„μ–ΈνŠΈ (그리고 λΉ„μƒμˆ˜(non-const)) μ—΄κ±°ν˜• λ©€λ²„λŠ” 항상 κ³„μ‚°λœ κ²ƒμœΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.