5.1 선형성: 예측 가능한 비례 관계 벡터와 스칼라 곱셈으로 생성된 벡터는 벡터와 평행한 원점을 지나는 일직선 상에 위치한다. 이러한 성질을 선형성(Linearity)이라고 한다. 선형성을 가법성(Additivity)과 1차 동차성(Homogeneity of degree1) 두 가지 조건을 모두 만족하는 함수의 성질로 정의한다. f(x1 + x2) = f(x1) + f(x2) // 가법성 f(k · x) = k · f(x) //1차 동차성 선형 함수 원점을 지나는 다음의 직선함수를 생각해보자 f(x) = ax y = ax //가법성 검증 f(x1 + x2) = a(x1 + x2) //좌변 f(x1) + f(x2) = ax1 + ax2 //우변 //1차 동차성 검증 f(kx) = a(kx) //좌변 kf..
4.1 삼각함수 한 각이 직각(90도)인 직각삼각형을 이루는 세 변은 각 위치에 따라 빗변, 밑변, 높이 라고 부른다. 직각삼각형을 구성하는 세 변에서 두 변을 뽑아 각각의 비례관계를 나타낸 것은 삼각비(Trigonometric Ratio)라고 한다. 사인(Sine), 코사인(Cosine), 탄젠트(Tangent) 세가지가 대표적이다. 직각삼각형을 데카르트 좌표계 상에 배치하고 사잇각의 범위를 실수 전체로 확장한 대응 관계를 삼각함수(Trigonometric function)라고 한다. 삼각함수의 성질 sin 함수와 cos 함수의 그래프를 보면 [-1, 1] 범위내에서 360˚마다 반복되는데, 변화 값의 범위를 진폭(Amplitude), 반복되는 각도를 주기(Period)라고 한다. sin 함수와 cos..
벡터(Vector)란 평면에서 시각적으로 의미 있는 물체를 생성하기 위해 평면을 구성하는 원소이다. 3.1 데카르트 좌표계 데카르트 좌표계(Cartesian coordinate syste)는 직선의 수 집합을 수직으로 배치하여 평면을 표기하는 방식을 의미한다. 곱집합의 원어가 데카르트 곱(Cartesian pruduct)임을 생각해본다면 동일한 개념이라 볼 수 있다. 가로축을 x축 세로축을 y축으로 하여 평면을 가르면 총 4개의 분면으로 나뉘는데 오른쪽 상단에서부터 반시계방향으로 순서를 붙인다. 데카르트 좌표계의 한 원소는 곱집합과 동일하게 순서쌍으로 표현하며 좌표(Coordinate)라고 부른다. (x,y) 3.2 벡터 공간과 벡터 스칼라와 벡터 두 개 이상의 실수를 곱집합으로 묶어 형성된 집합을 벡터..
수와 집합 의무 교육에서 배운 집합은 서로 구분이 되는 원소(Element)로 구성된 묶음을 의미한다. 소박한 집합론(Naive set theory)이라 한다. N (자연수) : 물건을 세거나 순서를 지정하기 위해 사용하는 수의 집합 Z (정수) : 자연수와 자연수의 음수, 0을 포함하는 수의 집합 Q (유리수) : 분모가 0이 아닌 두 정수의 비율 혹은 분수로 나타낼 수 있는 수의 집합 I (무리수) : 두 정수 비 혹은 분수로 나타낼 수 없는 수의 집합 C (복소수) : 실수와 제곱하면 -1이 되는 허수 단위 i를 조합해 a+bi(a,b는 실수) 형태로 표현하는 수의 집합 H (사원수) : 실수와 제곱하면 -1이 되는 세 허수 단위 i,j,k 를 조합해 a+bi+cj+dk(a,b,c,d는 실수) 형태..
책을 시작하며 이득우 교수님의 이전 언리얼 책을 보면서 쉽게 따라할수 있는 예제로 기초를 다지는데 도움이 되었다. 그래서 이번에 나온 책도 구매하여 읽게 되었다. 1.1 메타버스가 가져올 새로운 변화 // 중략 1.2 게임 엔진의 구성 게임을 기술적으로만 바라본다면 현실 세계를 복제하여 실시간으로 움직이는 3차원의 가상 세계라 말할 수 있고, 그 복제 과정을 쉽고 안정적으로 만들어주는 것이 게임 엔진 기술이다. 렌더링(Rendering)이란 가상 공간을 이루는 수의 규칙을 분석하고 이를 빠르게 화면에 보여주기위한 작업이다. 초창기 그래픽카드는 단순히 화면을 출력하는 기능만 수행하였다. 그러다 GPU로 명칭이 변경되고 게임 제작에 특화된 기능이 탑재되면서 계속 진화 하게 되어 게임 뿐 아니라 인공 지능 사..
제네릭을 활용하는 타입, 함수, 메서드를 직접 선언하는 방법을 살펴보자. 함수로부터 중복 제거하기 먼저 제네릭 타입을 사용하지 않고 함수로부터 중복된 코드를 제거하는 방법을 알아보자. fn main() { let number_list = vec![34, 50, 25, 100, 65]; let mut largest = number_list[0]; for number in number_list { if number > largest { largest = number; } } println!("가장 큰 숫자: {}", largest); } 두 개의 리스트에서 가장 큰 값을 찾으려면 위 예제를 복사하여 두번 실행 하면 된다. 이런 중복 코드를 없애려면 정수의 리스트를 매개변수로 전달받아 작업을 실행하는 함수를 ..
시작하며 러스트는 에러를 크게 회복 가능한(recoverable) 에러와 회복이 불가능한(unrecoverable) 에러 두가지로 구분한다. 러스트에는 예외라는 개념이 없고, 회복 가능한 에러를 표현하는 Result 타입과 회복 불가능한 에러가 프로그램의 실행을 종료하는 panic! 매크로를 지원한다. panic! 매크로를 이용한 회복 불가능한 에러 처리 panic! 매크로를 실행하면 프로그램은 실패 메시지를 출력하고 스택을 모두 정리한 다음 종료한다. fn main() { panic = 'abort' } 에러 메시지에는 패닉 메시지와 패닉이 발생한 소스 코드의 위치가 출력된다. panic! 역추적 사용하기 범위를 벗어난 인덱스를 이용해 panic! 매크로 호출해보자 책에서는 작성한 파일이 아닌 mod...
시작하며 이번 장에서는 자주 사용되는 벡터, 문자열, 해시맵 세 가지 컬렉션을 알아보자 벡터에 일련의 값 저장하기 벡터는 하나 이상의 값을 하나의 데이터 구조에 담을수 있으며 모든 값은 메모리상에 연속으로 저장된다. 벡터는 같은 타입의 값만 저장할 수 있다. 새로운 벡터 생성하기 새로운 빈 벡터를 생성하려면 Vec::new 함수를 호출하면 된다. let v: Vec = Vec::new(); //값을 포함하는 벡터 생성 Vec 타입으로 유추 let v2 = vec![1,2,3]; 벡터 수정 벡터를 생성하고 값을 추가하려면 push 메서드를 사용한다. let mut v = Vec::new(); v.push(5); v.push(6); v.push(7); v.push(8); 벡터 해제 벡터 역시 범위를 벗어날 ..
패키지: 크레이트를 빌드, 테스트, 공유할 수 있는 카고의 기능 크레이트: 라이브러리나 실행 파일을 생성하는 모듈의 트리(tree) 모듈과 use: 코드의 구조와 범위, 그리고 경로의 접근성을 제어하는 기능 경로(path): 구조체, 함수, 혹은 모듈 등의 이름을 결정하는 방식 패키지와 크레이트 크레이트는 하나의 바이너리 혹은 라이브러리다. 크레이트 루트(root)는 러스트 컴파일러가 컴파일을 시작해서 크레이트의 루트 모듈을 만들어내는 소스 파일이다. 패키지는 이 크레이트를 빌드하는 방법을 서술하는 Cargo.toml 파일을 갖는다. 패키지를 생성하게되면 (cargo new 명령) 카고는 Cargo.toml 파일을 생성해 패키지를 만들어 낸다. 모듈을 이용한 범위와 접근성 제어 모듈(module)은 크레..
열거자(enumerations, enums)는 사용 가능한 값만 나열한 타입을 정의할 때 사용한다. 열거자 정의하기 IP주소를 예를 들어 보자. IP주소는 버전 4나 버전 6으로 두 가지가 표준으로 자리 잡고 있다. enum IpAddrKind { V4, V6, } 열거된 값들을 열것값(variants)라고 한다. 열거자의 값 let four = IpAddrKind::V4; let six = IpAddrKind::V6; fn route(ip_type: IpAddrKind) {} route(IpAddrKind::V4); route(six); 열거자의 각 값은 식별자를 이용해 구분하며, 식별자와 값을 구분하기 위해 두 개의 콜론을 사용한다. 열거자를 매개변수로 갖는 함수를 정의할수도 있고, 열거자의 값을 이..
구조체(struct or structure)는 서로 관련이 있는 여러값을 의미 있는 하나로 모으고 이름을 지정해 접근할 수 있는 사용자 정의 데이터 타입이다. 구조체 정의와 인스턴스 생성 구조체를 정의하려면 struct 키워드 다음에 구조체에 부여할 이름을 지정해주면 된다. 이후 중괄호 안에 구조체가 저장할 데이터의 타입과 이름을 나열한다. 이 데이터들을 필드(field)라고 한다. 구조체를 정의한 후 이를 사용하려면 각 필드에 저장할 값을 명시에서 구조체의 인스턴스를 생성해야 한다. 정의 순서와 같을 필요는 없다. 구조체에서 원하는 값을 읽으려면 마침표(.)를 이용하면 된다. struct User { username: String, email: String, sign_in_count: u64, acti..
소유권이란? 러스트는 다른 언어들과 달리 가비지 콜렉터를 사용하거나, 명시적 메모리 할당 해제 하는 방법으로 메모리를 관리하지 않는다. 소유권 규칙 러스트가 다루는 각각의 값은 소유자(owner)라고 부르는 변수를 가지고 있다. 특정 시점에 값의 소유자는 단 하나뿐이다. 소유자가 범위를 벗어나면 그 값은 제거된다. 변수의 범위 변수의 범위(scope)는 선언된 지점 부터 현재의 범위를 벗어나기 전까지 유효하다. 범위와 변수의 유효성 사이의 관계는 다른 프로그래밍 언어와 크게 다르지 않다. { //변수 s를 아직 선언하지 않았다 let s = "hello"; //변수 s는 이 지점부터 유효 //변수 s를 이용해 필요한 동작을 수행 } //범위를 벗어나므로 변수 s는 이제 유효하지 않음 String 타입 S..