📌 변수 선언하기
var age = 23;​

 

cf. 만약 var 명령어를 빼게 된다면, 이는 전역변수를 의미한다.

🤔 HTML 파일에 코드 입력하기
<body></body> 태그 사이에 소스코드 입력
<!DOCTYPE html>
<html lang="kor">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
            var currentYear = 2023;
            var birth, age;

            birth = prompt("태어난 년도를 입ㅕ하세요. (YYYY)", "");
            age = currentYear - birth + 1;
            document.write(currentYear + "년 현재<br>");
            document.write(birth + "년 생의 현재 나이는" + age + "세 입니다.");
    </script>
</body>
</html>

 


 

📌 Javascript의 자료형

cf. undefined: 자료형이 정의되지 않을 때의 데이터 상태 (즉, 변수에 값이 할당되지 않았음을 의미)
cf. null: 데이터의 값이 유효하지 않은 상태 (즉, 할당은 되었지만 할당된 값이 유효하지 않음을 의미)


📌 Javascript의 조건문
if (조건) {
}
else {
}



📌 Javascript의 반복문
for(let i= 1; i < 6; i++) {
	sum += i;
}

while(let i < 6) {
	sum += i;
    i++;
}




📌 함수의 사용 in Javascript
function 함수명() {
	명령
}

ex) 
<script>
    function AddNum() {
        var n1=2;
        var n2=3;
        var sum = n1 + n2;
        alert("결과:" + sum);
    }

    AddNum();
</script>

<script>
    function AddNum(num1, num2) {
        var sum = num1 + num2;
        return sum;
    }
	var res = AddNum(3, 5);
    document.write(res);
</script>

 

 

🤔 let과 const
var
를변수 선언시 보통 사용하며, var를 사용하지 않으면 자동으로 전역변수가 되어 버린다.
이를 방지하고자 let, const를 사용한다.

추가적으로 var, let, const의 가장 큰 차이는 scope 범위이다.
 ∙var: 함수영역의 스코프
 ∙let과 const: 블록영역{ }의 스코프
    - 보통 let 은 가변변수, const는 상수변수에 사용된다.


📌 Javascript 변수사용 Tip!
1. var 변수는 함수 시작부분에서 선언!
2. for문에서 counting변수는 var 예약어 사용X (let 사용)
3. 보통 var보다 let을 주로 사용하는 것이 좋다.
4. 전역변수는 최소한으로 사용.

 

 


 

 

🤔 이벤트와 이벤트 처리기


📌 이벤트 처리기
<태그 on이벤트 = "함수명">

ex)
<body>
	<ul>
    	<li><a href="#" onclick="changeBg('green')">Green</a></li>
        <li><a href="#" onclick="alert('green')">Green</a></li>
    </ul>
</body>

※ 배열&포인터에 의한 문자열 표현

다음 예시에 대해 살펴보자.

char str1 [] = "My String";
char *str2 = "Your String";

Q. 이때, 각각에 저장된 문자열 "My String"과 "Your String"을 바꿀 수 있을까?

 

이와 관련된 코드를 좀 더 자세히 풀어보면 아래와 같다.

 

 

 

 

 

※ C언어의 인자전달방식은 "무.조.건!" 값의 복사(Call-By-Value)이다!

 

 

 

 

※ 포인터와 함수인자 전달 (Call-by-Value 방식!)

 

 

Ex. Swap함수와 함수 인자 전달

 

cf. Swap 함수 인자 전달 (feat. 이중포인터)

 

 

 

 

 

 

 

※ 포인터와 상수화(const)

 

 

※ const

const가 붙은 객체는 외부 변경을 불가능하게 해주며 다방면으로 사용된다.

클래스 내부: 정적멤버, 비정적 데이터 멤버 모두 상수로 선언 가능

클래스 외부: 전역, namespace 유효범위의 상수를 선언, static 객체 등에도 const를 붙일 수 있다.

포인터: * 뒤에 const를 붙여 상수포인터로 하거나 * 앞에 const 포인터가 가리키는 데이터를 상수로 할 수 있고 const char* const p 처럼 상수포인터, 상수데이터로도 만들 수 있다.

 

const의 가장 강력한 용도함수 선언을 할 때이다.

포인터, 반복자와 [포인터반복자참조자]가 가리키는 객체, 함수의 반환값 매개변수, 지역변수는 물론 멤버함수, 함수전체 등 여러곳에서 사용될 수 있다.

 

이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다는 의미로

const 함수 내에서는 const가 아닌 함수의 호출이 제한된다.

const 참조자를 이용한다면 const 함수만 호출이 가능하다.

class Numclass{
private:
    int num;
public:
    int GetNum() const { return num; }
};

class NumberClass{
private:
    int number;
public:
    void initNum(const Numclass& num){
        number = num.GetNum();
    }
};

 

const 반환값은 안전성과 효율성의 증가, 에러돌발상황감소 등 여러 상황을 효과적으로 막을 수 있다.

class Rational { . . . };
const Rational operator* (const Rational& lhs, const Rational& rhs);

만약 상수객체로 되어있지 않으면 아래와 같은 상황에서 Error가 발생한다.

Rational a, b, c;
(a * b) = c;  // a*b의 결과에 operator= 을 호출한 것이 되어버린다.

 

const 멤버 함수해당멤버함수가 상수객체에 대해 호출될 함수라는 뜻으로 2가지의 중요성을 갖는다.

1. 클래스로 만들어진 객체를 변경가능한 함수와 가능하지 않은 함수 구분을 시켜준다.

2. 객체전달을 상수 객체에 대한 참조자로 진행하여 상수객체를 사용하기 위해 상수멤버함수를 준비한다.

const char& operator[] (std::size_t pos) const { return text[pos]; }

void print (const TextBlock& ctb){    // 상수객체 ctb
    cout << ctb[0];  //TextBlock::operator[]의 상수
}

 

그렇다면 어떤 멤버함수가 const라는 것은 무슨 의미일까?

1.비트수준 상수성(물리적 상수성): 어떤 멤버함수가 정적멤버를 제외한 어떤 데이터도 건드리지 않음
2.논리적 상수성: 일부 비트정도는 바꿀수 있되 그것을 사용자가 모르게만 하면 상수멤버 자격이 있음

Q. 상수멤버 및 비상수멤버 함수가 기능적으로 똑같게 구현되었다면?

A. 코드중복을 피하는것이 좋은데, 이때 비상수 버전이 상수버전을 호출하도록 해야한다.

 

 

※ const 멤버 변수와  const static 멤버변수의 초기화 차이.

- const 멤버 변수: initializer를 이용해 멤버변수(객체)를 초기화 해야 한다. 이로 인해 선언과 동시에 초기화 되는 Binary code가 생성 가능하다.

class Country {
private:
    const int KoreaNum;
public:
    Country(const int KoreaNum) : KoreaNum(KoreaNum){ }
};

- const static 멤버변수: 선언과 동시에 초기화가 가능하다.

const static int KoreaNum = 82; //Country class의 public멤버
cout << "국번" << Country::Korea;

 

 

 

 

 

 

※ constexpr (C++11)

기존의 const 보다 더 상수성에 충실하며 일반화된 상수표현식 (Generalized constant expression)을 사용할 수 있게 해줌.

변수, 함수, 생성자 함수에 대하여 일반화된 상수표현식을 통해 컴파일 타임에 평가도리 수 있도록 처리해주는 키워드이다.

C++17부터는 람다함수에서도 constexpr키워드의 사용이 가능해졌다.

 

§ 변수에서의 사용

const와 constexpr의 차이점

[const]: const변수의 초기화를 런타임까지 지연시킬 수 있다.

[constexpr]: 반드시 컴파일 타임에 초기화 되어있어야 한다.

따라서 초기화가 안되어있거나 상수가 아닌 값으로 초기화 시도하면 컴파일이 되지 않는다.

constexpr float x = 42.f;    // OK
constexpr float y { 108.f }; // OK
constexpr int i;             // error C2737: 'i': 'constexpr' 개체를 초기화해야 합니다. (uninitialized 'const i' [-fpermissive])
int j = 0;                   // error: 'int j' is not const
constexpr int k = j + 1;     // error C2131 : 식이 상수로 계산되지 않았습니다.(the value of 'j' is not usable in a constant expression)

 

 

 

§ 함수에서의 사용

constexpr을 함수반환값에 사용시 다음의 제약이 있다.

1. 함수에 constexpr을 붙일 때는 inline을 암시한다.
2. 즉, 컴파일타임에 평가하기에 inline함수들과 같이 컴파일 된다.

만약 constexr의 함수인자들이 constexpr규칙에 어긋나면 컴파일타임에 실행되지 못하고 런타임에 실행된다.

constexpr int factorial(int n) {
    // 지역 변수 없음, 하나의 반환문
    return n <= 1 ? 1 : (n * factorial(n - 1));
}

// C++11에서는 컴파일 에러 발생
// C++14부터 가능
constexpr int factorial(int n) {
    // 지역 변수
    int result = 0;

    // 여러 개의 반환문
    if (n <= 1)
        result = 1;
    else
        result = n * factorial(n - 1);

    return result;
}

 

 

 

 

 

 

 

 

 

+ Recent posts