์๋ฃ ์ถ์ํ
๊ตฌํ์ ๊ฐ์ถ๊ธฐ ์ํด์๋ ์ถ์ํ๊ฐ ํ์ํ๋ค
Getter์ Setter๊ฐ ์๋, ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํด ์ฌ์ฉ์๊ฐ ๊ตฌํ์ ๋ชจ๋ฅธ ์ฑ ์๋ฃ์ ํต์ฌ์ ์กฐ์ํ ์ ์์ด์ผ ํ๋ค.
์๋ฃ๋ฅผ ์ธ์ธํ๊ฒ ๊ณต๊ฐํ๊ธฐ๋ณด๋ค๋ ์ถ์์ ์ธ ๊ฐ๋ ์ผ๋ก ํํํ๋ ํธ์ด ์ข๋ค
์๋ฃ/๊ฐ์ฒด ๋น๋์นญ
๊ฐ์ฒด์ ์๋ฃ ๊ตฌ์กฐ์ ์ ์๋ ๋ณธ์ง์ ์ผ๋ก ์๋ฐ๋๋ค.
- ๊ฐ์ฒด: ์ถ์ํ ๋ค๋ก ์๋ฃ๋ฅผ ์จ๊ธด ์ฑ ์๋ฃ๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ง ๊ณต๊ฐํ๋ค.
- ์๋ฃ ๊ตฌ์กฐ: ์๋ฃ๋ฅผ ๊ทธ๋๋ก ๊ณต๊ฐํ๋ฉฐ ๋ณ๋ค๋ฅธ ํจ์๋ ์ ๊ณตํ์ง ์๋๋ค.
์ฌ์ํด ๋ณด์ด์ง๋ง ์ด ์ฐจ์ด๊ฐ ๋ฏธ์น๋ ์ํฅ์ ๋งค์ฐ ํฌ๋ค.
์์ ๋ฅผ ํตํด ๋์ ์ฐจ์ด์ ์ ์์ธํ ์์๋ณด์
๋ํ ํด๋์ค๋ฅผ ์๋ฃ ๊ตฌ์กฐ๋ก ๊ตฌํ - ์ ์ฐจ์ ์ธ ๋ํ
class Square {
topLeft: Point;
side: number;
}
class Rectangle {
topLeft: Point;
height: number;
width: number;
}
class Circle {
center: Point;
radius: number;
}
class Geometry {
PI = 3.1415;
area(shape: Object) {
if (shape instanceof Square) {
return shape.side * shape.side;
} else if (shape instanceof Rectangle) {
return shape.height * shape.width;
} else if (shape instanceof Circle) {
return shape.radius * shape.radius * this.PI;
}
throw Error('NoSuchShapeException')
}
}
๊ฐ ๋ํ ํด๋์ค๋ ์๋ฌด ๋ฉ์๋๋ ์ ๊ณตํ์ง ์๋๋ค. ๋์ ๋ฐฉ์์ Geometry ํด๋์ค์์ ๊ตฌํํ๋ค.
์ด๋ ๊ฒ ์๋ฃ ๊ตฌ์กฐ๋ก ๊ตฌํํ์ ๋๋
- ์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํ ๋ ๋ํ ํด๋์ค๋ ์๋ฌด ์ํฅ๋ ๋ฐ์ง ์๋๋ค. (Geometry์ ์๋ก์ด ๋ฉ์๋๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ฏ๋ก)
- ๋ฐ๋๋ก ์ ๋ํ ํด๋์ค๋ฅผ ์ถ๊ฐํ ๋๋ Geometry์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์์ ํด์ผ ํ๋ค.
๋ํ ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ๊ตฌํ - ๋คํ์ ์ธ ๋ํ
abstract class Shape {
public abstract area(): number;
}
class Square implements Shape {
private topLeft: Point;
private side: number;
public area(): number {
return this.side * this.side;
}
}
class Rectangle implements Shape {
private topLeft: Point;
private height: number;
private width: number;
public area(): number {
return this.width * this.height;
}
}
class Circle implements Shape {
PI = 3.1415;
private center: Point;
private radius: number;
public area(): number {
return this.radius * this.radius * this.PI;
}
}
์ ์ฐจ์ ์ธ ๋ํ๊ณผ ์ ๋ฐ๋์ ํน์ง์ ๊ฐ๋๋ค.
- ์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ชจ๋ ํด๋์ค๋ฅผ ์์ ํด์ผ ํ๋ค.
- ๋ฐ๋๋ก ์ ๋ํ ํด๋์ค๋ฅผ ์ถ๊ฐํ ๋๋ ๊ธฐ์กด ๋ฉ์๋๋ ์๋ฌด๋ฐ ์ํฅ๋ ๋ฐ์ง ์๋๋ค.
์๋ฃ ๊ตฌ์กฐ vs ๊ฐ์ฒด
์์ ์ดํด๋ดค๋ฏ์ด ์๋ฃ ๊ตฌ์กฐ์ ๊ฐ์ฒด๋ ๊ทผ๋ณธ์ ์ผ๋ก ์๋ถ๋๋ค.
๊ฐ์ฒด ์งํฅ ์ฝ๋์์ ์ด๋ ค์ด ๋ณ๊ฒฝ์ ์ ์ฐจ์ ์ธ ์ฝ๋์์ ์ฌ์ฐ๋ฉฐ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
์ ์ฐจ์ ์ธ ์ฝ๋๋ ๊ธฐ์กด ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ํจ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค.
๊ฐ์ฒด ์งํฅ ์ฝ๋๋ ๊ธฐ์กด ํจ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค.
๋๋ฏธํฐ ๋ฒ์น
๋๋ฏธํฐ ๋ฒ์น์ด๋, ๋ชจ๋์ ์์ ์ด ์กฐ์ํ๋ ๊ฐ์ฒด์ ์์ฌ์ ์ ๋ชฐ๋ผ์ผ ํ๋ค๋ ๋ฒ์น์ด๋ค.
๊ฐ์ฒด๋ ์๋ฃ๋ฅผ ์จ๊ธฐ๊ณ ํจ์๋ฅผ ๊ณต๊ฐํ๋ค.
ํด๋์ค C์ ๋ฉ์๋ f๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ํธ์ถํด์ผ ํ๋ค.
- ํด๋์ค C
- f๊ฐ ์์ฑํ ๊ฐ์ฒด
- f ์ธ์๋ก ๋์ด์จ ๊ฐ์ฒด
- C ์ธ์คํด์ค ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ฒด
๋จ, ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ ํธ์ถํ๋ฉด ์๋๋ค.
์ก์ข ๊ตฌ์กฐ
์ ๋ฐ์ ๊ฐ์ฒด, ์ ๋ฐ์ ์๋ฃ ๊ตฌ์กฐ์ธ ์ก์ข ๊ตฌ์กฐ๋ ์๋ก์ด ํจ์์ ์๋ก์ด ์๋ฃ ๊ตฌ์กฐ ๋ชจ๋ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐ ํจ์๋ ํ์ ์ ๋ณดํธํ ์ง ๊ณต๊ฐํ ์ง ํ์ ํ์ง ๋ชปํ ๋ ์ด๋ฐ ๊ตฌ์กฐ๊ฐ ๋์ค๊ฒ ๋๋ค.
์๋ฃ ์ ๋ฌ ๊ฐ์ฒด (DTO)
DTO: ๊ณต๊ฐ ๋ณ์๋ง ์๊ณ ํจ์๊ฐ ์๋ ์๋ฃ ๊ตฌ์กฐ์ฒด
์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๊ฑฐ๋ ์์ผ์์ ๋ฐ์ ๋ฉ์์ง์ ๊ตฌ๋ฌธ์ ๋ถ์ํ ๋ ์ ์ฉํ๋ค.
ํ์ฑ ๋ ์ฝ๋
DTO์ ํน์ํ ํํ.
๊ณต๊ฐ ๋ณ์ ๋๋ ๋น๊ณต๊ฐ ๋ณ์์ getter/setter๊ฐ ์๋ ์๋ฃ ๊ตฌ์กฐ๋ก, save๋ find์ ๊ฐ์ ํ์ ํจ์ ๋ํ ์ ๊ณตํ๋ค.
ํ์ฑ ๋ ์ฝ๋๋ฅผ ๊ตฌํํ ๋ ์๋ฃ ๊ตฌ์กฐ๋ก ์ทจ๊ธํ๋ค.
- ๋น์ฆ๋์ค ๊ท์น ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ๊ฐ์ฒด๋ก ์ทจ๊ธํ๊ฒ ๋๋ฉด ์ก์ข ๊ตฌ์กฐ๊ฐ ๋์ค๊ฒ ๋๋ค.
- ๋น์ฆ๋์ค ๊ท์น์ ๋ด์ผ๋ฉด์ ๋ด๋ถ ์๋ฃ๋ฅผ ์จ๊ธฐ๋ ๊ฐ์ฒด๋ ๋ฐ๋ก ์์ฑํ๋ค.
๋ง๋ฌด๋ฆฌ
๊ฐ๋ฐ์๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด๋ผ๋ ์๊ฐ์ ๋น ์ ธ์์ผ๋ฉด ์๋๋ค.
์๋ก์ด ํจ์๊ฐ ์ถ๊ฐ๋๋ ์ผ์ด์ค๊ฐ ๋ง์ผ๋ฉด ์ ์ฐจ์ ์ธ ์ฝ๋๊ฐ ๋ ์ ํฉํ ์ ์๋ค.
์์คํ ์ ํน์ฑ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ํฉํ ๊ตฌํ ๋ฐฉ์์ ํํด์ผ ํ ๊ฒ์ด๋ค.
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํด๋ฆฐ์ฝ๋] 7์ฅ ์ค๋ฅ ์ฒ๋ฆฌ (0) | 2023.07.12 |
---|---|
[three.js] ๊ทธ๋ฆผ์๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ (0) | 2023.07.06 |
[three.js] ์นด๋ฉ๋ผ - PerspectiveCamera vs OrthographicCamera (0) | 2023.07.01 |
[three.js] ์ฌ๋ฌ๊ฐ์ง ๊ด์์ ๋ค๋ค๋ณด์ (0) | 2023.06.23 |
[ํด๋ฆฐ์ฝ๋] 5์ฅ ํ์ ๋ง์ถ๊ธฐ (0) | 2023.06.23 |