LHS and RHS
어싸인먼트가 왼쪽/ 오른쪽에 있는 것을 구분/
x=10
LHS : x
RHS : 10
구분짓는 이유는 결과적으로 값이 할당되기 위해 존재-LHS / 값이 꺼내지기 위해 존해 RHS.
z = x + y | x의 값을 꺼내고, y의 값을 꺼내고 둘을 더한 후 z에 값을 넣는다.
기본적으로 모든 변수는 주소값을 가지고 있다. 주소는 메모리 주소를 뜻한다. &는 해당 주소값을 계산하는 연산자.
&x : 0 , &y : 4 x와 y의 주소값은 각각 0번과 4번 주소이다.
x가 RHS에 있을 경우, x의 주소에 저장되어 있는 값을 꺼내온다.
x가 LHS에 있을 경우, x의 주소에 값을 저장한다.
포인터
특정 변수 앞에 *을 찍는다. *는 따라간다.
RHS에 *이 찍혀 있다면, *y라면 99의 값을 따라가서 99번지 주소를 간다.
LHS에 *이 찍혀 있다면, *x라면 x의 값을 따라가서 저장된 값에 접근한다.
*x=y | x의 주소를 따라가서 y의 값을 저장.
**x=y | x의 주소 0번에 저장된 값에 접근해서 그 값의 주소를 따라가서 y의 값을 저장. 16번지에 99를 저장한다.
Char x[3] = {'0','1','2'};
x = 0x14. *x => '0'. *(x+1) => '1'. x[0] => '0'
x[] 의 형태는 *x의 형태로 컴파일 시 바뀌게 된다.
const는 자바의 static과 비슷하다.
const int x = 16;
x의 주소에는 16이 들어가게 되고 이후 x에 저장된 값을 변경하려고 하면 컴파일러가 오류를 일으킨다.(const로 고정되어 있다.)
x= 20; 을 하면 fail을 컴파일러가 준다.
y는 주소값을 저장하는 변수인데 int*로 그 주소값을 따라가면 항상 정수 값이 저장되어 있다.
int* y = &x;
y를 통해서 x 값을 변경하려고 할 수 있기 때문에 컴파일러가 오류를 발생시킨다.
여기서는 22번 라인에서만 오류가 발생한다.
Const의 위치에 따라 활용의 제한이 달라진다.
const int * (const y)는 아무것도 못 바꾼다.
여기까지는 C 언어와 동일한 이야기.
이제 객체지향언어인 C++에 대한 이야기.
return 타입에 const를 붙인다는 것은
const string* name() {return name_;} 이니, name_을 저장할 때도, const로 저장해야한다.
parameter에 const를 붙일 수 있다.
void DoSomething() const {name_=name_+"hi"} -> this가 const가 된다. 멤버 펑션 안에 this는
함수 안에서 멤버 필드의 값을 바꾸지 않는다고 알려줌.
foo() {this ->x = 3;} 여기에는 사실 인자가 있다. ()에는 car* this가 있다.
bar() const { foo();} 컴파일 에러 발생. -> ()에는 const Car* this가 들어간다. 이제 bar 안에 foo()의 ()에는 this가 들어가게 되고, 인자를 넘길 수 가 없게 된다.
const를 붙일 수 있는 곳에는 const를 붙이는 게 좋다. 최적화에도 좋고, 값이 바뀌지 않아야 하는 것을 이용할 때 좋다.
컴파일러의 최적화의 걸림돌은 '변환이 가능한' 것이다. 값이 안 바뀐다는 보장이 있다면, 최적화가 좋아진다.
Instruction ReOrdering
A -> B -> C보다 C -> B -> A 가 더 빠를 수 있다. 단, const로 값이 변환되지 않는다면, 순서를 바꿔도 빠름의 정도는 똑같게 된다.
Shallow Copy 와 Deep Copy
Shallow Copy는 값을 그냥 단순히 복사.
*x = "bye" 라면 *y도 => "bye"가 나타나게 된다. 간단하게 주소값을 저장했기 때문이다.
Deep Copy는 데이터를 복사한다.
*x = "bye"로 해도, *y => "hi"이다.
'[Computer Science] -보호글 > [객체지향설계]' 카테고리의 다른 글
[객체지향설계] 10/03 이론 (0) | 2023.10.23 |
---|---|
[객체지향설계] 10/17 이론 (1) | 2023.10.17 |
[객체지향설계] 9/19 이론 (0) | 2023.09.19 |
[객체지향설계] 9/12(화) 이론 (0) | 2023.09.12 |
[객체지향설계]9/4 오리엔테이션 (0) | 2023.09.05 |