[21.07.05] switch

4556 단어 JavaJava

안풀리는 문제는 혼자서 몇시간을 붙잡고있지는 말자. 도움받을 수 있다!


SCE

Short-Circuit Evaluation. 짧은 계산

Laz Evaluation

게으른 계산

조건식에서 A && B 를 계산할 때 A가 false면 B는 계산하지 않아요. B가 뭐가 나와도 이 조건의 결과는 false라서 그렇습니다.
그리고 A || B를 계산할 때도 A가 true면 이번에도 B는 계산하지 않아요. B가 뭐가 나와도 무조건 true이기 때문이죠!
이런 경우 의미없는 게으른 연산이라고 할 수 있어요~ 이런 규칙이 있다는걸 알아만 두세요~ 같은 결과를 어렵게 혹은 쉽게 만들 수 있기 때문에 누군가 이런식으로 코딩했을 때 코드를 읽기 위함입니다!


switch

switch(변수){ 
case 특정값1 : 
	본문1; break; 
case 특정값2 : 
	본문2; break; 
default : 
	본문3; break;
}

변수의 값에 따라 실행문이 선택되는 제어문입니다. case 하나가 하나의 if문이라고 생각할 수 있어요
break는 다음 case문을 실행하지 않고 switch 종료할 수 있게합니다. 만약 break가 없는 switch문은 변수의 값이 특정값1이라면 본문1 본문2 본문3까지 다 실행하게 됩니다~ 멈춰🖐
default는 특정값들 이외의 값이 나올경우 실행되는 문단으로 if문의 else같은 존재라고 생각하면 되겠어요

  • if(변수==A||변수==B){본문;}switch(변수){case A:case B: 본문;}은 같은 결과를 보여줍니다.

랜덤함수 random()

Math.random()
0이상 1 미만의 값 중 무작위로 double값을 리턴하는 함수에요.

  • 만약 1부터 n까지의 int값을 무작위로 받고싶다면?
    int num = (int)Math.random()*n+1
    double을 반환하는 random()를 int로 형변환해줍니다! 보통 데이터 타입이 안맞을 때 변수의 타입을 바꾸는것보다 값을 형변환하는게 좋아요. 근데 여기서 문제가 있다는 것 알아차리셨나요?
    0부터 1사이의 random값을 int로 형변환하면 값은 무조건 0만 나오게 됩니다. 우선순위때문에 그런데요 double값을 먼저 계산한 후에 최종값을 int로 변환해야합니다!
    = int num = (int)(Math.random()*6)+1

[문제] 가위 바위 보 게임

  1. 사용자에게 가위(1) 바위(2) 보(3) 중 선택하도록 하고 선택결과를 정수에 저장
  2. 컴퓨터가 난수 1,2,3을 발생시켜서 저장
  3. 사용자와 컴퓨터가 비기면 비겼습니다 출력. 이기면 이겼습니다 출력. 지면 졌습니다 출력하기
  • 동작 분석하기
    만약 내가 1이면 컴퓨터가 2면 지고 3이면 이긴다.
    만약 내가 2이면 컴퓨터가 3이면 지고 1이면 이긴다.
    만약 내가 3이면 컴퓨터가 1이면 지고 2면 이긴다.
Scanner sc=new Scanner(System.in);
System.out.print("1.가위 2.바위 3.보 중 선택하기 : ");
int rps = sc.nextInt();
sc.close();
int comp = (int)(Math.random()*3)+1;
		
switch(rps) {
case 1:
	if(comp == 1) {
		System.out.println("컴퓨터가 가위를 내서 당신은 비겼습니다.");
	}else if(comp == 2) {
		System.out.println("컴퓨터가 바위를 내서 당신이 졌습니다.");
	}else {
		System.out.println("컴퓨터가 보를 내서 당신이 이겼습니다.");
	}
	break;
case 2:
	if(comp == 1) {
		System.out.println("컴퓨터가 가위를 내서 당신이 이겼습니다.");
	}else if(comp == 2) {
		System.out.println("컴퓨터가 바위를 내서 당신은 비겼습니다.");
	}else {
		System.out.println("컴퓨터가 보를 내서 당신이 졌습니다.");
	}
	break;
case 3:
	if(comp == 1) {
		System.out.println("컴퓨터가 가위를 내서 당신이 졌습니다.");
	}else if(comp == 2) {
		System.out.println("컴퓨터가 바위를 내서 당신이 이겼습니다.");
	}else {
		System.out.println("컴퓨터가 보를 내서 당신은 비겼습니다.");
	}
	break;
default:
	System.out.println("잘못된 입력입니다.");
	break;
		}

오늘 switch를 배워서 switch를 활용하는 쪽으로 써봤는데 그냥 switch를 if로 바꿔서 중첩 if문으로도 만들 수 있었어요.

  • MISS
    처음에는 최대한 코드를 짧게 써보고 싶어서 if문 하나로만 만들어보려고 rps>comp, rps<comp, rps==comp으로 해봤었어요. 근데 이러니깐 만약 rps<comp이 이겼다고 지정할 경우 내가 가위를 내고 컴퓨터가 보를 내면 1<3으로 정답이지만 가위와 바위인 경우 내가 져야하지만 1<2도 이겼다고 출력하는 오류가 발생하더라구요ㅎ,, !다양한 테스트 케이스가 필요한 이유!

또 한가지 응용하는 방법은 rps를 정수가 아닌 가위/바위/보 string으로 입력받고 comp의 값을 1~3까지 난수을 받아서 만약 1이면 새로운 string변수에 "가위"를 넣는 식으로 문자열로 입,출력받는 방식도 가능할 것 같아요. 이러면 대신 변수가 3개가 필요하겠져

Scanner sc=new Scanner(System.in);
System.out.print("1.가위 2.바위 3.보 중 선택하기 : ");
String rps = sc.nextLine();
sc.close();
		
int comp = (int)(Math.random()*3)+1;
String computer;
if(comp==1) {
	computer = "가위";
}else if(comp==2) {
	computer = "바위";
}else {
	computer = "보";
}
		
switch(rps) {
case "가위":
	if(comp == 1) {
		System.out.println("컴퓨터가 "+computer +"를 내서 당신이 비겼습니다.");
	}else if(comp == 2) {
		System.out.println("컴퓨터가 "+computer +"를 내서 당신이 졌습니다.");
	}else {
		System.out.println("컴퓨터가 "+computer+"를 내서 당신이 이겼습니다.");
	}
	break;
case "바위":
	if(comp == 1) {
		System.out.println("컴퓨터가 "+computer+"를 내서 당신이 이겼습니다.");
	}else if(comp == 2) {
		System.out.println("컴퓨터가 "+computer +"를 내서 당신이 비겼습니다.");
	}else {
		System.out.println("컴퓨터가 "+computer +"를 내서 당신이 졌습니다.");
	}
	break;
case "보":
	if(comp == 1) {
		System.out.println("컴퓨터가 "+computer +"를 내서 당신이 졌습니다.");
	}else if(comp == 2) {
		System.out.println("컴퓨터가 "+computer+"를 내서 당신이 이겼습니다.");
	}else {
		System.out.println("컴퓨터가 "+computer +"를 내서 당신은 비겼습니다.");
	}
	break;
default:
	System.out.println("잘못된 입력입니다.");
	break;
}

조건문같이 프로그램이 한 번 실행되는것은 굳이 효율성을 생각안해도 괜찮아요. 반복문을 배운 후부터 효율성을 고려하면 좋을 것 같아요. 굳이 따지면 코드가 짧을수록 좋은 것이지만 코드를 짧게 하기 위해 가독성을 없애버리면 결코 좋은 코드라고 할 수 없습니다.

좋은 웹페이지 즐겨찾기