안풀리는 문제는 혼자서 몇시간을 붙잡고있지는 말자. 도움받을 수 있다!
Short-Circuit Evaluation. 짧은 계산
게으른 계산
조건식에서 A && B 를 계산할 때 A가 false면 B는 계산하지 않아요. B가 뭐가 나와도 이 조건의 결과는 false라서 그렇습니다.
그리고 A || B를 계산할 때도 A가 true면 이번에도 B는 계산하지 않아요. B가 뭐가 나와도 무조건 true이기 때문이죠!
이런 경우 의미없는 게으른 연산이라고 할 수 있어요~ 이런 규칙이 있다는걸 알아만 두세요~ 같은 결과를 어렵게 혹은 쉽게 만들 수 있기 때문에 누군가 이런식으로 코딩했을 때 코드를 읽기 위함입니다!
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: 본문;}
은 같은 결과를 보여줍니다.Math.random()
0이상 1 미만의 값 중 무작위로 double값을 리턴하는 함수에요.
int num = (int)Math.random()*n+1
int num = (int)(Math.random()*6)+1
- 사용자에게 가위(1) 바위(2) 보(3) 중 선택하도록 하고 선택결과를 정수에 저장
- 컴퓨터가 난수 1,2,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문으로도 만들 수 있었어요.
또 한가지 응용하는 방법은 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;
}
조건문같이 프로그램이 한 번 실행되는것은 굳이 효율성을 생각안해도 괜찮아요. 반복문을 배운 후부터 효율성을 고려하면 좋을 것 같아요. 굳이 따지면 코드가 짧을수록 좋은 것이지만 코드를 짧게 하기 위해 가독성을 없애버리면 결코 좋은 코드라고 할 수 없습니다.