[Unreal5] 블루프린트 Swap, 배열, 로또번호 생성기, 버블정렬
Swap
A에 들어있는 변수와 B에 들어있는 변수 바꾸기
A와 B에 이미 들어있는 변수는 바로 바꾸지 못한다
그렇기 때문에 Temp라는 비어있는 변수에 옮겨서 바꿔줘야한다.
결과
Reference( 참조 )와 Copy( 복사 )
Ref의 특징
메모리 관리
실제 데이터가 잇는 메모리 주소를 가리킨다
원본 데이터를 직접 참조하므로 추가 메모리를 사용하지 않는다
대용량 데이터를 다룰 때 효율적이다
데이터 동기화
한 곳에서 값을 변경하면 같은 참조를 사용하는 모든 곳이 업데이트 된다
여러 곳에서 같은 데이터를 실시간으로 공유해야 할 때 유용하다
UI요소나 게임 상태 등을 표시할 때 자주 사용된다
실제 사용 예시
플레이어의 현재 체력 표시 ( 여러 UI가 같은 값을 보여줘야함 )
게임 점수 시스템
캐릭터의 위치 정보
같은 값을 공유해야할 때 사용한다
주의사항
참조하는 원본 데이터가 삭제되면 문제가 발생할 수 있다
여러 곳에서 동시에 값을 수정하면 예상치 못한 결과가 나올 수 있다
Copy의 특징
메모리 관리
데이터의 완전한 복사본을 새로 만든다
각각 독립적인 메모리 공간을 사용한다
작은 데이터를 다룰 때 주로 사용한다
데이터 독립성
복사본을 수정해도 원본에 영향을 주지 않는다
원본 데이터를 보존해야 할 때 유용하다
각각 독립적으로 변경이 필요한 경우에 사용한다
실제 사용 예시
캐릭터의 기본 스탯 저장 ( 레벨 시작할 때 초기화용 )
아이템 복사 ( 인벤토리에서 새로운 아이템 생성 )
임시 계산용 변수 ( 현재 값을 보존하면서 새로운 계산 필요 )
독립적인 값을 사용해야 할 때
주의사항
큰 데이터를 자주 복사하면 성능에 영향을 줄 수 있다
복사본들의 동기화가 필요한 경우 추가 관리가 필요하다
Ref를 이용하여 변수 바꾸기
함수부
출력부
결과
바뀌지 않는다
이유는 디테일 창에 Pass-by-Reference 부분을 체크해줘야 하기 때문이다
Pass-by-Reference가 체크된다면?
변수의 실제 메모리 주소가 전달된다
함수 내에서 변수를 수정하면 원본 변수도 같이 수정된다
반대로 체크를 하지 않는다면?
변수의 값만 복사되어 전달된다
함수 내에서 변수를 수정해도 원본 변수는 변하지 않는다
디테일 창에서 체크
결과
배열
선언방법
배열 Get 노드
값을 가져오기 위해 Copy로 만들었다.
배열 인덱스 값 확인
배열로 for문 돌리기
Ver.1
Ver.2
Ver.3
결과
Add, AddUnique
Add
중복 여부와 관계없이 항상 배열의 끝에 새로운 요소를 추가한다
예시
초기 배열: [1, 2, 3]
Add(4) 실행 후: [1, 2, 3, 4]
Add(2) 실행 후: [1, 2, 3, 4, 2] // 이미 존재하는 2도 추가됨
AddUnique
배열에 해당 요소가 없을 때만 추가한다
이미 존재하는 요소를 추가하려고 하면 무시되기에 중복을 방지할 수 있다
예시
초기 배열: [1, 2, 3]
AddUnique(4) 실행 후: [1, 2, 3, 4]
AddUnique(2) 실행 후: [1, 2, 3, 4] // 이미 2가 있어서 추가되지 않음
AddUnique를 이용해 로또 번호 생성기 만들기
조건
숫자는 1 ~ 45 까지 나올 수 있다
6개의 출력해야한다
같은 숫자가 중복되면 안된다
결과
2번째 방법
조건은 같지만 다른 방법으로도 만들어 봤다
배열안에 45개의 숫자를 넣는다
숫자를 섞은 후 0번째 인덱스부터 차례대로 6개의 숫자를 출력한다
결과
생각을 잘못해서 7개의 숫자가 나왔다
조건이 인덱스가 6번째 보다 커지기 전까지 나온다고 설정했다
하지만 인덱스는 0 번부터 시작하므로 5로 설정을 했어야 한다
버블 정렬
버블 정렬이란 가장 기본적인 정렬 알고리즘 중 하나이다
작동원리
1. 인접한 두 원소를 비교한다
2. 순서가 잘못되어 있다면 두 원소의 위치를 교환한다
3. 이 과정을 배열 끝까지 반복한다
4. 한번의 반복이 끝나면 가장 큰 수가 맨 뒤로 이동한다
5. 정렬이 완료될 때 까지 1~4 과정을 반복한다
예시
초기 배열: [5, 3, 8, 1]
첫 번째 패스:
[5, 3, 8, 1] -> [3, 5, 8, 1] (5와 3 비교&교환)
[3, 5, 8, 1] -> [3, 5, 8, 1] (5와 8 비교)
[3, 5, 8, 1] -> [3, 5, 1, 8] (8과 1 비교&교환)
두 번째 패스:
[3, 5, 1, 8] -> [3, 5, 1, 8] (3과 5 비교)
[3, 5, 1, 8] -> [3, 1, 5, 8] (5와 1 비교&교환)
세 번째 패스:
[3, 1, 5, 8] -> [1, 3, 5, 8] (3과 1 비교&교환)
최종 결과: [1, 3, 5, 8]
출력부
구현부
결과
현재의 인덱스가 다음 인덱스보다 작을때 교환을 하라고 조건을 만들었기 때문에 높은 순서대로 정렬된 모습이다
버블 정렬의 장점
구현이 매우 간단하다
추가 메모리가 거의 필요 없다
안정적인 정렬이다 ( 같은 값의 순서가 보존됨 )
버블 정렬의 단점
시간 복잡도가 비효율적이다
배열이 클수록 성능이 급격히 저하된다
다른 정렬 알고리즘에 비해 교환 횟수가 많다