조건문
if(조건식){
// 조건식이 참(true)일 때 수행될 문장을 삽입
}
가장 기본적인 조건문이다. if의 뜻대로 만일(if) 조건식이 참(true)이면 괄호{ } 안의 문장들을 수행한다.라는 의미로 이해하면 될 것이다.
블록
if(score > 70)
{ -> 블럭의 시작
System.out.println("합격");
} -> 블럭의 끝
괄호 { }를 이용해서 여러 문장을 하나의 단위로 묶을 수 있다. 이것을 '블록(block)'이라고 한다. 블록은 { 로 시작해서 }로 끝난다. 블록에는 문장의 끝을 의미하는 ' ; '를 붙이지 않는다.
if-else문
if(조건식){
// 조건식이 참(true)일 때 수행될 문장
} else {
// 조건식이 거짓(false)일 때 수행될 문장
}
if문의 변형인 if-else문의 구조는 다음과 같다. if만 사용하다가 else라는 블록이 추가되었다. else의 '그 밖에 다른'이라는 뜻이다. 조건식의 결과가 참이 아닐 때, 즉 거짓일 때 else안에 있는 무장들을 수행하게 된다.
if-else if문
if(조건식1){
// 조건식1의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if(조건식2) {
// 조건식2의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if(조건식3) {
// 조건식3의 연산결과가 참일 때 수행될 문장들을 적는다.
} else {
// 위의 어느 조건식도 만족하지 않을때 수행될 문장들을 적는다.
if-else문은 두 가지 경우중 하나만 수행되는 구조이다. 하지만 처리해야 할 경우의 수가 셋 이상인 경우에는 if-else문을 사용하지 못한다. 그럴 때는 한 문장에 여러 개의 조건식을 쓸 수 있는 'if-else if'문을 사용해 주면 된다.
첫 번째 조건식부터 체크를 한다. if(조건식 1)에서 조건식 1이 참이면 문장을 실행하고, 거짓이면 아래로 내려가 else if(조건식 2)를 만나게 된다. 이런 식으로 차례차례 아래로 내려가며 비교해 준다.
else if는 여러 개를 사용할 수 있고, else는 주로 마지막에 사용된다. 위 조건식중 어느 것도 만족하지 않으면 실행시켜 줄 문장을 적는 것이다. else는 생략이 가능하다.
중첩 if문
if(조건식1) {
// 조건식1의 연산 결과가 true일 때 수행될 문장들을 적는다.
if(조건식2){
// 조건식1과 조건식2가 모두 true 일 때 수행될 문장들을 적는다.
} else {
// 조건식1이 true이고, 조건식2가 flase일 때 수행될 문장들을 적는다.
}
} else {
// 조건식1이 false일 때 수행될 문장들을 적는다.
}
if문의 블록 내에 또 다른 if문을 포함시키는 것이 가능하다. 이것을 중첩 if문이라고 부른다. 중첩의 횟수에는 거의 제한이 없다. 위 코드처럼 중첩 if문을 사용할 때는 내부의 if문을 외부의 if문보다 안쪽으로 들여 쓰기를 해서 두 if문의 범위가 명확히 구분될 수 있도록 작성해야 한다. 또한 괄호{ }의 실수가 많이 일어나는 부분이므로 { }를 제대로 사용하였는지 확인해야 한다.
switch-case문
switch(조건식){
case 값1 :
// 조건식의 결과가 값1과 같을경우 수행될 문장
break;
case 값2 :
// 조건식의 결과가 값2와 같은경우 수행될 문장
break;
default :
// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}
switch() 안에 조건식을 넣어서 조건식을 먼저 계산해 준다. 그 후 값이 나왔을 때 각 case 값 1 이 부분부터 차례대로 아래로 수행한다. 만약 case마다 순차적으로 돌아가며 확인을 하다가 값이 일치하면 그 값에 포함된 문장들을 수행한다. 수행 후 break;를 만나게 되면 switch문 전체를 빠져나가며 종료한다. default는 조건식의 값과 일치하는 case가 없을 때 수행된다.
default는 break;를 안 써도 되는 건가 의문이 들 수 있다. dafault는 어느 위치에 두어도 상관없다. 보통 마지막에 놓기 때문에 break;를 쓰지 않는 것이다. 마지막 위치가 아닐 경우에는 break;를 꼭 적어주어야 한다.
swtich-case문의 제약조건
1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
2. case문의 값은 정수 상수(문자 포함), 문자열만 가능하며 중복되지 않아야한다.
Math.random()
0.0 <= Math.random() < 1.0
0.0 ~ 1.0 사이의 범위에 속하는 하나의 double값을 반환
Math.random() 메서드를 사용하면 0.0부터 10 사이의 범위에 속하는 하나의 double값을 랜덤으로 반환한다. 0.0은 범위에 포함되고 1.0은 포함되지 않는다.
for문
for(초기화; 조건식; 증감식){
// 조건식이 참(true)인 경우 수행될 문장을 적는다.
}
ex) for(int i=1; i<=5; i++){
System.out.println("Hello");
}
for문은 어떤 작업이 반복적으로 수행될 때 사용한다. for안에 초기화, 조건식, 증감식이 들어간다. 예로 적힌 ex)를 확인해 보겠다.
초기화 : i=1 정수형 변수 i를 선언하고 1로 초기화해 주었다.
조건식 : i <=5 변수 i가 5보다 작거나 같을 때까지 문장을 실행한다.
증감식 : i++ i에 1씩 더해주겠다.
이렇게 생각을 하고 ex)를 보게 되면 이해가 될 것이다. "Hello"는 총 5번 출력될 것이다. i는 1,2,3,4,5 총 5가지의 경우가 반복될 것이며 블록{ } 내부의 문장을 실행시켜 주게 되니 "Hello"가 5번 출력될 것을 알 수 있다.
while문
while(조건식){
// 조건식의 결과가 참(true)인 동안, 반복될 문장들을 적는다.
}
for문에 비하여 while문의 구조는 간단하다. while문은 조건식이 참(true)인 동안 반복된다. 조건문이 거짓(false)이 될 때 while문은 종료된다.
for(int i=1; i<10; i++){
System.out.println(i);
}
/////////////////////////
int i=1;
while(i<=10){
System.out.println(i);
i++;
}
위 두 가지 for문과 while문의 코드는 완전히 동일하다고 생각할 수 있다.
do-while문
do{
// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다. (처음 한번은 무조건 실행)
} while(조건식);
do-while문은 while문의 변형이다. 기본적인 구조는 while문과 같으나 조건식과 블록{ }의 순서를 바꿔놓은 것이다. 따라서 while문과 반대로 블록{ }을 먼저 수행한 후에 조건식을 수행한다. while문은 조건식의 결과에 따라서 블럭{ }이 한 번도 수행되지 않을 수 있지만, do-while문은 최소한 한 번은 수행한다.
break문
class wook{
public static void main(String[] args){
int sum = 0;
int i= 0;
While(true){
if(sum > 100)
break;
++i;
sum += i;
}
System.out.println("i=" + i);
System.out.println("sum =" + sum);
}
}
반복문에서도 break문을 사용할 수 있다. switch문에서 그랬던 것처럼, break문은 자신이 포함된 가장 가까운 반복문ㅇ르 벗어난다. 주로 if문과 함께 사용되어 특정 조건을 만족할 때 반복문을 벗어나게 한다. 위 코드에서 While문안의 if(sum >100) 일시 break;를 사용하였다. 이는 sum이 100을 넘는 순간 바로 while문은 종료된다.
continue문
class wook{
public static void main(String[] args){
for(int i=0; i<=10; i++){
if(i%3 == 0)
continue;
System.out.println(i);
}
}
}
continue문은 반복문 내에서만 사용될 수 있다. 반복문이 진행되는 도중 continue문을 만나면 반복문의 끝으로 이동하고 다음 반복으로 이동한다. for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우에는 조건식으로 이동한다.
continue문과 break문의 다른 점은 continue문은 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break문과 다르다. 위의 예시는 if(i%3 == 0) 일 때 continue문을 사용하였다. i를 3으로 나눈 나머지의 값이 0이면 그 아래 Syste.out.println(i)를 실행하지 않고 다음 반복문으로 넘어간다. 그래서 출력결과는 3의 배수는 출력하지 않는다고 생각할 수 있다.
자바의 정석(기초편) CHAPTER 4. 연습문제
1. 10 < x && x < 20
2.!(ch == ' ' || ch == '\t')
3. ch == 'x' || ch == 'X'
4. '0' <= ch && ch <= '9'
5. ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')
6. year % 400 == 0 || (year % 4 == 0 && year % 100!=0)
7.! powerOn 또는 powerOn == false
8. str.equals("yes")
class Exercise4_2 {
public static void main(String[] args) {
int sum = 0;
for(int i=1; i <=20; i++) {
if(i%2!=0 && i%3!=0)
sum +=i;
}
System.out.println("sum="+sum);
} // main
}
다음과 같이 i를 2로 나누거나 3으로 나눴을 때 둘 다 0이 아닐 때만 sum에 i값을 저장해 준다. i는 20까지 증가한다.
1 + 5 + 7 + 11+ 13 + 17 + 19 = 73
정답은 73
class Exercise4_3 {
public static void main(String[] args) {
int sum = 0;
int totalSum = 0;
for(int i=1; i <=10; i++) {
sum += i;
totalSum += sum;
}
System.out.println("totalSum="+totalSum);
} // main
}
1 | sum = 1 | totalSum = 1 |
2 | 3 = 1 + 2 | 4 = 1 + 3 |
3 | 6 = 1 + 2 + 3 | 10 = 1 + 3 + 6 |
4 | 10 = 1 + 2 + 3 + 4 | 20 = 1 + 3 + 6 + 10 |
5 | 15 = 1 + 2 + 3 + 4 + 5 | 35 = 1 + 3 + 6 + 10 + 15 |
6 | 21 = 1 + 2 + 3 + 4 + 5 + 6 | 56 = 1 + 3 + 6 + 10 + 15 + 21 |
7 | 28 = 1 + 2 + 3 + 4 + 5 + 6 + 7 | 84 = 1 + 3 + 6 + 10 + 15 + 21 + 28 |
8 | 36 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 | 120 = 1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 |
9 | 45 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 | 165 = 1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45 |
10 | 55 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 | 220 = 1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45 + 55 |
정답 : 220
class Exercise4_4 {
public static void main(String[] args) {
int sum = 0; // 총합을 저장할 변수
int s = 1; // 값의 부호를 바꿔주는데 사용할 변수
int num = 0;
for(int i=1;true; i++, s=-s) {
num = s * i;
sum += num;
if(sum >=100)
break;
}
System.out.println("num="+num);
System.out.println("sum="+sum);
}
다음 코드를 실행하면 199가 나온다.
public class Exercise4_5 {
public static void main(String[] args) {
for(int i=0; i<=10; i++) {
for(int j=0; j<=i; j++)
System.out.print("*");
System.out.println();
}
} // end of main
} // end of class
public class wook {
public static void main(String[] args) {
int i=0;
while(i<=10) {
int j=0;
while(j<=i) {
System.out.print("*");
j++;
}
System.out.println();
i++;
}
}
}
정답코드이다. 위 for문에서는 i는 0~10j는 0~ i의 숫자만큼 반복된다. 따라서 다음과 같이 i를 먼저 0으로 초기화해 준 뒤, while문으로 i <=10일 때 실행하도록 하고 j는 j <=i일 때 문장을 출력하도록 하면 예시의 for문과 같은 값이 나오게 된다.
class wook {
public static void main(String[] args) {
for(int i=1;i<=6;i++)
for(int j=1;j<=6;j++)
if(i+j==6)
System.out.println(i+"+"+j+"="+(i+j));
}
}
다음과 같이 코딩해 주면 된다. i, j는 1부터 6까지 반복될 것이고 중첩 for문에서 추가로 i+j가 6일 때만 출력되도록 코딩하였다.
class Exercise4_7 {
public static void main(String[] args) {
String str = "12345";
int sum = 0;
for(int i=0; i < str.length(); i++) {
(1)
}
System.out.println("sum="+sum);
}
}
정답은 sum += str.charAt(i) - '0';이다. 다음 문장을 풀이하면 sum = sum + (str.charAt(i) - '0') 이 된다. sum안에 str.charAt(i) - '0' 의값을 계속 넣는 것이다. str.CharAt(i)를 통해 문자열의 각 자리에 접근한다. 그 후 '0'을 빼주어 해당 문자를 정수로 변환하여 sum에 넣는다. '0'을 빼주는 이유는 문자열을 숫자로 바꾸기 위해서이다. 유니코드를 활용하였다.
class Exercise4_8 {
public static void main(String[] args) {
int value = (1)
System.out.println("value:"+value);
}
}
정답은 (int)(Math.random() *6) + 1이다. 이유는 Math.random() 메서드는 0 이상 1 미만의 난수를 반환하므로, 이를 6과 곱해서 0 이상 6 미만의 수를 얻는다. 그 후 소수점 아래를 버리기 위해 (int) 형으로 변환시켜 준후 +1을 더해서 1부터 6으로 맞춰주었다.
class Exercise4_9 {
public static void main(String[] args) {
int num = 12345;
int sum = 0;
(1)
System.out.println("sum="+sum);
}
}
while (num > 0){
sum += num%10;
num /= 10;
}
위 코드를 추가시켜 주면 된다. 먼저 num을 10으로 나눈 나머지를 구하면 해당숫자의 1의 자리를 얻을 수 있다. 이를 sum에 넣어주고 다시 num을 10으로 나눈 몫을 num에 저장하고 반복한다. 이렇게 하면 12345 / 1234 / 123 / 12 / 1 순으로 돌아가며 각 자리의 합을 구할 수 있다.
위 코드는 변수 num의 각 자리의 합을 구하는 문제를 해결합니다. 주어진 숫자를 10으로 나눈 나머지(num % 10)는 해당 숫자의 일의 자리 숫자를 얻을 수 있습니다. 이렇게 얻은 일의 자리 숫자를 sum에 더하고, num을 10으로 나눠서 다음 자리 숫자를 구할 수 있도록 합니다. 이 과정을 num이 0보다 큰 동안 반복합니다.
class Exercise4_10
{
public static void main(String[] args)
{
// 1~100 사이의 임의의 값을 얻어서 answer에 저장한다
int answer = (1)
int input = 0; // 사용자입력을 저장할 공간
int count = 0; // 시도횟수를 세기위한 변수
java.util.Scanner s = new java.util.Scanner(System.in);
do {
count++;
System.out.print("1 100 :"); 과 사이의 값을 입력하세요
input = s.nextInt(); // input . 입력받은 값을 변수 에 저장한다
(2)
} while(true);
}
}
(1)
(int)(Math.random() * 100) + 1;
(2)
if(answer > input){
System.out.println("범위보다 작은수가 입력되었습니다.");
} else if(answer < input){
System.out.println("범위보다 큰수가 입력되었습니다.");
} else {
Sysetm.out.println("정답입니다.");
Sysetm.out.println("시도횟수는 " + count + "번 입니다.");
break;
}
(1)에 들어갈 정답은 (int)(Math.random() * 100) + 1이다. 4-8문제에서도 설명한 내용인데 0~1 사이의 난수를 100을 곱해서 0~100 미만의 수를 갖도록 하고 +1을 해주어 1~100 사이의 임의값을 얻게 해 주었다.
(2)에 들어갈 정답은 위의 (2)와 같다. 먼저 사용자가 입력한 input이 answer보다 작으면 작다고 출력해 주고 크면 크다고 출력해 준다. 이 두 개의 조건에 만족하지 않을 시 "정답입니다"를 출력하고 시도 횟수를 출력해 주고 종료한다.
정리
프로젝트를 많이 해본 경험은 없지만 대체로 코딩을 할 때 가장 자주 사용하는 것 중 하나가 조건문, 반복문이라고 생각한다. if문과 for문 없이는 코드가 너무 복잡해질 것이다. 이 부분은 가장 잘 이해하고 넘어가야 할 부분인 것 같다. 난수 부분은 오늘 공부를 통해서 다시 한번 제대로 알게 되었다. 0~1의 double형 수를 반환해 준다고 알고 있었는데 마지막에 왜 +1을 해주는지는 잘 몰랐다. 알고 보니 0~1이 0은 포함하지만 1은 포함하지 않는다는 것을 알게 되었다. 이번 챕터를 공부하며 난수와 조건문에 대해 다양한 형식을 추가로 알게 되었다. 연습문제에서 시간을 많이 투자하게 되었다. 막히는 부분 없이 문제해결을 할 수 있어서 뿌듯했다.
'Back-End > JAVA' 카테고리의 다른 글
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 6 . 객체지향 프로그래밍 I (1) | 2023.06.02 |
---|---|
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 5 . 배열 (0) | 2023.06.02 |
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 3 . 연산자 (0) | 2023.05.31 |
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 2 . 변수 (0) | 2023.05.31 |
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 1 . 자바를 시작하기 전에 (0) | 2023.05.31 |
남건욱's 공부기록