| 개념 | JS | C# |
|---|---|---|
| 값을 변경할 수 있는 변수 | var, let | 일반 변수(int, string 등) |
| 블록 스코프 변수 | let | 일반 변수(int, string 등) |
| 값을 변경할 수 없는 변수 | const | const |
| 타입을 자동으로 추론 | var, let, const | var |
null 허용 변수 | let num = null; | int? num = null; |
| JavaScript | C# |
|---|---|
| var는 함수 스코프 | var는 타입을 자동 추론 |
| var는 재할당 가능 | var는 재할당 가능 |
| var는 호이스팅됨 | var는 호이스팅 없음 |
// JS
var x = 10; // 가능
x = 20; // 가능
// C#
var x = 10; // int로 추론됨
x = 20; // 가능
var는 함수 스코프라서 블록({})을 무시하지만, C#의 var는 단순히 타입을 추론하는 역할이다.var가 호이스팅되지만, C#에서는 그렇지 않다.// JS는 함수 스코프를 가지므로
// 블록 스코프를 무시한다.
function test() {
if (true) {
var x = 10; // if 블록 안에서 선언
}
console.log(x); // 10 (블록을 무시하고 함수 전체에서 접근 가능!)
}
test();
// 하지만 let이나 const는 블록 스코프를 가진다.
function test() {
if (true) {
let y = 20; // 블록 스코프
}
console.log(y); // ❌ 오류 발생! (y는 if 블록 안에서만 유효)
}
test();
C#에는 let과 동일한 개념은 없지만, 일반적인 변수 선언(
int,string등)이 JS의let과 비슷한 역할을 한다.
// JS
let y = 5; // 가능
y = 10; // 가능
int y = 5; // 가능
y = 10; // 가능
JS와 C#의 const는 동일한 개념
// JS
const PI = 3.14; // 상수 선언
PI = 3.15; // ❌ 오류 (const 값 변경 불가)
// C#
const double PI = 3.14; // 상수 선언
PI = 3.15; // ❌ 오류 (const 값 변경 불가)
const는 객체를 수정할 수 있다.const는 완전한 불변(immutable) 이고, 객체 선언이 불가능하다!C#에는
readonly도 있다.
readonly는 런타임에 한 번만 할당할 수 있는 변수이다. (const는 컴파일 타임에 값이 고정된다.)
// JS
const obj = { name: "Alice" };
obj.name = "Bob"; // 가능 (객체 속성 변경 가능)
console.log(obj.name); // "Bob"
// 하지만 obj 자체를 다른 객체로 변경하려 하면 오류 발생
obj = { name: "Charlie" }; // ❌ 오류 (const 변수 재할당 불가)
class Person
{
public string Name { get; set; }
}
const Person p = new Person(); // ❌ 오류! 객체는 const로 선언할 수 없음
const로 객체 선언이 불가능 하므로(컴파일 타임에 결정되는 값에만 사용이 가능하므로) readonly를 사용해야지 객체를 선언하고, 해당 객체를 변경할 수 없게 만들 수 있다.
class Person
{
public string Name { get; set; }
}
class Example
{
readonly Person person = new Person(); // 가능 (한번만 할당 가능)
public Example()
{
person.Name = "Alice"; // ✅ 가능 (속성 변경 가능)
// person = new Person(); // ❌ 오류! 객체 자체를 변경할 수 없음
}
}