๊ฐ์
Dart ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ static ํค์๋๋ ํน์ ํด๋์ค์ ๊ด๋ จ๋ ๋ณ์๋ ๋ฉ์๋๋ฅผ ํด๋์ค ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค ์์ฒด์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ก ์ธํด ํด๋น ๋ฉ์๋๋ ๋ณ์๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์ ๊ทผ์ด ๊ฐ๋ฅํด์.
static ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ ์ฅ๋๋ฉฐ, ํ๋ก๊ทธ๋จ์ ๋ผ์ดํ์ฌ์ดํด ๋์ ์ง์๋์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํฉ๋๋ค.
Dart์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋, ๋ค์๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ๊ณผ ๊ด๋ จ๋ฉ๋๋ค.
- Code Segment : ํ๋ก๊ทธ๋จ์ ์คํ ์ฝ๋๊ฐ ์ ์ฅ
- Data Segment : ์ด๊ธฐํ๋ ์ ์ญ ๋ณ์ ๋ฐ static ๋ณ์๊ฐ ์ ์ฅ
- BSS Segment : ์ด๊ธฐํ๋์ง ์์ ์ ์ญ ๋ณ์ ๋ฐ static ๋ณ์๊ฐ ์ ์ฅ
- Stack : ํจ์ ํธ์ถ๊ณผ ๋ก์ปฌ ๋ณ์ ์ ์ฅ์ ์ฌ์ฉ
- Heap : ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฅ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋จ์ธ Dart ๊ทธ๋ฆฌ๊ณ Javasript ๋ชจ๋ ๋ฐํ์ ๊ฐ์ฒด๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๊ณ ํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น์ ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ณดํต ๋ง์ด ์ฌ์ฉํ๋๋ฐ, static์ ES6 ์ดํ ํด๋์ค ๋ฌธ๋ฒ์์ ๋์ ๋์์ฃ .
Dart์์ Static ์ฌ์ฉ์ ์ํ ๋น๋์
"static" ์ ํ๋ก๊ทธ๋๋ฐ์์ ๋ณ์๋ ํจ์์ ํ๋ฒ ํ ๋น๋์ด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋ ํด์ ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
class Car {
static int numberOfWheels = 4; // ์๋์ฐจ ๊ธฐ๋ณธ ํน์ฑ ๋ฐํด 4๊ฐ
String licensePlate;
Car(this.licensePlate);
static void displayWheels() {
print("๋ชจ๋ ์๋์ฐจ๋ $numberOfWheels ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค.");
}
void displayLicensePlate() {
print("์ด ์๋์ฐจ์ ๋ฒํธํ์ $licensePlate ์
๋๋ค.");
}
}
static String carInfo = "์๋์ฐจ ๋ฒํธ ์ ๋ณด";
void main() {
print(carInfo);
// ์๋์ฐจ ๊ฐ์ฒด ์์ฑ
Car myCar = Car("์์ธ 12๋ฐ 4567");
Car yourCar = Car("๊ฒฝ๊ธฐ 78๊ตฌ 1234");
// static ๋ฉ์๋ ํธ์ถ
Car.displayWheels(); // "๋ชจ๋ ์๋์ฐจ๋ 4 ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค." ์ถ๋ ฅ
// ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ
myCar.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ์์ธ 12๋ฐ 4567 ์
๋๋ค." ์ถ๋ ฅ
yourCar.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ๊ฒฝ๊ธฐ 78๊ตฌ 1234 ์
๋๋ค." ์ถ๋ ฅ
}
๊ทธ์ ์, Car ํด๋์ค ๋ด๋ถ์ ์ธ์คํด์ค ์์ฑ ์ ์ด๊ธฐํ ๋ก์ง์ ์คํํ๋ ์ญํ ์ธ ์๋ ์ฝ๋๋ฅผ ๋ด ์๋ค.
Car(this.licensePlate);
์ด ์์ฑ์๋ Car ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋๋ง๋ค ๊ฐ ์ธ์คํด์ค์ ๊ณ ์ ํ licensePlate ๊ฐ์ ์ค์ ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ค๋ฉด ๊ฐ Car ๊ฐ์ฒด์ ๋ํ ๊ณ ์ ํ licensePlate ๊ฐ์ ์ค์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์ ํ๋ฉ๋๋ค. ํด๋น ์ฝ๋๋ licensePlate ์ด๋ผ๋ ํ๋๋ฅผ ์ด๊ธฐํํ๋๋ฐ ๊ฐ๋จํ์ฌ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
ํด๋น ์์ฑ์๊ฐ ์๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฝ๋๊ฐ ๋ณ๊ฒฝ์ด ๋ฉ๋๋ค.
void main() {
// ์๋์ฐจ ๊ฐ์ฒด ์์ฑ
Car myCar = Car();
myCar.licensePlate = "์์ธ 12๋ฐ 4567";
Car yourCar = Car();
yourCar.licensePlate = "๊ฒฝ๊ธฐ 78๊ตฌ 1234";
// ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ
myCar.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ์์ธ 12๋ฐ 4567 ์
๋๋ค." ์ถ๋ ฅ
yourCar.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ๊ฒฝ๊ธฐ 78๊ตฌ 1234 ์
๋๋ค." ์ถ๋ ฅ
}
์ด๋ฐ ์ฝ๋๋ผ๋ฉด licensePlate ์ด๋ผ๋ ํ๋ ๊ฐ์ด ์ ๋๋ก ์ค์ ๋์ง ์์ ์ํ๋ก ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ ์ํ์ด ์์ต๋๋ค.
Dart ์์๋ ์ผ๊ด๋ ์ด๊ธฐํ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด์ ๋ณดํต ์ด๊ธฐํ๋ฅผ ํด์ค์ผ ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ค์ ๋ฉค๋ฒ๋ณ์๋ ๋ฉค๋ฒํจ์๋ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ์ง๋ง ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
void main() {
// ์๋์ฐจ ๊ฐ์ฒด ์์ฑ
Car myCar = Car("์์ธ 12๋ฐ 4567");
Car yourCar = Car("๊ฒฝ๊ธฐ 78๊ตฌ 1234");
// static ๋ฉ์๋ ํธ์ถ
Car.displayWheels(); // "๋ชจ๋ ์๋์ฐจ๋ 4 ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค." ์ถ๋ ฅ
// ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ
myCar.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ์์ธ 12๋ฐ 4567 ์
๋๋ค." ์ถ๋ ฅ
yourCar.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ๊ฒฝ๊ธฐ 78๊ตฌ 1234 ์
๋๋ค." ์ถ๋ ฅ
}
Static์์ด ์ฝ๋๊ฐ ์์ฑ๋ ๊ฒฝ์ฐ
๋ง์ฝ static์ด ์ ์ธ๋์ง ์์ ๋ฉค๋ฒ๋ณ์๋ ํจ์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฝ๋๋ ์ด๋ป๊ฒ ์์ฑ๋ ๊น์?
class Car {
int numberOfWheels = 4; // ์๋์ฐจ ๊ธฐ๋ณธ ํน์ฑ ๋ฐํด 4๊ฐ
String licensePlate;
void displayWheels() {
print("๋ชจ๋ ์๋์ฐจ๋ $numberOfWheels ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค.");
}
void displayLicensePlate() {
print("์ด ์๋์ฐจ์ ๋ฒํธํ์ $licensePlate ์
๋๋ค.");
}
}
void main() {
Car myCar = Car();
myCar.licensePlate = "์์ธ 12๋ฐ 4567";
print(myCar.numberOfWheels); // 4 ์ถ๋ ฅ
print(myCar.licensePlate); // ์์ธ 12๋ฐ 4567 ์ถ๋ ฅ
myCar.displayWheels(); // "๋ชจ๋ ์๋์ฐจ๋ 4 ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค." ์ถ๋ ฅ
myCar.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ์์ธ 12๋ฐ 4567 ์
๋๋ค." ์ถ๋ ฅ
}
์์ ์ฝ๋์ฒ๋ผ ํด๋์ค๋ก ์ ์ธ์ ํด์ค์ผ์ง๋ง Car ํด๋์ค์ ๋ฉค๋ฒ๋ณ์๋ ๋ฉค๋ฒํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Static์ ์ฌ์ฉํ์ฌ ์์ฑํ ์ฝ๋
class Car {
static int numberOfWheels = 4; // ์๋์ฐจ ๊ธฐ๋ณธ ํน์ฑ ๋ฐํด 4๊ฐ
static String licensePlate = "์์ธ 12๋ฐ 4567";
static void displayWheels() {
print("๋ชจ๋ ์๋์ฐจ๋ $numberOfWheels ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค.");
}
static void displayLicensePlate() {
print("์ด ์๋์ฐจ์ ๋ฒํธํ์ $licensePlate ์
๋๋ค.");
}
}
void main() {
print(Car.numberOfWheels); // 4 ์ถ๋ ฅ
print(Car.licensePlate); // ์์ธ 12๋ฐ 4567 ์ถ๋ ฅ
Car.displayWheels(); // "๋ชจ๋ ์๋์ฐจ๋ 4 ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค." ์ถ๋ ฅ
Car.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ์์ธ 12๋ฐ 4567 ์
๋๋ค." ์ถ๋ ฅ
}
static์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ์์ฑํ์ง ์๊ณ ๋, static์ด ๋ถ์ ๋ณ์๋ ํจ์๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
static ํค์๋๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ, ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋์ด ์์ต๋๋ค. ๊ทธ๋์ ๋ฐ๋ก ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ ๊ฒ์ด์ง์.
๋ฉ๋ชจ๋ฆฌ ํ ๋น๋์ด ์๋ค๋ผ๋ ๊ฐ๋ ์ ์ดํดํ๊ธฐ ์ํด์๋ ์ปดํ์ผ๊ณผ ์ปดํ์ผ ํ์์ ๋ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
์ปดํ์ผ ํ์ (Compile Time)
์ปดํ์ผ ํ์์ Source Code๊ฐ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ๋ฐ๋๊ฒ ๋๋ ๋จ๊ณ์ ๋๋ค. ์ด ๊ณผ์ ์ Source Code๋ฅผ ์ปดํจํฐ๊ฐ ์ดํด ๋ฐ ์คํํ ์ ์๋ ํํ์ธ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ฒ์ญํ๋ ์ปดํ์ผ๋ฌ์ ์์ ์ ํฌํจํฉ๋๋ค.
์ฃผ์ ํน์ง ๋ฐ ์์
- ์ฝ๋ ๊ฒ์ฌ
- ์ปดํ์ผ๋ฌ๋ ์ฝ๋์ ๋ฌธ๋ฒ์ ์ค๋ฅ๋ฅผ ๊ฒ์ฌ
- ๋ณ์๊ฐ ์ ์ ํ ์ ์ธ๋์๋์ง, ๋ชจ๋ ํจ์๊ฐ ์ฌ๋ฐ๋ฅธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ๋ฑ์ ์ฒดํฌ
- ์ปดํ์ผ๋ฌ๋ ์ฝ๋์ ๋ฌธ๋ฒ์ ์ค๋ฅ๋ฅผ ๊ฒ์ฌ
- ์ต์ ํ
- ์ปดํ์ผ๋ฌ๋ ์คํ ํจ์จ์ ๋์ด๊ธฐ ์ํด ์ฝ๋ ์ต์ ํ๋ฅผ ์ํ
- ์ด๋ ๋ถํ์ํ ์ฐ์ฐ์ ์ ๊ฑฐํ๊ฑฐ๋, ๋ฐ๋ณต๋๋ ๊ณ์ฐ์ ์ค์ด๋ ๋ฑ์ ์์ ์ ํฌํจ
- ์ปดํ์ผ๋ฌ๋ ์คํ ํจ์จ์ ๋์ด๊ธฐ ์ํด ์ฝ๋ ์ต์ ํ๋ฅผ ์ํ
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ์ปดํ์ผ ํ์์๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ์
- ์ด๋ ๋ณ์๋ ํจ์์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ๋ก๊ทธ๋จ ์คํ ์ ์ ๊ฒฐ์
- ์์) ์ ์ญ ๋ณ์๋ static ๋ณ์๊ฐ ์ด ๋จ๊ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ํ ๋น
- ์ปดํ์ผ ํ์์๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ์
class Car {
static int numberOfWheels = 4; // ์๋์ฐจ ๊ธฐ๋ณธ ํน์ฑ ๋ฐํด 4๊ฐ
...
static void displayWheels() {
print("๋ชจ๋ ์๋์ฐจ๋ $numberOfWheels ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค.");
}
...
}
void main() {
print(Car.numberOfWheels); // 4 ์ถ๋ ฅ
print(Car.licensePlate); // ์์ธ 12๋ฐ 4567 ์ถ๋ ฅ
Car.displayWheels(); // "๋ชจ๋ ์๋์ฐจ๋ 4 ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค." ์ถ๋ ฅ
Car.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ์์ธ 12๋ฐ 4567 ์
๋๋ค." ์ถ๋ ฅ
}
numberOfWheels, displayLicensePlate() ๋ ์ปดํ์ผ ํ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ด๋ฃจ์ด์ง๋๋ค.
Car ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ์์ฑํ์ง ์์์ฃ . ๋ฐ๋ก static ํค์๋๋ฅผ ๋ถ์ฌ์ ๋ฉค๋ฒ ๋ณ์ ๋ฐ ํจ์๋ฅผ ์ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. static์ด ๋ถ์ผ๋ฉด ๋ณ์๋ ๋ฐ์ดํฐ ์น์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๊ณ ํจ์๋ ํ ์คํธ ์น์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ฉ๋๋ค. ๋ฐ์ดํฐ ์น์ ๋ฉ๋ชจ๋ฆฌ์ ํ ์คํธ ์น์ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋ ํด์ ๋ฉ๋๋ค.
๋ค์ ํ๋ฒ ์ ๋ฆฌํ๋ฉด,
- ๋ณ์ - ๋ฐ์ดํฐ ์น์
๋ฉ๋ชจ๋ฆฌ(Data Section Memory)
- ์ ์ญ ๋ณ์ ๋ฐ ์ ์ ๋ณ์ ๋ฑ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์์ญ
- ํจ์ - ํ
์คํธ ์น์
๋ฉ๋ชจ๋ฆฌ (Text Section Memory)
- ์คํ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ์ ์ฅ๋๋ ์์ญ
- ์ปดํ์ผ ํ์
- ์ฑ์ด ์คํํ ๋, ์์ค ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ๋ณํํ๋ฉฐ ์ฝ๋ ๊ฒ์ฌ, ์ต์ ํ, ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ฑ์ ์ํ
๋ฐํ์ (Run Time)
๋ฐํ์์ ํ๋ก๊ทธ๋จ์ด ์์คํ ์ด๋ User ์ํด ์ค์ ๋ก ์คํ๋๋ ์๊ฐ์ ์๋ฏธํฉ๋๋ค. ์ด ๋จ๊ณ์์ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ์ถ๋ ฅ์ ์์ฑํฉ๋๋ค.
์ฃผ์ ํน์ง ๋ฐ ์์
- ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ํ๋ก๊ทธ๋จ ์คํ ์ค์ ํ์์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ต๋๋ค.
- ์์) User๋ก๋ถํฐ ์ ๋ ฅ ๋ฐ์ ๋ฐ์ดํฐ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ณํ ์ ์๋ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ ๋ฐํ์์ ํ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ต๋๋ค.
- ํจ์ ํธ์ถ๊ณผ ์คํ
- ํจ์์ ์คํ์ ๋ฐํ์์ ์ด๋ฃจ์ด์ง๋๋ค. ํจ์์ ์ ๋ฌ๋๋ ์ธ์๋ ์คํ ์ค์ ํ๊ฐ๋๋ฉฐ, ํจ์์ ๊ฒฐ๊ณผ๋ ๋ฐํ์์ ๋ฐํ๋ฉ๋๋ค.
- ์์ธ ์ฒ๋ฆฌ
- ์คํ ์ค ๋ฐ์ํ ์ ์๋ ์์ธ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์์ธ ์ฒ๋ฆฌ ๋ก์ง์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๊ณ , ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํ๊ฑฐ๋ ์ข ๋ฃํ ์ ์์ต๋๋ค.
class Car {
int numberOfWheels = 4; // ์๋์ฐจ ๊ธฐ๋ณธ ํน์ฑ ๋ฐํด 4๊ฐ
String licensePlate;
...
void displayLicensePlate() {
print("์ด ์๋์ฐจ์ ๋ฒํธํ์ $licensePlate ์
๋๋ค.");
}
}
void main() {
Car myCar = Car();
myCar.licensePlate = "์์ธ 12๋ฐ 4567";
print(myCar.numberOfWheels); // 4 ์ถ๋ ฅ
print(myCar.licensePlate); // ์์ธ 12๋ฐ 4567 ์ถ๋ ฅ
myCar.displayWheels(); // "๋ชจ๋ ์๋์ฐจ๋ 4 ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค." ์ถ๋ ฅ
myCar.displayLicensePlate(); // "์ด ์๋์ฐจ์ ๋ฒํธํ์ ์์ธ 12๋ฐ 4567 ์
๋๋ค." ์ถ๋ ฅ
}
numberOfWheels, licensePlate, displayLicensePlate()๋ ๋ฐํ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ด๋ฃจ์ด์ง๋๋ค.
Car ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด myCar ์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๋ฉ๋๋ค.
ํ ๋ฉ๋ชจ๋ฆฌ๋ ๋์ ํ ๋น ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฅ๋๋ ์์ญ์ ๋๋ค.
๋ฐํ์์ด๋, ํ๋ก๊ทธ๋จ์ด ์ค์ ๊ตฌ๋์ด ๋๋ฉด์ ์ด๋ ์์ฑ๋ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๋ ํจ์๋ค์ ์ ๊ทผํด์ ์ฌ์ฉํ๊ธฐ ์์ํฉ๋๋ค.
static์ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์
class Car {
static int numberOfWheels = 4; // ์๋์ฐจ ๊ธฐ๋ณธ ํน์ฑ ๋ฐํด 4๊ฐ
String licensePlate;
Car(this.licensePlate);
static void displayWheels() {
print("๋ชจ๋ ์๋์ฐจ๋ $numberOfWheels ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค.");
print("์ด ์๋์ฐจ์ ๋ฒํธํ์ $licensePlate ์
๋๋ค."); // error !!
}
void displayLicensePlate() {
print("์ด ์๋์ฐจ์ ๋ฒํธํ์ $licensePlate ์
๋๋ค.");
}
}
static ํจ์์์๋ static์ผ๋ก ์ ์ธํ์ง ์์ ๋ฉค๋ฒ ๋ณ์ ๋๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
displayWheels()๋ static์ผ๋ก ์ ์ธํ์๊ธฐ ๋๋ฌธ์ licensePlate๋ฅผ ํธ์ถํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์๊ณ ,
.... ๋ด์ฉ ์ถ๊ฐ ์์
ํ๋ก๊ทธ๋จ ์คํ ์ฌ์ดํด ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ์ ๋ํ ์ดํด
์ข ๋ ๊น๊ฒ ๋ค์ด๊ฐ๋ณด๋ ค ํฉ๋๋ค. ํ๋ก๊ทธ๋จ ์คํ์ ์ ์ฒด ์ฌ์ดํด์ ์ดํดํ๊ธฐ ์ํด์๋ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ ๊ตฌ์กฐ๋ฅผ ์์์ผ ํฉ๋๋ค.
์ดํด๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ณดํต ๋น์ ๋ ์ฐ๊ด์ง๋ ๊ฐ๋ ์ด ํ์ํ๋ฐ, ์ ๋ ๊ฐ ๋จ๊ณ์์ ์ฐ๊ด๋ ํ์ฌ๋ฅผ ์ธ๊ธํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ์ต์ด ์ ๋๋๋ผ๊ณ ์.
๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ๋ฉด, ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ช ๊ฐ์ง ์ฃผ์ ์ธ๊ทธ๋จผํธ๋ก ๊ตฌ๋ถ๋์ด ์ ์ฅ๋ฉ๋๋ค. ๊ฐ ์ธ๊ทธ๋จผํธ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ํนํ๋ ์ญํ ์ ์ํํฉ๋๋ค. ์ด๋ ์์์ผํ ๊ฒ์ด 4๊ฐ์ง ์ธ๊ทธ๋จผํธ๊ฐ ์์ต๋๋ค.
Code, Data, Stack, ๊ทธ๋ฆฌ๊ณ Heap ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ๋ ํ๋ก๊ทธ๋จ ์คํ ๋จ๊ณ์์ ์ด๋์ฏค์ ์์นํ๋ ๊ฑธ๊น์?
1. ํ๋ก๊ทธ๋จ ์ ๋ณด ์ฝ๊ธฐ (์์!!)
2. ๋ฉ๋ชจ๋ฆฌ ๋ก๋
3. ํ๋ก์ธ์ค ํ ๋น
4. ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ ๋ถ๋ฅ
5. CPU ์คํ (๋!!)
์์ ๊ฐ์ด 4๋ฒ์งธ ๋จ๊ณ์ ์์นํด ์์ต๋๋ค.
#1 . ํ๋ก๊ทธ๋จ ์ ๋ณด ์ฝ๊ธฐ ๋จ๊ณ
์์คํ ์ ์ด์ ์ฒด์ ๋ ์คํ ํ์ผ(exe)์ ์ฝ์ด๋ค์ฌ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ์, ํ์ํ ๋ฆฌ์์ค, ์ข ์์ฑ ๋ฑ์ ํ์ ํฉ๋๋ค. ์คํ ํ์ผ์ ํค๋ ์ ๋ณด๋ฅผ ๋ถ์ํ๊ณ ํ์ผ์ ๊ตฌ์กฐ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ค์ ์ ๋ณด๋ฅผ ํ์ธํฉ๋๋ค. ์ด ์ ๋ณด์๋ ํ๋ก๊ทธ๋จ์ ์ง์ ์ (entry point), ์ฆ ์ค์ ์คํ์ด ์์๋๋ ์ฝ๋์ ์์น ์ ๋ณด๋ ํฌํจ๋ฉ๋๋ค.
์ค์ ๋ก IntelliJ ๋๋ VSCode์์ ์์ ์ฝ๋๊ฐ ๋ด๊ฒจ์ ธ ์๋ main.dart ํ์ผ์ ์คํํ๋ฉด Dart ์ปดํ์ผ๋ฌ๋ Dart ์ฝ๋๋ฅผ ์ฝ๊ณ ์คํ ๊ฐ๋ฅํ ํํ๋ก ๋ณํํฉ๋๋ค.
์ด๋ ์คํ ํ์ผ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ํ์ํ ๋ฆฌ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ ์ฌํญ์ ํ์ ํฉ๋๋ค.
pubspec.yaml ํ์ผ์์ Dart ํ๋ก์ ํธ์ ๋ฉํ๋ฐ์ดํฐ์ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
๋ฃจํธ ๋๋ ํ ๋ฆฌ ํ๋จ์ ์์นํ์ฌ, yaml ํ์์ผ๋ก ์์ฑ๋ฉ๋๋ค.
dev_dependencies(๊ฐ๋ฐ์ ํ์ํ ์ธ๋ถ ํจํค์ง ์ ๋ณด๋ค)์ dev_dependencies(๊ฐ๋ฐํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ฑํ๋ ํ๊ฒฝ)์ ํ์ํ ํจํค์ง ์ ๋ณด๋ค์ ๋ฃ์ต๋๋ค.
#2. ๋ฉ๋ชจ๋ฆฌ ๋ก๋ ๋จ๊ณ
์คํ ํ์ผ์ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ์์คํ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ก๋ํ๋ ๊ณผ์ ์ ๋๋ค. ์ด ๋ ์ด์ ์ฒด์ ๋ ํ๋ก๊ทธ๋จ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๊ณ , ํ์ผ์ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ก ๋งคํํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ์ ๋น๋ฉ๋ชจ๋ฆฌ๋ ์ปดํจํฐ ์์คํ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉํ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ง์นญํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ผ์์ ์ผ๋ก ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ ์ฃผ ๋ฉ๋ชจ๋ฆฌ์ธ RAM์ ํฌํจํฉ๋๋ค. RAM์ Random Access Memory์ ์ฝ์๋ก์, ๋ณดํต ์ผ์ฑ ์๊ธ์น ์ค๋ฒํด๋ญ์ ๋ง์ด ํด๋ณด์ ๋ถ๋ค์ ์์คํ ๋ฐ์. 3200MHz์ 3666MHz ๋ฑ์ผ๋ก ์ค๋ฒํด๋ญํ๊ธฐ ์ํด, CL-tRCDRD-tRCDWR-tRP-tRAS-tRC-voltage ๋ฑ์ ์ง์ ์์ ํ๊ณ Ram Cooler๋ฅผ ์ฌ์ฉํด๋ณด์ ๋ถ๋ค์ ๊ธ๋ฐฉ ๋ ์ค๋ฆฌ์ค ์ ์์ต๋๋ค.
๋น๋ฉ๋ชจ๋ฆฌ๋ ์ฃผ ๋ฉ๋ชจ๋ฆฌ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ชจ๋ ํํ์ ์ ์ฅ์๋ฅผ ์๋ฏธํฉ๋๋ค. HDD๋ ์ด์ ์ ์ฌ์ฉํ์ง ์์ผ๋, SSD๋ฅผ ๋ ์ฌ๋ฆฌ์๋ฉด ๋ฉ๋๋ค. SSD๋ Solid State Drive ์ ๋๋ค.
์ด๋ ๊ฒ ํ๋ก๊ทธ๋จ์ ๊ตฌ๋์ ํ์ํ ์ฝ๋์ ๋ฐ์ดํฐ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ CPU๋ก ๊ฐ๊ธฐ ์ํ ์ค๋น๋ฅผ ํฉ๋๋ค. ์ ์ ๊ฒฝ์ฐ๋ฅผ ์๋ฅผ๋ค๋ฉด 48G RAM์ด ์ฃผ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ์ฉ๋๋ฉฐ ์ฌ๊ธฐ์ ๋ฐ์ดํฐ์ ํ๋ก๊ทธ๋จ ์ฝ๋๊ฐ ์์๋ก ์ ์ฅ๋๋ฉฐ ๋น ๋ฅธ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋๋ค. ์ฝ๋๋ ๋ณดํต ์ฝ๊ธฐ ์ ์ฉ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น๋ฉ๋๋ค. ๋ฐ๋ฉด, ๋ฐ์ดํฐ๋ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฐฐ์น๋ฉ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ์ ๊ด๋ จ๋ ์ค์ํ ๋ณด์ ์กฐ์น ์ค ํ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๋ถ SSD์ธ ๋น๋ฉ๋ชจ๋ฆฌ ์์ญ์๋ ์ด์ ์ฒด์ , ์ดํ๋ฆฌ์ผ์ด์ , ๊ฐ์ธ ํ์ผ ๋ฑ์ด ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋์ด ์์ต๋๋ค.
#3. ํ๋ก์ธ์ค ํ ๋น ๋จ๊ณ
์ด์ ์ฒด์ ๋ ์ด์ ํ๋ก๊ทธ๋จ์ ํ๋ก์ธ์ค ID๋ฅผ ํ ๋นํ๊ณ , ํ๋ก์ธ์ค์ ๋ํ ์ ์ด ๋ธ๋ก์ธ PCB(Process Control Block)์ ์์ฑํฉ๋๋ค. PCB๋ ํ๋ก์ธ์ค์ ์ํ, ํ๋ก๊ทธ๋จ ์นด์ดํฐ, CPU ๋ ์ง์คํฐ ์ ๋ณด, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ณด ๋ฑ์ ํฌํจํ๊ณ ์์ต๋๋ค.
ํ๋ก์ธ์ค ํ ๋น ๋จ๊ณ์์๋ ํ๋ก๊ทธ๋จ์ด ์์คํ ๋ด์์ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์๋ ์ ์๋๋ก ํ์ํ ๋ชจ๋ ๊ด๋ฆฌ ์ ๋ณด๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์ ๋๋ค.
#4. ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ ๋ถ๋ฅ ๋จ๊ณ
์ปดํจํฐ ์์คํ ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ๋๋ ์ธ๊ทธ๋จผํธ ๋ฐฉ์์ ์๋์ ๊ฐ์ต๋๋ค. ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌ๋ ์ฌ๋ฌ ์ธ๊ทธ๋จผํธ๋ก ๋๋์ด ๊ด๋ฆฌํ๋ฉฐ, ๊ฐ ์ธ๊ทธ๋จผํธ๋ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ด๋นํฉ๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ , ํ๋ก๊ทธ๋จ ๊ฐ ๋๋ ๋ด๋ถ์ ๋ณด์์ ๊ฐํํ๋๋ฐ ๋ณด์์ ๊ฐํํ๋๋ฐ ๋์์ ์ค๋๋ค. ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ฝ๋, ๋ฐ์ดํฐ, ํ, ์คํ ์์ญ์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
- Code
- Data
- Heap
- Stack
์ฝ๋(Code) ์์ญ์ ์คํ ๋ช ๋ น์ด๊ฐ ์ ์ฅ๋๋ ๊ณณ์ ๋๋ค.
- ํ ์คํธ ์ธ๊ทธ๋จผํธ(Text Segment) ๋๋ ์ฝ๋ ์ธ๊ทธ๋จผํธ(Code Segment)๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํฉ๋๋ค.
- ์คํ ๊ฐ๋ฅํ ๋ช ๋ น์ด(Instruction)์ด ํฌํจ๋ Object ํ์ผ ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋ฐ์ ํ๋ก๊ทธ๋จ ์น์ ์ค์ ํ๋์ ๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ํ ์คํธ ์ธ๊ทธ๋จผํธ์ ์๋ ๋ช ๋ น์ด(Instruction)๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๋๋ก ์ฝ๊ธฐ ์ ์ฉ(Read-Only์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- Heap๊ณผ Stack์ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ฎ์ด์์์ง์ง ์๋๋ก ํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ํ๋จ์ ์์นํด์์ต๋๋ค.
- ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์ ์ง๋๋ ์์ญ์ ๋๋ค.
- main() ํจ์์ ๊ฐ์ ๋ชจ๋ ํจ์์ ์ฝ๋๊ฐ ์ฌ๊ธฐ์ ์ ์ฅ๋ฉ๋๋ค.
- ํ ์คํธ ์ธ๊ทธ๋จผํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณํ์ง ์๋ ๋ช ๋ น์ด(Instruction)์ ๋๋ค.
- ์์คํ ์ํ์ ๊ด๊ณ์์ด ์ ์ง๋ ์ ์๋๋ก ROM ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํฉ๋๋ค.
- ROM์ ์ง์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ฑฐ๋, ํ์ํ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ RAM์ผ๋ก ๋ณต์ฌํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- Car ํด๋์ค์ ๋ํ ์ ์๋ ์ฌ๊ธฐ์ ์ ์ฅ๋ฉ๋๋ค.
class Car {
static int numberOfWheels = 4; // ์๋์ฐจ ๊ธฐ๋ณธ ํน์ฑ ๋ฐํด 4๊ฐ
String licensePlate;
Car(this.licensePlate);
static void displayWheels() {
print("๋ชจ๋ ์๋์ฐจ๋ $numberOfWheels ๊ฐ์ ๋ฐํด๊ฐ ์์ต๋๋ค.");
}
void displayLicensePlate() {
print("์ด ์๋์ฐจ์ ๋ฒํธํ์ $licensePlate ์
๋๋ค.");
}
}
๋ฐ์ดํฐ(Data) ์์ญ์ ์ ์ญ ๋ณ์์ ์ ์ ๋ณ์๋ฅผ ์ ์ฅํฉ๋๋ค. (BSS์ธ๊ทธ๋จผํธ๋ฅผ ๊ฐ์ด ๋ฌถ์ด์ ๋ณด๋ฉด)
- ์ด๊ธฐํ๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ(Initialized Data Segment)๋ ๊ฐ๋จํ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ(Data Segment)๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ์ผ๋ถ๋ถ์ผ๋ก์จ ์ด๊ธฐํ๋ ์ ์ญ ๋ณ์์ Static ์ ์ ๋ณ์๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
- ์ด๊ธฐํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ญ(Initialized Read-Only Area)๊ณผ ์ด๊ธฐํ๋ ์ฝ๊ธฐ-์ฐ๊ธฐ ์์ญ(Initialized Read-Write Area)์ผ๋ก ์ถ๊ฐ๋ก ๋ถ๋ฅ๋ ์ ์์ต๋๋ค.
- ์ด๊ธฐํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ญ(Initialized Read-Only Area)์ ๋ฐํ์(Runtime) ์ค์ ๋ณ์์ ์ ๊ทผํ์ฌ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ Uninitialized Data Segment(BSS)๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ BSS(Block Started by Symbol) ์ธ๊ทธ๋จผํธ๋ก ๋ถ๋ฆฝ๋๋ค. ๋ฐ๋ก ๊ตฌ๋ถํ์ง๋ ์๊ฒ ์ง๋ง BSS ์ธ๊ทธ๋จผํธ์ ๋ฐ์ดํฐ๋ ํ๋ก๊ทธ๋จ์ ์คํ๊ณผ ํจ๊ป ์ปค๋(์คํํธ์ ์ฝ๋)์ ์ํด 0์ผ๋ก ์ด๊ธฐํ๋ฉ๋๋ค.
- ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ๊ณต๊ฐ์ ๋์์ ์์๋๋ฉฐ ๋ช ์์ ์ธ ์ด๊ธฐํ๊ฐ ์๋ ๋ชจ๋ ์ ์ญ ๋ณ์์ Static ์ ์ ๋ณ์๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
- Data ์ธ๊ทธ๋จผํธ์ BSS ์ธ๊ทธ๋จผํธ๊ฐ ๊ตฌ๋ถ๋๋ ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํจ์ ๋๋ค.
- ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ '์ด๊ธฐ๊ฐ์ ๊ฐ์ง๊ณ ์๋' ๋ฐ์ดํฐ์ด๋ฏ๋ก ROM ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํฉ๋๋ค.
- '๋ณ์'๋ก์จ ์ฌ์ฉํ๊ธฐ ์ํด์ ํ๋ก๊ทธ๋จ ์คํ๊ณผ ํจ๊ป RAM ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ ๋๋ค.
- BSS ์ธ๊ทธ๋จผํธ๋ '์ด๊ธฐ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์์', 0์ ๊ฐ์ผ๋ก ์ด๊ธฐํ ๋ ๋ณ์๋ค์ ๋๋ค.
- ๊ทธ๋์ ROM์ ์ ์ฅํ์ง ์์๋ ๋ฉ๋๋ค.
- ํ๋ก๊ทธ๋จ์ ์ํํ๋ฉด์ 0์ผ๋ก ์ด๊ธฐํํ์ฌ RAM ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.
- ์๋๋ ์๋กญ๊ฒ ๋ง๋ ์ฝ๋์ด์ง๋ง, ์ฐธ๊ณ ํ์ธ์.
class Vehicle {
// ์ ์ ๋ณ์: ๋ชจ๋ Vehicle ์ธ์คํด์ค์์ ๊ณต์ ๋ฉ๋๋ค.
static int totalVehicles = 0;
// ์ธ์คํด์ค ๋ณ์: ๊ฐ Vehicle ์ธ์คํด์ค๋ง๋ค ๋ณ๋๋ก ์กด์ฌํฉ๋๋ค.
String vehicleID;
// ์์ฑ์: ์๋ก์ด Vehicle ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ง๋ค totalVehicles๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
Vehicle(this.vehicleID) {
totalVehicles++;
}
// ์ ์ ๋ฉ์๋: ์ ์ ๋ณ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
static void displayTotalVehicles() {
print("์ด ๋ฑ๋ก๋ ์ฐจ๋ ์: $totalVehicles");
}
// ์ธ์คํด์ค ๋ฉ์๋: ๊ฐ ์ฐจ๋์ ID๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
void displayVehicleID() {
print("์ฐจ๋ ID: $vehicleID");
}
}
// ์ ์ญ ๋ณ์: ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค.
String appVersion = "1.0.0";
void main() {
// Vehicle ์ธ์คํด์ค ์์ฑ
var vehicle1 = Vehicle("VH1001");
var vehicle2 = Vehicle("VH1002");
// ์ ์ ๋ฉ์๋ ํธ์ถ
Vehicle.displayTotalVehicles();
// ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ
vehicle1.displayVehicleID();
vehicle2.displayVehicleID();
// ์ ์ญ ๋ณ์ ์ถ๋ ฅ
print("์ ํ๋ฆฌ์ผ์ด์
๋ฒ์ : $appVersion");
}
ํ(Heap) ์์ญ์ ๋์ ์ผ๋ก ํ ๋น๋๋ ๋ฐ์ดํฐ๋ฅผ ์ํ ๊ณต๊ฐ์ ๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ์คํํ๋ ๋์ ๊ฐ๋ฐ์์ ์ํด ์๊ตฌ๋๋ ๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฐํ์์ ํ ๋น๋๊ณ ํด์ ๋๋ ๊ณต๊ฐ์ ๋๋ค.
- ๋ณดํต Dart์์ new ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ด ์์ญ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ ์ฝ๋์์๋ String licensePlate; ์ ๊ฐ์ ์ธ์คํด์ค ๋ณ์๋ ๊ฐ Car ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋๋ง๋ค ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ธ ํ์ ํ ๋น์ด ๋ฉ๋๋ค.
- BSS ์ธ๊ทธ๋จผํธ์ ๋ ์ฃผ์์์ ์์ํฉ๋๋ค.
- brk ๋ฐ sbrk ์์คํ ํธ์ถ์ ์ฌ์ฉํ์ฌ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ malloc, calloc, realloc ๊ทธ๋ฆฌ๊ณ free ํจ์๋ฅผ ํตํด ๊ด๋ฆฌํฉ๋๋ค.
- ๋ฐํ์ ๊ฒฐ์
์คํ(Stack)์ ํจ์ ํธ์ถ๊ณผ ๋ก์ปฌ ๋ณ์๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ์คํ์ ํจ์ ํธ์ถ๊ณผ ๊ด๋ จ๋ ์ง์ญ ๋ณ์, ๋งค๊ฐ ๋ณ์, ๋ฐํ ์ฃผ์ ๋ฑ์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- Stack๊ณผ Heap์ ์๋ก ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
- ์คํ ํฌ์ธํฐ์ ํ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ ๊ฐ์์ง๋ฉด, ์ฌ์ฉ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ชจ๋ ์์ง๋์๋ค๋ ์๋ฏธ์ ๋๋ค.
- Stack Overflow๋ ์คํ ํฌ์ธํฐ๊ฐ Heap ์์ญ์ ์นจ๋ฒํ ์ํฉ์ ๋๋ค. ๋ฐ๋๋ก Heap Overflow๋ Heap ํฌ์ธํฐ๊ฐ Stack ์์ญ์ ์นจ๋ฒํ ์ํฉ์ ๋๋ค.
- ์ ์ฝ๋์์ Car.displacyLicensePlate() ๋ฉ์๋๋ ๊ฐ๋ณ Car ์ธ์คํด์ค์ licensePlate ๊ฐ์ ์ถ๋ ฅํ๋๋ฐ, ์ด ๋ฉ์๋๋ ํธ์ถ๋ ๋ ์คํ ์์ญ์ ํด๋น ์ธ์คํด์ค์ ์ ๋ณด(๋ฉ์๋ ๋ด์์ ์ฌ์ฉํ๋ ๋ณ์ ๋ฐ ๋งค๊ฐ๋ณ์)๋ฅผ ์ ์ฅํฉ๋๋ค.
- ์คํ ์์ญ์ LIFO(ํ์ ์ ์ถ, Last in First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ํ๋ก๊ทธ๋จ ์คํ์ ํฌํจํฉ๋๋ค.
- ํ๋ก๊ทธ๋จ ์คํ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์์ ์ฃผ์์ ์์นํฉ๋๋ค.
- ์คํ ํฌ์ธํฐ(SP, Stack Pointer) Register๋ ์คํ์ ๊ฐ์ฅ ์๋จ์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์คํ์ด Push ๋ ๋๋ง๋ค ๊ฐ์ด ์กฐ์ ๋ฉ๋๋ค.
- ํ๋์ ํจ์ ํธ์ถ์ ์ํด ํธ์๋ ๊ฐ๋ค์ ์งํฉ์ Stack Frame์ด๋ผ๊ณ ํฉ๋๋ค.
- ์ฆ, ํจ์ ํธ์ถ์ด ์ผ์ด๋ ๋๋ง๋ค ํด๋น ํจ์์ ์คํ ์ ๋ณด(์ง์ญ ๋ณ์, ๋งค๊ฐ ๋ณ์ ๋ฑ)๊ฐ ์คํ ํ๋ ์ ํํ๋ก Stack์ ํธ์๋๊ณ , ํจ์๊ฐ ๋ฐํ๋ ๋ ์คํ์์ Pop ๋ฉ๋๋ค.
- ์๋ก ํธ์ถ๋ ํจ์๋ ์คํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฐ์ดํฐ์ ์ง์ญ ๋ณ์๋ฅผ ์ ์ฅํ๊ณ , ํจ์ ์ํ ์ดํ์ ๋ฆฌํดํ ์ฃผ์์ ๋ ์ง์คํฐ ์ํ ๊ฐ ๋ฑ์ ์ ๋ณด๊ฐ ์คํ์ ์ ์ฅ๋ฉ๋๋ค.
- ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์๋ก์ด ์คํ ํ๋ ์์ด ์ฌ์ฉ๋ฉ๋๋ค.
์คํ๊ณผ ํ์ ๋๋ ๋์ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์คํ์ ๊ฒฝ์ฐ, ๋งค์ฐ ๋น ๋ฅธ ์ ๊ทผ๊ณผ ํ ๋น์ด ๊ฐ๋ฅํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ญ๋น๋๋ ๊ณต๊ฐ ์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
์๋ฏธ๋๋ก ๊ทธ๋ฅ ์ฐจ๋ก๋๋ก ์๋ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๊ธฐ ๋๋ฌธ์ด์ฃ . ํ์ง๋ง ์ฉ๋์ด Heap์ ๋นํด ์์ต๋๋ค.
ํ์ ์ฌ์ฉ์๊ฐ ๋ฐ๋ก ํ ๋น ๋ฐ ๊ด๋ฆฌ๋ฅผ ํด์ ์ฌ์ฉํด์ผํ๋ ๊ณต๊ฐ์ผ๋ก ์คํ๋ณด๋ค๋ ๋๋ฆฌ๊ฒ ํ ๋น์ด ๋ฉ๋๋ค. ์ฉ๋์ ํฌ์ง๋ง ๋จํธํ์ ์ํ์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋จํธํ๋ ๊ธฐ์ต ์ฅ์น์ ๋น ๊ณต๊ฐ ๋๋ ์๋ฃ๊ฐ ์ฌ๋ฌ ๊ฐ์ ์กฐ๊ฐ์ผ๋ก ๋๋๋ ํ์์ ๋๋ค.
๊ทธ๋๋ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์คํ ์์ญ๋ณด๋ค๋ ์ ์ฐํจ์ด ์์ต๋๋ค. ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)๊ฐ ์ผ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ํด๊ฐ ์ผ์ด๋ ์ ์์ผ๋, ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ํ ๋นํ ๋ ์ฃผ์ํด์ผ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฐ ์๊ฐ์ ํ ์ ์์ต๋๋ค.
์คํ์ด ํ๋ณด๋ค ๋น ๋ฅธ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ณ ,
๋ญ๋น๋๋ ๊ณต๊ฐ์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฐ,
์ ํ ๋์ ์คํ๋ง ์ฌ์ฉํ์ง ์๋๊ฑฐ์ง?
์ฐ์ ๊ฒฐ๋ก ์ ์ผ๋ก,๊ฐ๊ฐ์ ์ฉ๋์ ํน์ฑ์ด ๋ช ํํ๊ธฐ์ ์คํ๊ณผ ํ์ด ๊ฐ์ด ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค.
์คํ์
#5. CPU ์คํ ๋จ๊ณ
์ด์ CPU์์๋ ํ๋ก๊ทธ๋จ์ ์ง์ ์ ์์ ๋ช ๋ น์ด๋ฅผ ์ฝ๊ธฐ ์์ํฉ๋๋ค. CPU์ ํ๋ก๊ทธ๋จ ์นด์ดํฐ๋ ์คํํ ๋ค์ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ด์ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ๊ฐ์ ธ์์ Decode ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค. ์ดํ ์คํํฉ๋๋ค. ์ด ๊ณผ์ ์์๋ ๋ ์ง์คํฐ, ์บ์, ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ์์์ด ์ฌ์ฉ๋ฉ๋๋ค. ํ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๊ธฐ๋ฅผ ์ํํฉ๋๋ค.
ํ๋ก์ธ์ค์ ์ํ๋ ์คํ(Running) ์ํ๋ก ์ ํ๋ฉ๋๋ค.
๋ช ๋ น์ด์ ์คํ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค์ํ ์ฐ์ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ์ด๋ฃจ์ด์ง๋๋ค.