코드를 작성하다보면 가끔 한 번에 여러 값을 반환해주고 싶을 때가 있다.
자료형이 동일한 경우라면 'List'와 같은 컬렉션을 활용하여 반환해줄 수 있겠지만,
각각의 자료형이 다르다면 일일히 전역 변수로 선언하거나, struct 구조체를 사용하여 반환해주어야 한다.
하지만 메소드 내부에서만 값을 주고받는다면 전역 변수로 선언해주기도 애매하고,
각각의 변수의 이름을 정하는 것도 상당히 귀찮을 수 있다.
이런 상황에서 튜플을 사용하기 좋은데, 튜플은 간단한 데이터들을 그룹화하여 반환할 수 있는 자료구조로
코드의 가독성을 높이고 변수의 선언과 명명에 드는 수고를 덜어준다.
튜플과 구조체의 차이
tuple | struct | |
형식 | 참조 타입 | 값 타입 |
정의 방식 | 각 요소의 이름을 정의해줄 필요가 없다. | 각 구조체를 명시적으로 정의해야한다. |
특성 | 불변성 | 가변성 (this()를 사용하여 불변성으로 수정 가능) |
사용방법
1. 각 요소의 이름없이 튜플 생성
요소의 순서대로 Item1, Item2, ... 로 데이터를 읽을 수 있다.
// 명시적인 타입 지정
(int, float) data = (1, 1.1f);
Debug.Log($"요소1 {data.Item1}, 요소2 {data.Item2}");
// var을 이용한 타입 추론
var data = (1, 1.1f);
Debug.Log($"요소1 {data.Item1}, 요소2 {data.Item2}");
2. 튜플의 각 요소에 이름을 지정
데이터를 읽을 때, 원하는 이름으로 불러올 수 있다.
// 튜플 요소에 변수 선언 해주기
(int a, float b) data = (1, 1.1f);
Debug.Log($"요소1 {data.a}, 요소2 {data.b}");
// 튜플의 인스턴스에 이름 지정해주기
// var로도 이름 지정 가능
(int, float) data = (a: 1, b: 1.1f);
Debug.Log($"요소1 {data.a}, 요소2 {data.b}");
3. 튜플 구조 분해 할당
튜플의 값 데이터를 분리할 수 있다.
var data = (1, 1.1f);
(int a, float b) = data;
Debug.Log($"요소1 {a}, 요소2 {b}");
사용 예시
- 더하기빼기 계산기
public (int sum, int subtract) Calculate(int a, int b)
{
int plus = a + b;
int minus = a - b;
return (plus, minus);
}
void Start()
{
var result = Calcuate(10, 7);
Debug.Log(result.sum); // 출력: 17
Debug.Log(result.subtract); // 출력: 3
}
- BMI 측정하기
public class Person
{
public string name;
public int age;
public string location;
public float height;
public float weight;
public Person(string name, int age, string location, float height, float weight)
{
this.name = name;
this.age = age;
this.location = location;
this.height = height;
this.weight = weight;
}
// 이름과 bmi를 반환하는 메소드
public (string name, float bmi) GetBMI()
{
float bmi = weight / (height * height);
return (name, bmi);
}
}
public class TupleExample
{
void Start()
{
Person person = new Person("Maca", 25, "서울", 180f, 80.0f);
var bmiInfo = person.GetBMI();
Debug.Log($"Name: {bmiInfo.name}, BMI: {bmiInfo.bmi}");
}
}
'공부 > 유니티' 카테고리의 다른 글
[Unity] Foreach를 써도 괜찮은 걸까? (0) | 2024.01.29 |
---|---|
[Unity] Unity Analytics Service (0) | 2024.01.29 |
[Unity] Assembly와 Namespace (0) | 2024.01.28 |
[Unity] string과 가비지 컬렉터 (0) | 2024.01.28 |
[Unity] Generic Collection (0) | 2024.01.28 |