🎲 switch
- if - else 반복을 줄인다!
- 가독성을 높여준다!
- switch(n) 인수로는 기본적으로 정수와 문자를 넣을 수 있다!
- 최근 C#에서는 다른 타입의 객체도 넣을 수 있게끔 개선됐다.
- break에 걸리지 않으면 해당된 case에서부터 쭉쭉 다 실행한다. 해당 case만 실행 시킬 것이라면 break 꼭 명시!
- break는 switch문을 벗어나는 것에 해당한다!
- switch문으로 표현 한 것은 항상 if - else 문으로도 표현할 수 있지만, 그 반대는 항상 성립되는 것은 아니다. switch는 값에 따른 분기에만 한정 됨. 따라서 간단한 분기의 경우 가독성 좋은 switch를 권장! 복잡한 조건 분기의 경우 if - else문 사용하기.
- switch문의 case값으로는 ⭐️일반 변수가 들어갈 순 없다.
- 상수 리터럴이나 const 상수가 들어가야 한다.
- 즉 실행 중에 값이 바뀔 수 있는 변수는 들어갈 수 없다.
- 이와 달리 if - else문은 조건문에도 일반 변수를 사용할 수 있다.
int rock = 1; const int paper = 2; switch(choice) { case rock: // -> 에러!! case엔 컴파일 타임에 메모리가 결정되는 상수가 들어와야함! break; case paper: // -> 괜춘. const 상수이므로 문제 없다! break; }
🎲 열거형
열거형 -> 같은 종류의 상수 모음!
- 상수나 변수를 사용하는 이유?
- 상수 리터럴을 통한 하드 코딩은 그 의미를 알기 쉽지 않고 리팩토링이 어렵기 때문에.
- Q. 상수 vs 리터럴 의미
상수 : 메모리 위치(공간)이며, 메모리 값을 변경할 수 없다.
리터럴 : 메모리 위치(공간) 안에 저장되는 값이다.- enum 열거형을 사용하는 이유?
- 상수이므로 의미를 알기 쉬움!
- 연관된 것들을 하나의 enum으로 묶기 때문에 그룹화를 할 수 있다!
- 상수나 변수가 굉장히 많아지면 이름이 중복될 우려가 있는데, 서로 다른 enum에 속하면 이름이 동일해도 전혀 다른 것으로 간주되기 때문에 이름 중복 우려를 방지할 수 있다.
enum Choice { Rock, Paper, Scissors }
- 열거형 선언은 클래스처럼 함수 밖에서 선언되어야 한다!
- 내부적으로는 정수가 저장된다!
- 값이 입력 안되면 디폴트 값 0에서 출발하여 0, 1, 2, 3 이런식으로 저장된다. 이전 값에서 +1한 값으로 설정된다.
- 아래와 같이 직접 값을 명시해줄 수도 있다!
enum Choice { Rock = 1, Paper, // 자동으로 2가됨 Scissors = 0 }
- enum은 상수의 모음이기 때문에 case문에 사용할 수 있다.
- Choice.Rock, Choice.Paper 이거 자체로는 정수타입이 아니라 enum 타입이기 때문에 (int)로 형 변환 해주어야 한다. 현재 switch 조건문의 choice가 int형이니까!!
int choice = 2; switch(choice) { case (int)Choice.Rock: break; case (int)Choice.Paper: break; }열거형 변수는 초기화 하지 않으면 자동으로 첫번째 값으로 초기화 한다.
enum Choice { Rock = 1, Paper, // 자동으로 2가 된다. 이전 값이 1 이어서. Scissors = 0 } ... static void Main(string[] args) { Choice choice; // 초기화 안했지만 자동으로 choice = Choice.Rock 이 됨. }