42seoul:: CPP 02

jahlee·2023년 7월 5일
0

개인 공부

목록 보기
17/23

고정 소수점 클래스를 만들고 클래스를 활용해 보는 과제이다.

Ad-hoc polymorphism (임시 다형성)

같은 이름의 함수를 매개 변수의 개수 또는 타입을 변경하여, 여러 개의 함수가 서로 다르게 행동할 수 있도록 하는 성질

다형성들의 종류로는 대표적으로 4가지의 종류가 있다.
1. 서브타입 다형성은 런타임 다형성(Runtime Polymorphism)으로 알려져 있다.
2. 매개 변수 다형성은 컴파일 타임 다형성(Compile-Time Polymorphism)으로 알려져 있다.
3. 임시 다형성은 오버로딩(Overloading)으로 알려져 있다.
4. 강제 다형성은 (암시적 또는 명시적) 캐스팅(Casting)으로 알려져 있다.

Orthodox Canonical Form

• Default constructor (기본 생성자)
• Copy constructor (복사 생성자)
• Copy assignment operator (연산자 오버로드)
• Destructor (기본 소멸자)

C++에서 Orthodox Canonical Form(OCF)은 클래스를 설계하는 한 가지 방법이다. OCF는 클래스의 멤버 변수를 private로 선언하고, 멤버 변수에 대한 접근은 멤버 함수를 통해서만 허용하는 것을 원칙으로 한다. OCF는 클래스의 멤버 변수를 보호하고, 코드의 안정성을 높이는 데 도움이 된다.

Copy constructor

class Fixed {
	private:
		int _value;
		static const int _bits = 8;
	public:
		Fixed(void);
		Fixed(const Fixed& obj);// 복사생성자
		Fixed& operator=(const Fixed& obj);// 대입연산자
		~Fixed(void);
		int getRawBits(void) const;
		void setRawBits(int const raw);
};

Fixed::Fixed(const Fixed& obj) {
	std::cout << "Copy constructor called" << std::endl;
	*this = obj;// 대입 연산자를 사용
}

int main() {
	Fixed b(a);
}

깊은 복사를 통해서 매개변수로 들어온 객체의 값을 복사해서 새로운 객체로 인스턴스화 하는 것 이다.

Operator overloading

말 그대로 우리가 사용하는 연산자들에 대해 재정의 하여 사용하게 해주는 방법이다.
예외로 몇가지 오버로딩이 불가능한 연산자들도 존재하며, class내 멤버함수의 형태로만 구현이 가능한 연산자들도 있다.

오버로인이 불가능한 연산자들

연산자 기호이름
.멤버접근 연산자
.*멤버 포인터 연산자
::범위 지정 연산자
?:조건 연산자

class 내에서 멤버함수의 형태로 구현 가능

연산자 기호이름
=대입 연산자
()함수 호출 연산자
[]배열 접근 연산자
->멤버접근을 위한 포인터 연산자
class Fixed {
	private:
		int _value;
		static const int _bits = 8;
	public:
		Fixed(void);
		Fixed(const Fixed& obj);
		Fixed& operator=(const Fixed& obj);
		~Fixed(void);
		int getRawBits(void) const;
		void setRawBits(int const raw);
};

Fixed& Fixed::operator=(const Fixed& obj) {// 대입 연산자 오버로딩
	std::cout << "Copy assignment operator called" << std::endl;
	if (this != &obj) {
		this->_value = obj.getRawBits();
	}
	return (*this);
}

깊은 복사, 얕은 복사

쉽게 하자면 깊은 복사는 실제로 값을 복사해주는 것이고, 얕은 복사는 값을 들고있는 주소를 넘겨주는 것이다. 깊은복사는 독립적이라 생각하면 쉽다.

이진 기수법

간단하게 설명하자면 실수에 대한 값을 컴퓨터에 저장할 때 소수부도 똑같이 이진법으로 바꾸어서 저장하면 전혀 다른 값이지만 똑같이 저장될 수 있기 때문에 소수부에 대해 실행하는 방법이다.

예시로 실수 6.125 에 대해 이진 기수법을 사용하여 보자면
1) 먼저 정수부, 소수부로 나누어 준다.
정수부 => 6, 소수부 =>0.125
2) 정수부는 이진수로 변환 해주고 소수부는 이진 기수법을 사용해준다.
이진기수법은 소수부를 계속 2씩 곱해가며 1보다 커지거나 같아지면 1, 아니면 0으로 표기해주는 방식이고, 정확히 1로 떨어지면 끝난다.
0 => 0.25
0 => 0.5
1 => 1
정수부 => 110, 소수부=> 001

고정 소수점

float의 크기인 32비트에서 부호부 크기 1, 정수부, 소수부를 원하는 소수점으로 나누어서 저장하는 방법이다.
예시로 12.625을 부동소수점으로 표기를 해보자.
정수부 => 1100, 소수부 => 101
만약 소수부를 10비트까지 표기하기도한 부동 소수점이면

부호부정수부소수부
00 0000000000 0000001100101000000

과 같이 표기할 수 있다.

컴퓨터는 고정 소수점도 2의 보수 처리를 해준다. 예시로 -0.125이고 소수부가 8비트라 하면
11111...11 11100000 와 같이 기입된다. 부호부가 1이므로 비트 반전에 +1 한 값이 해당 값의 절대값이다.

부동 소수점

IEEE 754 부동소수점 표현이 일반적인 부동 소수점 표기로 비트마다 범위가 다르다
각 비트마다 지수부를 표현해줄때 지수가 음수일 경우가 있기때문에 bias를 지수값에 더해주고 지수부에 값을 저장해주는데
32비트는 127, 64비트는 1023이다.

32비트

부호부정수부소수부
1비트8비트23비트

64비트

부호부정수부소수부
1비트11비트52비트

고정 소수점은 표현범위가 작고 정밀도가 떨어지는 부동 소수점을 보완하기 위해 지수를 사용하여 표기해주는 방식이다.
동일한 예시인 12.625를 계산 방식에 따라가 보자면
1) 정수부 => 1100, 소수부 => 101 으로 변환이 된다. 1100.101
2) 변환한 수를 정규화를 해주면 1.100101 * 2^3 이 된다.
3) 지수부는 bias 127 + 지수 3을 해주면 된다.

부호부정수부소수부
01000 0010100 1010 0000 0000 0000 0000

이와 같이 표기된다.

BSP

이진 공간 분할법(Binary Space Partitioning)은 간단하게 설명하면 재귀적으로 유클리드 공간을 초평면 상의 볼록 집합으로 분할하는 기법이라고 한다. 분할 과정으로 BSP 트리라 불리는 트리 구조가 만들어진다.

0개의 댓글