필요한 조건이나 경우에 따라서 다른 방식의 연산을 해주어야 한다.
if(조건1){
// 조건1이 true일때 호출
}
else{
// 조건1이 false일때 호출
}
if(조건1){
// 조건1이 true일때 호출
}
else if(조건2){
// 조건1이 false이면서
// 조건2가 true일때 호출
}
else{
// 조건1이 false이면서
// 조건2가 false일때 호출
}
switch(변수 or 연산식)
{
case 값1:
//값1이 나온 경우
break; // 스위치문 탈출
case 값2:
//값2이 나온 경우
break;
case 값3:
//값3이 나온 경우
break;
default:
//값1,2,3에 해당하지 않는 경우
break;
}
int num = 조건식 ? (true일때) 값 또는 식 : (false일때) 값 또는 식;
// 중첩 및 함수 등의 식 사용 가능.
어떤 값을 찾는다거나, 특정한 배열에 대해 동일한 작업을 여러번 수행해준다거나 작업을 반복적으로 수행할 때 사용한다.
공통적으로 반복을 제어하는 조건식이 있고, 조건식이 true일때 반복하고 false일때 반복을 멈춘다.
for(초기식; 조건식; 증감식)
{
// 조건식이 true일 때 실행되는 코드
}
//무한 반복, 루프
for(;;){}
while(조건){
// 조건식이 true일 때 실행되는 코드
// false가 되면 자동으로 반복 종료
}
do{
// 코드 블럭
}
while(조건식); //조건식이 true이면 do 구분 반복
string[] arr = {"1","2","3","4","5"};
foreach(string el in arr){
Console.WriteLine(el);
}
continue;
break;
// 선언
int[] arr;
// 초기화
arr = new int[3];
// 한줄 선언과 초기화
int[] arr2 = new int[5];
// 접근
arr2[1] = 1;
int a = arr2[3];
// 길이
arr2.Length;
// 2차원 배열 선언
int [,] arr2D = new int[2, 3]; // 2행 3열
// 초기화
arr2D[0,0]= 1;
arr2D[0,1]= 2;
arr2D[0,2]= 3;
arr2D[1,0]= 4;
arr2D[1,1]= 5;
arr2D[1,2]= 6;
// 선언과 함께 초기화
int[,] arr2D = new int[3, 4] {
{1,2,3,4},{1,2,3,4},{1,2,3,4}
};
// 3차원 배열
int[,,] arr3D = new int[2,3,4] {
{{1,2,3,4},{1,2,3,4},{1,2,3,4}},
{{11,12,13,14},{11,12,13,14},{11,12,13,14}}
};
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Add(4);
numbers.Remove(2);
foreach(int number in numbers) // 리스트 데이터 출력
{
Console.WriteLine(number); // 1 3 4
}
Dictionary<string, int> scores = new Dictionary<string, int>(); // 빈 딕셔너리 생성
scores.Add("Alice", 100); // 딕셔너리에 데이터 추가
scores.Add("Bob", 80);
scores.Add("Charlie", 90);
scores.Remove("Bob"); // 딕셔너리에서 데이터 삭제
foreach(KeyValuePair<string, int> pair in scores) // 딕셔너리 데이터 출력
{
Console.WriteLine(pair.Key + ": " + pair.Value);
}
Stack<int> stack1 = new Stack<int>(); // int형 Stack 선언
// Stack에 요소 추가
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);
// Stack에서 요소 가져오기
int value = stack1.Pop(); // value = 3 (마지막에 추가된 요소)
Queue<int> queue1 = new Queue<int>(); // int형 Queue 선언
// Queue에 요소 추가
queue1.Enqueue(1);
queue1.Enqueue(2);
queue1.Enqueue(3);
// Queue에서 요소 가져오기
int value = queue1.Dequeue(); // value = 1 (가장 먼저 추가된 요소)
HashSet<int> set1 = new HashSet<int>(); // int형 HashSet 선언
// HashSet에 요소 추가
set1.Add(1);
set1.Add(2);
set1.Add(3);
// HashSet에서 요소 가져오기
foreach (int element in set1)
{
Console.WriteLine(element); // 1 2 3
}
리스트는 동적으로 크기를 조정할 수 있어 배열보다 많은 메모리를 사용한다.
따라서, 많은 데이터를 다루는 경우 리스트를 무분별하게 사용하면
메모리 사용량이 급격히 증가하여 성능 저하를 유발할 수 있다.
리스트는 연결 리스트(Linked list)로 구현되기 때문에, 인덱스를 이용한 데이터 접근이 배열보다 느리다.
(배열에 비해 상대적으로 느리다.)
리스트에서 특정 인덱스의 데이터를 찾기 위해서는 연결된 노드를 모두 순회해야 하기 때문이다.
이러한 이유로, 리스트를 무분별하게 사용하면 데이터 접근 시간이 증가하여 성능이 저하될 수 있다.
리스트는 동적으로 크기를 조정할 수 있기 때문에, 데이터 추가, 삭제 등의 작업이 배열보다 간편하다.
하지만, 이러한 유연성은 코드 복잡도를 증가시킬 수 있다.
리스트를 사용할 때는 데이터 추가, 삭제 등의 작업을 적절히 처리하는 코드를 작성해야 하므로, 코드의 가독성과 유지보수성이 저하될 수 있다.
따라서, 리스트를 무분별하게 쓰는 것은 좋은 습관은 아니다.
데이터 구조를 선택할 때는 데이터의 크기와 사용 목적을 고려해서
배열과 리스트 중 적절한 것을 선택해야 한다.
메서드를 사용하면 동일한 작업을 반복해서 구현하지 않아도 된다. (반복된 코드를 줄일 수 있다.)
필요한 메소드를 호출하여 작업을 수행할 수 있다.
메서드를 사용하여 코드를 작은 단위로 분리하고 관리할 수 있다.
분리된 메서드는 자신에게 부여된 역할을 수행하고 있어서 코드의 구조가 더 명확해진다.
코드가 간결해지고 가독성이 좋아진다.
문제가 생기면 해당 메서드만 수정하면 되므로 유지보수가 용이해진다.
반복적인 작업을 메서드로 묶어서 코드 중복을 방지한다.
메서드로 작업 단위를 추상화하고, 메서드 이름을 통해 해당 작업이 어떤 역할을 하는지 파악할 수 있다.
[접근 제한자] [리턴 타입] [메서드 이름]([매개변수])
{
// 메서드 실행 코드
}
public int Add(int a, int b){
return a + b;
}
int num = Add(10, 20);
메서드가 수행한 작업 결과를 반환하는 것이다.
메서드 선언 시 반환값의 타입을 지정할 수 있고, 지정한 타입에 맞게 반환해야한다.
void와 같이 반환값이 없는 경우도 있다.
string val;
void SetValue(string str){
val = str;
}
void SetValue(int num){
val = num.toString();
}
struct Fruit {
public string name;
public float price;
public void ShowInfo(){
Console.WriteLine("This is {0} and price is {1}", name, price);
}
}
Fruit orange;
orange.name = "Orange";
orange.price = 350f;
orange.ShowInfo();