[42Seoul] - CPP Module06

Joey·2022년 11월 11일
0

42 SEOUL

목록 보기
13/20



1.무엇을 하는 과제인가?

: 형 변환을 공부하는 과제이다. 어떤게 안전한 형변환인지에 대해서 공부를 하게 된다.




2.과제를 하면서 참고 했던 곳들

1)형변환 관련

: 모두의 코드 형변환 관련 링크
링크 : https://modoocode.com/17

2)데이터 직렬화 관련(Serialization, ex01)

: 데이터 직렬화 관련 링크이다. 저장소에 저장을 하거나 다른 컴퓨터에 데이터를 보낼때, 포인터는 주소자체를 가지고 있기 때문에 문제가 발생한다. 주소가 아닌 데이터로 바꾸어서 저장을 한 뒤에 보내주고, 그것을 다시 푸는 단계로 이루어 진다.
링크 : https://hub1234.tistory.com/26





3.과제를 하면서 공부했던 것들

1)ex00

: 기본적으로 형 변환을 하는 문제이다. static cast에 대해서 공부를 하게 된다. 형변환은 그다지 어렵지 않은데 예외처리가 미니쉘급으로 하려고 하다보면 끝도 없다. 다 작성하고 cpp의 코드 라인수를 보니 300줄이 넘어갔다.
먼저 들어온 대상의 타입을 확인한 뒤에 해당되는 타입에 보관한 뒤, char / int / float / double로 각각 변환하는 문제이다.

static cast

<Type> 변환하고자 하는 자료형이다. 객체의 포인터나 참조형이 와야 한다. 
static_cast<Type>(expr)
  • 일반적으로 쓰인다고 생각하면 된다. 기본 자료형 데이터간의 형변환에 사용된다.
  • 암시적 형변환이 가능할 때 명시적 형변환을 static cast로 시켜줄 수 있다.
  • 포인터 타입(expr)을 다른 으로 변환하는 것은 허용되지 않지만, 상속 관계에 있는 포인터끼리의 변환은 가능하다.(하지만 다운캐스팅시에는 안전하지 않기 때문에 dynamic cast를 사용하자!!)
  • 에러체크 시기 : static cast는 컴파일시, dynamic cast는 런타임시 에러 체크를 한다. 만약 컴파일시 이상이 없다면 런타임에서 에러가 나버린다. 다운 캐스팅으로 런타임시에 에러가 발생할 수 있다.


2)ex01

: reinterpret cast에 대해서 공부를 한다. 이 형 변환은 변환된 대상의 비트단위로 읽게 해준다. 만약 단위가 낮은 대상으로 이동을 하게 된다면 특정 부분만 가져간다.(데이터가 잘린다는 소리이다.)
또한 재미있는 것을 공부하게 되는데

reinterpret cast

<Type> 변환하고자 하는 자료형이다. 객체의 포인터나 참조형이 와야 한다. 
reinterpret_cast<Type>(expr)
  • 임의의 포인터 타입간의 형 변환에 사용된다.
    : 포인터 >> 포인터, 포인터 >> 일반변수, 일반변수 >> 포인터
  • 정수형을 포인터로 바꿀 수도 있다.
  • 일반적으로 허용되지 않는 위험한 형 변환을 할 때 사용한다(위험), 비트단위로 보기 때문에 무조건 적인 형 변환이 가능하다.


3)ex02

: dynamic cast를 공부하게 된다. dynamic cast는 서로 상속 관계에 있는 클래스간의 형변환에서 주로 사용이 된다.

dynamic cast

<Type> 변환하고자 하는 자료형이다. 객체의 포인터나 참조형이 와야 한다. 
dynamic_cast<Type>(expr)
  • 상속 관계에 있는 클래스에서 쓰인다.
  • 런타임시에 실제로 캐스팅 가능한지 검사를 한다.(static은 컴파일시에 하기 때문에 static보다 dynamic이 더 안전하다)



+ 추가 const cast

: const cast에 대한 문제는 나와있지 않지만 가끔 형변환으로 쓰이기 때문에 정리해본다.

const cast

<Type> 변환하고자 하는 자료형이다. 객체의 포인터나 참조형이 와야 한다. 
void function1(int *num);
  void	function2(void)
  {
		const int *num = 123;
		function1(num); // 이렇게 하면 타입의 불일치가 발생하여 에러가 발생한다.
		function1(const_cast<int *>(num));//이렇게 해주면 잠깐 const를 풀어준다.
  }
  • 함수의 인자를 전달할 때 const로 인하여 type불일치가 생겨 에러가 날 때 사용을 한다
  • 포인터 또는 참조형의 const를 잠깐 풀어주는데 사용한다. 하지만 일반 변수, 함수 포인터, 멤버 함수에 대해서는 const를 풀어줄 수 없다.
  • 원본은 변경하지 않기 때문에 안전하지만, 값을 포인터로 바꾼후 원본값을 새로운 포인터로 넘겨 받는다면 바뀐 값이 넘어간다.

**형 변환 관련 내용은 특정사이트를 참고 하였지만, 링크를 못찾아서 추후에 참고한 링크를 추가해놓도록 하겠습니다.





4.회고

1)형 변환

: static과 dynamic cast가 각각 컴파일/런타임시에 에러를 검사한다는 것을 알게 되었다. 작동을 언제하냐에 따라서 안전한지 안전하지 않은지가 나뉘게 되어 신기했다. 형 변환을 앞으로도 많이 사용하게 될 것 같은데 되록 안전한 대상으로 해야겠다고 생각했다.

2) 데이터 직렬화(serialization)

: 위에 링크를 달아 놓긴 했는데, 이 부분이 상당히 신기했다. 과제에서는 둘다 공부를 하라고 해놓은 느낌이 들어서 좋기도 했다. 막상 과제를 할 것은 별로 없었지만 serialization에 대해서 공부하고 어떤 것인지 알게 되었다.

3) ex00문제

: 사실 파싱을 한다거나 예외처리를 하려고 하면 끝도 없이 하겠지만, 이것을 끝도 없이 한다고 해서 배우는게 어떤 건지 잘 모르겠다. 적당히 한다고 했는데 그게 300줄이나 나오다니... 평가를 해주시는 분들에게도 형 변환이라던지 다른 부분에 좀 더 정확한 설명을 하기 위해 노력했다.

profile
세상을 이롭게 하는 프로그램 만들기

0개의 댓글