오늘의 실수
- 중복은 만악의 씨앗! 중복되는 부분은 최대한 변수로 묶어 없애기!
단 두 번이라도 절대 XXXXXXXXXXXXXX- if조건문 -> &&와 ||를 잘 사용하기!!!!
- 리팩토링 - 같은 코드도 어떻게 짜는가 (보기좋게, 중복없이, 짧게, 성능 등을 추구)
- 클래스 이름, 변수 이름, 코드 중복 여부,
- 블럭(ex if문)을 보면 수행이 보장되는 블럭인지 아닌지 확인할 것! 변수가 있다면 특히 더 확인!
- 컴파일러는 변수(값)를 계산하지 않고 자료형만 확인함
예를 들면 if문의 조건부에 boolean값이 들어가있는지만 확인한다. 값을 계산하지 않는다.
즉, 조건이 무조건 true여도! 존재하지 않는 false인 경우까지 고려하여, 컴파일 error를 반환할 수 있는 것!
짝 프로그래밍 (Pair Programming)
30초씩 번갈아 프로그래밍을 하기
상승 작용이 있다
if(조건식){
A;
}
B;
/*
만약 조건이 참이라면(true값) 프로그램은 A -> B를 실행한다.
만약 조건이 거짓이라면(false값) 프로그램은 A를 실행하지 않는다. (B만 실행한다.)
*/
소개팅 간다;
if(예쁜가?){
열심히 임한다;
} else {
대충 임한다;
}
집에 간다;
소개팅 간다;
if(잘생겼는가?){
열심히 임한다;
} else if(이야기가 잘 통하는가?){
조금 생각해본다;
} else if(몸이 좋은가?){
밥을 먹어본다;
} else {
전화한다;
}
집에 간다;
예제 3-1
import java.util.Scanner; // public class EvenOdd{ public static void main(String[] args){ int number; // Scanner sc = new Scanner(System.in); System.out.print("정수를 입력하시오: "); number = sc.nextInt(); // if (number % 2 == 0){ System.out.println("입력된 정수는 짝수입니다."); } else { System.out.println("입력된 정수는 홀수입니다."); } } }
int n = 5;
if (n != 5)
if(n > 3)
System.out.println("A");
else
System.out.println("B");
// 결과: 없음
/* else는 중괄호가 없을 때 가장 가까운 if와 짝이 됨
이는 들여쓰기 실수이며, 실제 컴퓨터가 받아들이는 의미는 다음과 같다. */
int n = 5;
if (n != 5)
if(n > 3)
System.out.println("A");
else
System.out.println("B");
// n이 5일 때 "B"가 나오게 하고 싶다면 아래와 같이 바꾸어야 한다.
int n = 5;
if (n != 5){
if(n > 3){
System.out.println("A");
}
} else {
System.out.println("B");
}
// 결과는 "B"
// 실수하지 않도록 {}를 잊지 말자!
import java.util.Scanner; class Quiz1 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); // System.out.print("년도: "); int year = sc.nextInt(); // if(year % 4 == 0 && year % 100 != 0){ System.out.println("결과: 윤년입니다."); } else if(year % 400 == 0){ System.out.println("결과: 윤년입니다."); } else { System.out.println("결과: 윤년이 아닙니다."); } } }
다른 풀이 (읽고 쓰기 쉬운 코드)
import java.util.Scanner; class Quiz1 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); // System.out.print("년도: "); int year = sc.nextInt(); // boolean cond1 = ((year % 4) == 0) boolean cond2 = ((year % 100) != 0) boolean cond3 = ((year % 400) == 0) // if((cond1 && cond2) || cond3){ System.out.println("결과: 윤년입니다."); } else { System.out.println("결과: 윤년이 아닙니다."); } } }
import java.util.Scanner; class Quiz2 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); // System.out.print("컵 사이즈: "); int size = sc.nextInt(); // if(size < 100){ System.out.println("small"); } else if(size < 200){ System.out.println("medium"); } else { System.out.println("large"); } } }
다른 풀이 (디팩토링)
import java.util.Scanner; class Quiz2 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); // System.out.print("컵 사이즈: "); int size = sc.nextInt(); String result = "large"; // if(size < 100){ result = "small"; } else if(size < 200){ result = "medium"; } System.out.println(result); } }
import java.util.Scanner; class Quiz3 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); // System.out.print("키: "); int height = sc.nextInt(); System.out.print("몸무게: "); int weight = sc.nextInt(); // double stdWeight = (height - 100) * 0.9; String result = "표준체중"; // if(weight < (stdWeight - 5)){ result = "저체중"; } else if(weight > (stdWeight + 5)){ result = "과체중"; } System.out.println("당신은 " + result + "입니다."); } }
다른 풀이 (디팩토링) (중복 제거!!! +-5 -> sd))
import java.util.Scanner; class Quiz3 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); // System.out.print("키: "); int height = sc.nextInt(); // System.out.print("몸무게: "); int weight = sc.nextInt(); // double stdWeight = (height - 100) * 0.9; String result = "표준체중"; int sd = 5; // if(weight < (stdWeight - sd)){ result = "저체중"; } else if(weight > (stdWeight + sd)){ result = "과체중"; } System.out.println("당신은 " + result + "입니다."); } }
class Quiz4 { public static void main(String[] args){ int num; boolean flag = true; if(flag){ num = 5; } } } // 컴파일 가능! // if문이 false일 때 num이 초기화되지 않지만, num을 불러내는 연산이 없으므로 가능
class Quiz4 { public static void main(String[] args){ int num; boolean flag = true; if(flag){ num = 5; } System.out.println(num); } } // ERROR!! // if문이 false일 때 num이 초기화되지 않으므로 println(num)의 에러
class Quiz4 { public static void main(String[] args){ int num; boolean flag = true; if(flag){ num = 5; } else { num = 6; } System.out.println(num); } } // 컴파일 가능! // if문이 false일 때에도 num이 초기화되므로 가능
class Quiz4 { public static void main(String[] args){ int num; boolean flag = true; if(flag){ num = 5; } else if(!flag) { num = 6; } System.out.println(num); } } // ERROR!! // false일 때를 고려하는 else가 없으므로 에러