ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ readonly ํ์ ๊ณผ ๋ถ๋ณ์ฑ ๊ฐ์ ํจํด์ ํ์ํฉ๋๋ค. ๋ ์์ ํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ ์ฝ๋๋ฅผ ์ํด ์ด๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
Readonly ํ์ : ํ๋ ํ๋ก๊ทธ๋๋ฐ์์์ ๋ถ๋ณ์ฑ ๊ฐ์ ํจํด
๋์์์ด ์งํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ์๋์น ์์ ์์ ์ฌํญ์ ๋ฐฉ์งํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ๋ถ๋ณ์ฑ์ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋ ํ ๋ณ๊ฒฝ๋์ด์๋ ์ ๋๋ค๋ ์์น์ผ๋ก ์ด๋ฌํ ๋ฌธ์ ์ ๋ํ ๊ฐ๋ ฅํ ํด๊ฒฐ์ฑ ์ ์ ์ํฉ๋๋ค. ๋ง์ ์ต์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ธ Readonly ํ์ ์ ์ปดํ์ผ ์ ๋ถ๋ณ์ฑ์ ๊ฐ์ ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด ๊ธฐ์ฌ์์๋ Readonly ํ์ ์ ๊ฐ๋ ์ ์์ธํ ์ดํด๋ณด๊ณ , ๋ค์ํ ๋ถ๋ณ์ฑ ๊ฐ์ ํจํด์ ํ์ํ๋ฉฐ, ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ฑธ์ณ ์ค์ ์์ ๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ๋ฒ๊ณผ ์ด์ ์ ์ค๋ช ํฉ๋๋ค.
๋ถ๋ณ์ฑ์ด๋ ๋ฌด์์ด๋ฉฐ ์ ์ค์ํ ๊น์?
๋ถ๋ณ์ฑ์ ์ปดํจํฐ ๊ณผํ, ํนํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋๋ค. ๋ถ๋ณ ๊ฐ์ฒด๋ ์์ฑ๋ ํ ์ํ๋ฅผ ์์ ํ ์ ์๋ ๊ฐ์ฒด์ ๋๋ค. ์ฆ, ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ์ด๊ธฐํ๋๋ฉด ํด๋น ๊ฐ์ ์๋ช ๋์ ์ผ์ ํ๊ฒ ์ ์ง๋ฉ๋๋ค.
๋ถ๋ณ์ฑ์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ณต์ก์ฑ ๊ฐ์: ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ฝ๋์ ๋ํ ์ถ๋ก ์ ๋จ์ํํฉ๋๋ค. ๊ฐ์ฒด์ ์ํ๊ฐ ์๊ธฐ์น ์๊ฒ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก ๋์์ ์ดํดํ๊ณ ์์ธกํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ์ค๋ ๋ ์์ ์ฑ: ๋ถ๋ณ์ฑ์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋ณต์กํ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ํ์์ฑ์ ์์ ์ค๋๋ค. ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ฒฝ์ ์กฐ๊ฑด์ด๋ ๋ฐ์ดํฐ ์์์ ์ํ ์์ด ์ค๋ ๋ ๊ฐ์ ์์ ํ๊ฒ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ์บ์ฑ ๋ฐ ๋ฉ๋ชจ์ด์ ์ด์ : ๋ถ๋ณ ๊ฐ์ฒด๋ ์บ์ฑ ๋ฐ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํ๋ฅญํ ํ๋ณด์ ๋๋ค. ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก ๊ด๋ จ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ๊ฒ ์บ์ํ๊ณ ๋ถ์ค ๋ฐ์ดํฐ์ ์ํ ์์ด ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋๋ฒ๊น ๋ฐ ๊ฐ์ฌ: ๋ถ๋ณ์ฑ์ ๋๋ฒ๊น ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๊ด๋ จ๋ ๋ฐ์ดํฐ๊ฐ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๊ณณ์์ ์ค์๋ก ์์ ๋์ง ์์๋ค๋ ๊ฒ์ ํ์ ํ ์ ์์ต๋๋ค. ๋ํ ๋ถ๋ณ์ฑ์ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ฌํ๊ณ ์ถ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๊ฐ์ํ๋ ํ ์คํธ: ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ํ ์คํธํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํฉ๋๋ค. ๋ฎคํ ์ด์ ์ ๋ถ์์ฉ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ณต์กํ ํ ์คํธ ํฝ์ค์ฒ๋ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ์ค์ ํ ํ์ ์์ด ๊ณ์ฐ์ ์ ํ์ฑ์ ๊ฒ์ฆํ๋ ๋ฐ ์ง์คํ ์ ์์ต๋๋ค.
Readonly ํ์ : ์ปดํ์ผ ์๊ฐ ๋ถ๋ณ์ฑ ๋ณด์ฅ
Readonly ํ์ ์ ๋ณ์ ๋๋ ๊ฐ์ฒด ์์ฑ์ด ์ด๊ธฐ ํ ๋น ํ ์์ ๋์ง ์์์ผ ํจ์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ปดํ์ผ๋ฌ๋ ์ด ์ ํ์ ์ ์ฉํ์ฌ ์ค์ ๋๋ ์ ์์ ์ธ ์์ ์ ๋ฐฉ์งํฉ๋๋ค. ์ด ์ปดํ์ผ ์๊ฐ ๊ฒ์ฌ๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๋ ๋ฐ ๋์์ด ๋์ด ๋ฐํ์ ๋ฒ๊ทธ์ ์ํ์ ์ค์ ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ง๋ค Readonly ํ์ ๋ฐ ๋ถ๋ณ์ฑ์ ๋ํ ์ง์ ์์ค์ด ๋ค๋ฆ ๋๋ค. Haskell ๋ฐ Elm๊ณผ ๊ฐ์ ์ผ๋ถ ์ธ์ด๋ ๋ณธ์ง์ ์ผ๋ก ๋ถ๋ณ์ฑ์ด ์๋ ๋ฐ๋ฉด, Java ๋ฐ JavaScript์ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด๋ Readonly ์์ ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๋ถ๋ณ์ฑ์ ๊ฐ์ ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
์ธ์ด๋ณ ๋ถ๋ณ์ฑ ๊ฐ์ ํจํด
์ฌ๋ฌ ์ธ๊ธฐ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ Readonly ํ์ ๊ณผ ๋ถ๋ณ์ฑ ํจํด์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. TypeScript
TypeScript๋ ๋ถ๋ณ์ฑ์ ๊ฐ์ ํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
readonly์์ ์:readonly์์ ์๋ ๊ฐ์ฒด ๋๋ ํด๋์ค์ ์์ฑ์ ์ ์ฉํ์ฌ ์ด๊ธฐํ ํ ์์ ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
interface Point {
readonly x: number;
readonly y: number;
}
const p: Point = { x: 10, y: 20 };
// p.x = 30; // ์ค๋ฅ: 'x'๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ด๋ฏ๋ก ํ ๋นํ ์ ์์ต๋๋ค.
Readonly์ ํธ๋ฆฌํฐ ํ์ :Readonly<T>์ ํธ๋ฆฌํฐ ํ์ ์ ๊ฐ์ฒด์ ๋ชจ๋ ์์ฑ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
interface Person {
name: string;
age: number;
}
const person: Readonly<Person> = { name: "Alice", age: 30 };
// person.age = 31; // ์ค๋ฅ: 'age'๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ด๋ฏ๋ก ํ ๋นํ ์ ์์ต๋๋ค.
ReadonlyArrayํ์ :ReadonlyArray<T>ํ์ ์ ๋ฐฐ์ด์ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค.push,pop๋ฐsplice์ ๊ฐ์ ๋ฉ์๋๋ReadonlyArray์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const numbers: ReadonlyArray<number> = [1, 2, 3];
// numbers.push(4); // ์ค๋ฅ: 'push' ์์ฑ์ด 'readonly number[]' ํ์
์ ์กด์ฌํ์ง ์์ต๋๋ค.
์์ : ๋ถ๋ณ ๋ฐ์ดํฐ ํด๋์ค
class ImmutablePoint {
private readonly _x: number;
private readonly _y: number;
constructor(x: number, y: number) {
this._x = x;
this._y = y;
}
get x(): number {
return this._x;
}
get y(): number {
return this._y;
}
withX(newX: number): ImmutablePoint {
return new ImmutablePoint(newX, this._y);
}
withY(newY: number): ImmutablePoint {
return new ImmutablePoint(this._x, newY);
}
}
const point = new ImmutablePoint(5, 10);
const newPoint = point.withX(15); // ์
๋ฐ์ดํธ๋ ๊ฐ์ด ์๋ ์ ์ธ์คํด์ค ์์ฑ
console.log(point.x); // ์ถ๋ ฅ: 5
console.log(newPoint.x); // ์ถ๋ ฅ: 15
2. C#
C#์ readonly ํค์๋ ๋ฐ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํฌํจํ์ฌ ๋ถ๋ณ์ฑ์ ๊ฐ์ ํ๋ ์ฌ๋ฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
readonlyํค์๋:readonlyํค์๋๋ ์ ์ธ ๋๋ ์์ฑ์์์๋ง ๊ฐ์ ํ ๋นํ ์ ์๋ ํ๋๋ฅผ ์ ์ธํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
public class Person {
private readonly string _name;
private readonly DateTime _birthDate;
public Person(string name, DateTime birthDate) {
this._name = name;
this._birthDate = birthDate;
}
public string Name { get { return _name; } }
public DateTime BirthDate { get { return _birthDate; } }
}
// ์ฌ์ฉ ์
var person = new Person("Bob", new DateTime(1990, 1, 1));
// person._name = "Charlie"; // ์ค๋ฅ: ์ฝ๊ธฐ ์ ์ฉ ํ๋์ ํ ๋นํ ์ ์์ต๋๋ค.
- ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ: C#์
System.Collections.Immutable๋ค์์คํ์ด์ค์์ ๋ถ๋ณ ์ปฌ๋ ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ปฌ๋ ์ ์ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๊ณ ๋์ ์์ ์ ์ํด ํจ์จ์ ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค.
using System.Collections.Immutable;
ImmutableList<int> numbers = ImmutableList.Create(1, 2, 3);
ImmutableList<int> newNumbers = numbers.Add(4);
Console.WriteLine(numbers.Count); // ์ถ๋ ฅ: 3
Console.WriteLine(newNumbers.Count); // ์ถ๋ ฅ: 4
- ๋ ์ฝ๋: C# 9์ ๋์ ๋ ๋ ์ฝ๋๋ ๋ถ๋ณ ๋ฐ์ดํฐ ํ์์ ๋ง๋๋ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ ์ฝ๋๋ ๊ธฐ๋ณธ ์ ๊ณต ๋๋ฑ์ฑ ๋ฐ ๋ถ๋ณ์ฑ์ ๊ฐ๋ ๊ฐ ๊ธฐ๋ฐ ํ์์ ๋๋ค.
public record Point(int X, int Y);
Point p1 = new Point(10, 20);
Point p2 = p1 with { X = 30 }; // X๊ฐ ์
๋ฐ์ดํธ๋ ์ ๋ ์ฝ๋ ์์ฑ
Console.WriteLine(p1); // ์ถ๋ ฅ: Point { X = 10, Y = 20 }
Console.WriteLine(p2); // ์ถ๋ ฅ: Point { X = 30, Y = 20 }
3. Java
Java์๋ TypeScript ๋๋ C#๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ์ ๊ณต Readonly ํ์ ์ด ์์ง๋ง ์ ์คํ ์ค๊ณ์ final ํ๋ ์ฌ์ฉ์ ํตํด ๋ถ๋ณ์ฑ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
finalํค์๋:finalํค์๋๋ ๋ณ์์ ๊ฐ์ ํ ๋ฒ๋ง ํ ๋นํ ์ ์๋๋ก ํฉ๋๋ค. ํ๋์ ์ ์ฉํ๋ฉด ์ด๊ธฐํ ํ ํ๋๊ฐ ๋ถ๋ณํ๊ฒ ๋ฉ๋๋ค.
public class Circle {
private final double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
}
// ์ฌ์ฉ ์
Circle circle = new Circle(5.0);
// circle.radius = 10.0; // ์ค๋ฅ: final ๋ณ์ radius์ ๊ฐ์ ํ ๋นํ ์ ์์ต๋๋ค.
- ๋ฐฉ์ด์ ๋ณต์ฌ: ๋ถ๋ณ ํด๋์ค ๋ด์์ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ ๋๋ ๋ฐฉ์ด์ ๋ณต์ฌ๊ฐ ์ค์ํฉ๋๋ค. ์์ฑ์ ์ธ์๋ก ๋ฐ๊ฑฐ๋ getter ๋ฉ์๋์์ ๋ฐํํ ๋ ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ์ ๋ง๋ญ๋๋ค.
import java.util.Date;
public final class Event {
private final Date eventDate;
public Event(Date date) {
this.eventDate = new Date(date.getTime()); // ๋ฐฉ์ด์ ๋ณต์ฌ
}
public Date getEventDate() {
return new Date(eventDate.getTime()); // ๋ฐฉ์ด์ ๋ณต์ฌ
}
}
//์ฌ์ฉ ์
Date originalDate = new Date();
Event event = new Event(originalDate);
Date retrievedDate = event.getEventDate();
retrievedDate.setTime(0); //๊ฒ์๋ ๋ ์ง ์์
System.out.println("Original Date: " + originalDate); //์๋ณธ ๋ ์ง๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
System.out.println("Retrieved Date: " + retrievedDate);
- ๋ถ๋ณ ์ปฌ๋ ์
: Java Collections Framework๋
Collections.unmodifiableList,Collections.unmodifiableSet๋ฐCollections.unmodifiableMap์ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์ ์ ๋ถ๋ณ ๋ทฐ๋ฅผ ๋ง๋๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ImmutableListExample {
public static void main(String[] args) {
List<String> originalList = new ArrayList<>();
originalList.add("apple");
originalList.add("banana");
List<String> immutableList = Collections.unmodifiableList(originalList);
// immutableList.add("orange"); // UnsupportedOperationException ๋ฐ์
}
}
4. Kotlin
Kotlin์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ฌ ๋ถ๋ณ์ฑ์ ๊ฐ์ ํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
valํค์๋: Java์final๊ณผ ์ ์ฌํ๊ฒval์ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ์ ์ธํฉ๋๋ค. ํ ๋น๋๋ฉด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
data class Configuration(val host: String, val port: Int)
fun main() {
val config = Configuration("localhost", 8080)
// config.port = 9000 // ์ปดํ์ผ ์ค๋ฅ: val์ ์ฌํ ๋นํ ์ ์์ต๋๋ค.
println("Host: ${config.host}, Port: ${config.port}")
}
- ๋ฐ์ดํฐ ํด๋์ค์
copy()๋ฉ์๋: Kotlin์ ๋ฐ์ดํฐ ํด๋์ค๋copy()๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์ ๊ณตํ์ฌ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ฉด์ ์์ ๋ ์์ฑ์ผ๋ก ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
data class Person(val name: String, val age: Int)
fun main() {
val person1 = Person("Alice", 30)
val person2 = person1.copy(age = 31) // ์
๋ฐ์ดํธ๋ ๋์ด๋ก ์ ์ธ์คํด์ค ์์ฑ
println("Person 1: ${person1}")
println("Person 2: ${person2}")
}
- ๋ถ๋ณ ์ปฌ๋ ์
: Kotlin์
List,Set๋ฐMap๊ณผ ๊ฐ์ ๋ถ๋ณ ์ปฌ๋ ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.listOf,setOf๋ฐmapOf์ ๊ฐ์ ํฉํฐ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ณ ์ปฌ๋ ์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ๋ณ ์ปฌ๋ ์ ์ ๊ฒฝ์ฐmutableListOf,mutableSetOf๋ฐmutableMapOf๋ฅผ ์ฌ์ฉํ๋ ์์ฑ ํ์๋ ๋ถ๋ณ์ฑ์ ๊ฐ์ ํ์ง ์๋๋ค๋ ์ ์ ์ ์ํ์ญ์์ค.
fun main() {
val numbers: List<Int> = listOf(1, 2, 3)
//numbers.add(4) // ์ปดํ์ผ ์ค๋ฅ: add๊ฐ List์ ์ ์๋์ง ์์์ต๋๋ค.
println(numbers)
val mutableNumbers = mutableListOf(1,2,3) // ์์ฑ ํ ์์ ๊ฐ๋ฅ
mutableNumbers.add(4)
println(mutableNumbers)
val readOnlyNumbers: List<Int> = mutableNumbers // ํ์ง๋ง ํ์
์ ์ฌ์ ํ ๊ฐ๋ณ์ ์
๋๋ค!
// readOnlyNumbers.add(5) // ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
println(mutableNumbers) // ์๋ณธ์ด ์ํฅ์ ๋ฐ์ต๋๋ค.
}
์์ : ๋ฐ์ดํฐ ํด๋์ค ๋ฐ ๋ถ๋ณ ๋ชฉ๋ก ๊ฒฐํฉ
data class Order(val orderId: Int, val items: List<String>)
fun main() {
val order1 = Order(1, listOf("Laptop", "Mouse"))
val newItems = order1.items + "Keyboard" // ์ ๋ชฉ๋ก ์์ฑ
val order2 = order1.copy(items = newItems)
println("Order 1: ${order1}")
println("Order 2: ${order2}")
}
5. Scala
Scala๋ ๋ถ๋ณ์ฑ์ ํต์ฌ ์์น์ผ๋ก ์ฅ๋ คํฉ๋๋ค. ์ด ์ธ์ด๋ ๊ธฐ๋ณธ ์ ๊ณต ๋ถ๋ณ ์ปฌ๋ ์
์ ์ ๊ณตํ๊ณ ๋ถ๋ณ ๋ณ์๋ฅผ ์ ์ธํ๋ ๋ฐ val ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
valํค์๋: Scala์์val์ ๋ถ๋ณ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค. ํ ๋น๋๋ฉด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
object ImmutableExample {
def main(args: Array[String]): Unit = {
val message = "Hello, Scala!"
// message = "Goodbye, Scala!" // ์ค๋ฅ: val์ ์ฌํ ๋น
println(message)
}
}
- ๋ถ๋ณ ์ปฌ๋ ์ : Scala์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ ์ปฌ๋ ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ปฌ๋ ์ ์ ๋งค์ฐ ํจ์จ์ ์ด๋ฉฐ ๋ถ๋ณ ์์ ์ ์ํด ์ต์ ํ๋์ด ์์ต๋๋ค.
object ImmutableListExample {
def main(args: Array[String]): Unit = {
val numbers = List(1, 2, 3)
// numbers += 4 // ์ค๋ฅ: value +=๊ฐ List[Int]์ ๋ฉค๋ฒ๊ฐ ์๋
val newNumbers = numbers :+ 4 // 4๊ฐ ์ถ๊ฐ๋ ์ ๋ชฉ๋ก ์์ฑ
println(s"Original list: $numbers")
println(s"New list: $newNumbers")
}
}
- Case ํด๋์ค: Scala์ Case ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณํฉ๋๋ค. ๊ณ ์ ๋ ์์ฑ ์งํฉ์ด ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
case class Address(street: String, city: String, postalCode: String)
object CaseClassExample {
def main(args: Array[String]): Unit = {
val address1 = Address("123 Main St", "Anytown", "12345")
val address2 = address1.copy(city = "New City") // ๋์๊ฐ ์
๋ฐ์ดํธ๋ ์ ์ธ์คํด์ค ์์ฑ
println(s"Address 1: $address1")
println(s"Address 2: $address2")
}
}
๋ถ๋ณ์ฑ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Readonly ํ์ ๊ณผ ๋ถ๋ณ์ฑ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ํธ: ๊ฐ๋ฅํ๋ฉด ๊ฐ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ณด๋ค ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ํํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค์๋ก ์์ ํ ์ํ์ด ์ค์ด๋ค๊ณ ์ฝ๋์ ๋ํ ์ถ๋ก ์ด ๋จ์ํ๋ฉ๋๋ค.
- Readonly ์์ ์ ์ฌ์ฉ: ์ด๊ธฐํ ํ ์์ ํด์๋ ์ ๋๋ ๊ฐ์ฒด ์์ฑ ๋ฐ ๋ณ์์ Readonly ์์ ์๋ฅผ ์ ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปดํ์ผ ์ ๋ถ๋ณ์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค.
- ๋ฐฉ์ด์ ๋ณต์ฌ: ๋ถ๋ณ ํด๋์ค ๋ด์์ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ ๋๋ ํญ์ ๋ฐฉ์ด์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด ์ธ๋ถ ์์ ์ด ๊ฐ์ฒด์ ๋ด๋ถ ์ํ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํฉ๋๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณ ๋ ค: ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ถ๋ณ ํจํด์ ๊ตฌํ์ ๋จ์ํํ๊ณ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ํ ๊ต์ก: ํ์ด ๋ถ๋ณ์ฑ ์์น๊ณผ Readonly ํ์ ์ฌ์ฉ์ ์ด์ ์ ์ดํดํ๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ค๊ณ ๋ฐ ์ฝ๋ ๊ตฌํ์ ๋ํด ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ธ์ด๋ณ ๊ธฐ๋ฅ ์ดํด: ๊ฐ ์ธ์ด๋ ๋ถ๋ณ์ฑ์ ํํํ๊ณ ๊ฐ์ ํ๋ ์ฝ๊ฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋์ ์ธ์ด์์ ์ ๊ณตํ๋ ๋๊ตฌ์ ๊ทธ ์ ํ ์ฌํญ์ ์ฒ ์ ํ ์ดํดํ์ญ์์ค. ์๋ฅผ ๋ค์ด Java์์ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ `final` ํ๋๋ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ถ๋ณํ๊ฒ ๋ง๋ค์ง ์๊ณ ์ฐธ์กฐ๋ง ๋ถ๋ณํ๊ฒ ๋ง๋ญ๋๋ค.
์ค์ ์ ํ๋ฆฌ์ผ์ด์
๋ถ๋ณ์ฑ์ ๋ค์ํ ์ค์ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค.
- ๋์์ฑ: ๋ฉํฐ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ถ๋ณ์ฑ์ ์ ๊ธ ๋ฐ ๊ธฐํ ๋๊ธฐํ ๊ธฐ๋ณธ ์์์ ํ์์ฑ์ ์์ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ๋จ์ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ๊ธ์ต ๊ฑฐ๋ ์ฒ๋ฆฌ ์์คํ ์ ๊ณ ๋ คํ์ญ์์ค. ๋ถ๋ณ ๊ฑฐ๋ ๊ฐ์ฒด๋ ๋ฐ์ดํฐ ์์ ์ํ ์์ด ์์ ํ๊ฒ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ์์ฑ: ๋ถ๋ณ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ฐ ๋ถ๋ณ ์ด๋ฒคํธ ์ํ์ค์ ์ํด ๊ฒฐ์ ๋๋ ์ํคํ ์ฒ ํจํด์ธ ์ด๋ฒคํธ ์์ฑ์ ์ด์์ ๋๋ค. ๊ฐ ์ด๋ฒคํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ๋ด๋ฉฐ ์ด๋ฒคํธ๋ฅผ ๋ค์ ์คํํ์ฌ ํ์ฌ ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์์ต๋๋ค. Git๊ณผ ๊ฐ์ ๋ฒ์ ์ ์ด ์์คํ ์ ์๊ฐํด ๋ณด์ญ์์ค. ๊ฐ ์ปค๋ฐ์ ์ฝ๋๋ฒ ์ด์ค์ ๋ถ๋ณ ์ค๋ ์ท์ด๋ฉฐ ์ปค๋ฐ ๊ธฐ๋ก์ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์ฝ๋์ ์งํ๋ฅผ ๋ํ๋ ๋๋ค.
- ๋ฐ์ดํฐ ๋ถ์: ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๋จธ์ ๋ฌ๋์์ ๋ถ๋ณ์ฑ์ ๋ถ์ ํ์ดํ๋ผ์ธ ์ ์ฒด์์ ๋ฐ์ดํฐ๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋๋๋ก ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋์น ์์ ์์ ์ผ๋ก ์ธํด ๊ฒฐ๊ณผ๊ฐ ์๊ณก๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ณผํ์ ์๋ฎฌ๋ ์ด์ ์์ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์๋ฎฌ๋ ์ด์ ๊ฒฐ๊ณผ๊ฐ ์ฌํ ๊ฐ๋ฅํ๊ณ ์ฐ๋ฐ์ ์ธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ์ง ์์์ ๋ณด์ฅํฉ๋๋ค.
- ์น ๊ฐ๋ฐ: React ๋ฐ Redux์ ๊ฐ์ ํ๋ ์์ํฌ๋ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ถ๋ณ์ฑ์ ํฌ๊ฒ ์์กดํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ณ๊ฒฝ์ ๋ํด ๋ ์ฝ๊ฒ ์ถ๋ก ํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋ธ๋ก์ฒด์ธ ๊ธฐ์ : ๋ธ๋ก์ฒด์ธ์ ๋ณธ์ง์ ์ผ๋ก ๋ถ๋ณํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋ธ๋ก์ ๊ธฐ๋ก๋๋ฉด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ธ๋ก์ฒด์ธ์ ์ํธํํ ๋ฐ ๊ณต๊ธ๋ง ๊ด๋ฆฌ ์์คํ ๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ฐ ๋ณด์์ด ๊ฐ์ฅ ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ ์ ๋๋ค.
๊ฒฐ๋ก
Readonly ํ์ ๊ณผ ๋ถ๋ณ์ฑ์ ๋ ์์ ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ ๊ฐ๋ ฅํ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๋ถ๋ณ์ฑ ์์น์ ์์ฉํ๊ณ Readonly ์์ ์๋ฅผ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์ค๋ ๋ ์์ ์ฑ์ ํฅ์์ํค๋ฉฐ ๋๋ฒ๊น ์ ๋จ์ํํ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๊ณ์ ์งํํจ์ ๋ฐ๋ผ ๋ถ๋ณ์ฑ์ ๊ฐ์ ํ๋ ํจ์ฌ ๋ ์ ๊ตํ ๋ฉ์ปค๋์ฆ์ด ๋ฑ์ฅํ ๊ฒ์ผ๋ก ์์ํ ์ ์์ผ๋ฉฐ ์ด๋ ์ต์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋์ฑ ํ์์ ์ธ ๋ถ๋ถ์ด ๋ ๊ฒ์ ๋๋ค.
์ด ๊ธฐ์ฌ์์ ๋ ผ์๋ ๊ฐ๋ ๊ณผ ํจํด์ ์ดํดํ๊ณ ์ ์ฉํจ์ผ๋ก์จ ๋ถ๋ณ์ฑ์ ์ด์ ์ ํ์ฉํ๊ณ ๋ ์์ ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.