🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성 내용을 기준으로 작성하며
부족할 수 있는 내용은 추가적인 검색을 통해 채워나갈 예정입니다.
기본적으로 코드의 실행은 위에서 아래로
한 문장씩 순차적으로 진행지만
때에 따라
내 입맛에 맞게끔
주어진 조건과 상황에 맞게끔
흐름을 바꿔야한다.
이 때, 이 흐름(flow)를 바꾸는 역할을 하는 문장/명령 '제어문 (Control Statement)'를 사용한다.
이번 시간에 공부해볼 조건문과 반복문이 바로 제어문에 해당한다.
말 그대로 코드 실행에 대해 조건을 추가하여
각 조건에 해당하는 각 코드 실행을 시키는 명령 기능을 가진 제어문이다.
if
문" 만약(if) 조건식이 참(true)이면 괄호({}) 안의 문장들을 수행해라 "
IF문이 가장 많이 쓰이며 기본적인 조건문인데
《조건식》과《괄호 {}》로 이루어져 있다.
if (조건식) {
// 조건식이 참일 경우 수행될 코드 작성
}
우선 조건식이 활용하며 참과 거짓여부에 따라 실행되다보니
비교 연산자와 논리 연산자가 일반적으로 구성된다.
(연산잔에 대한 내용은 이전 글 : 연산자을 참고!)
몇 가지 예시로 조건식에 대해 이해해보자
90 <= x && x <= 100 // 정수 x가 90이상 100이하일 때
x < 0 || x > 100 // 정수 x가 0보다 작거나 100보다 클 때
x % 3 == 0 && x % 2 != 0 // 정수 x가 3의 배수이지만 2의 배수는 아닐 때
ch == 'y' || ch == 'Y' // 문자 ch가 'y'이거나 'Y'일 때
ch == ' ' || ch == '\t' || ch == '\n' // 문자 ch가 공백이거나 탭이거나 개행 문자일 때
'A' <= ch && ch <= 'Z' // 문자 ch가 대문자일 때
'a' <= ch && ch <= 'z' // 문자 ch가 소문자일 때
'0' <= ch && ch <= '9' // 문자 ch가 숫자일 때
// 연산자 외 Boolean값 반환하는 함수 사용
String str = 'apple';
str.equals('Apple') // (대소문자 구분 O) 문자열 str 내용이 'Apple' 일 때
str.equalsIgnoreCase('Apple') // (대소문자 구분 X) 문자열 str 내용이 'Apple' 일 때
저번 연산자 글에서도 언급했다시피
비교연산자 중 참(true) 거짓(false)여부를 반환하는 등가비교 연산자 (==)와
선언이나 대입 시에 사용되는 대입 연산자 (=)의 오타 실수를 주의해야 한다.
{}
)앞서 설명했던 괄호, 자세히 말하면 중괄호이다.
이 괄호로 여러 문장을 하나의 단위로 묶을 수 있는데
이 묶인 것이 블럭이다.
'{'로 시작 & '}' 끝내는데
이 다음 끝에
기존 코드들과 다르게 ;를 붙이지 않는다는 것을 명심해야한다.
또한
탭(Tab)을 통한 들여쓰기로
내부에 묶어둔 문장들을 조금 더 가독성 좋게 해주는 것이 좋다.
(활용 방법은 정답이 없고 취향차이이다.)
// 조건식 옆에 바로 시작하는 방법
if x < 0 {
...
}
// 조건식과 각 괄호를 모두 개행하는 방법
if x < 0
{
...
}
그리고 하나 더 알아둘 것은
블럭 안에 한 문장 혹은 아무 문장이 없더라도 문제가 없으며
한 문장일 경우엔
블럭을 사용하지 않고 바로 실행 코드를 적어주어도 괜찮다.
(하지만 블럭 사용은 생활화하는 것이 바람직하다!!)
if ~else
문조건식에 대해 참과 그 밖의 다른 경우(else), 즉 거짓(false)이나 참 외의 상황일 때 실행할 코드들을 추가해주는 영역
사실 " 딱 하나의 특정한 조건에 대한 결과만 필요 "하다면 if문을 쓰는게 편하지만
그 밖의 다른 경우에도 실행해야 할 것이 있다면
다시 if로 반대 조건식을 구구절절 써야하는 상황이 발생한다.
이런 상황을 방지하기 위해
앞서 작성해 놓은 if (조건식) { ... }
외의 다른
나머지 혹은 반대 조건에 대한 공통적인 실행 코드들을 else {...}
로 묶어주는 것이다.
if (조건식) {
// 조건식이 참(true)일 때 수행될 문장들을 적는다.
} else {
// 조건식은 적을 필요가 없다.
// 조건식이 거짓(false)일 때 수행될 문장들을 적는다. : if 조건식 제외 나머지 경우
}
if ~else if ~ else
문직전에 설명한 if ~else
문의 경우는
두 가지 경우에만 적용할 수 있는 조건문이지만
만약 처리해야할 경우의 수가 2가지가 아닌
3가지 이상의 경우를 처리해야한다면 어떻게 해야할까?
if문만 여러 개 작성하게된다면 각 if문마다 이전 if문의 참/거짓 결과와 연결할 수가 없어서 조건식 작성할 때 어려움을 겪을 것이다..
이런 경우에 사용하는 것이 바로 if ~else if ~else
문이다.
if (조건식 1) {
// 조건식 1이 참일 때 수행될 문장들
} else if {
// 조건식 1이 거짓이며 조건식 2는 참일 때 수행될 문장들
} else if {
// 조건식 1과 2가 거짓이지만 조건식 3은 참일 때 수행될 문자들
} else {
// 위 모든 조건식에서 모두 참이 아닌 경우 수행될 문장들
}
해당 조건문도
나머지 경우에 대한 실행이 필요없다면
else 블럭은 생략이 가능하다.
if
문조건문뿐만 아니라 반복문도 마찬가지겠지만
횟수 제한 없이 중첩이 가능하다.
즉 한 블럭 내에 속해서
경우의 수에 따라 단계별로 맞춤형 결과를 반환할 수 있는 장점이 있다.
또한
각 경우에 따라 추가적인 별개 작업도 중간에 작성할 수 있기 때문에
상당히 유연하게 각 상황에 대한 실행 구조를 짤 수 있다는 장점도 있다.
if (조건식1) {
// 조건식 1이 참일 때 수행될 문장들
if (조건식 2) {
// 조건식 1이 참이며 조건식 2도 참일 때 수행될 문장들
} else if (조건식 3) {
// 조건식 1이 참이지만
// 조건식 2는 거짓이고 조건식 3은 참일 때 수행될 문장들
} else {
// 조건식 1이 참이지만
// 조건식 2와 3은 거짓일 때 수행될 문장들
}
} else {
// 조건식 1이 거짓(false)일 때 수행될 문장들을 적는다.
}
다른 언어인 Python의 경우,
필수적으로 탭(Tab)을 통해 들여쓰기해서 어떤 조건문에 소속되어 있는지 확인하기 용이하지만
Java와 같은 블럭으로 구분하는 경우에는
필수가 아니기 때문에
이 조건문이 어떤 블럭 안에 있는 것인지 알아보기 힘든 경우가 생길 수 있기 때문에
필수가 아니더라도 들여쓰기를 쓰는 것이 바람직하고
실행할 문장이 한 줄이더라도 괄호를 쓰는 것이 좋다.
switch
문( if문과 달리 ) 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고,
표현도 간결해서 알아보기 쉽다.
▶ 처리할 경우의 수가 많을 때 "적합" _ 단, 제약조건 ★주의★
switch (조건식) {
case 값1 :
// 조건식의 결과가 [값1]과 같을 경우 수행
break // switch문 벗어나기
case 값2 :
// 조건식의 결과가 [값2]와 같은 경우 수행
break
...
...
default :
//조건식 결과와 일치하는 case 없을 경우 수행될 문자
//...
}
《계산 순서》
① 1차적으로 switch
문의 조건식
②【결과와 일치하는 case문으로 이동】
③ 이동한 case문 내부 문장 수행
④【break문 / switch문 종류의 단계 도달】
⑤종료
위 순서 중 ②번 부분을 보면 switch문의 조건식 결과와 일치하는 case로 간다고 작성되어있는데
만약 일치하는 case가 없을 경우,
default문으로 이동한다.
또 중요한 것 한가지는
switch문에서 break문은 각 case의 영역을 구분하는 역할
따라서
각 case문 끝에 break문 (break;
)을 빼먹어서는 안된다.
switch
문을 쓰기 위해서 지켜져야할 제약조건이 있다.
《제약 조건》
- 조건식의 결과값은 무조건 정수/문자열이어야 한다.
- case문의 값 역시 상수 (정수/문자)/문자열만 사용하여야 한다. (변수나 실수 X)
- 중복되지 않아야 한다.
public static void main(String[] args) {
int num, result ; // 정수 "변수"
final int ONE ; // 정수 "상수"
....
switch(result) {
case '1' : // 문자 리터럴 가능
case ONE : // 정수 상수 가능
case "YES" : // 문자열 리터럴 가능
case num : // 변수 -> 에러
case 1.0 : // 실수형 -> 에러
...
}
}
여러 case가 동일한 출력값/실행 코드를 가지고 있다면
// 동일한 실행코드
// 수직 나열도 가능
case 1 :
case 2 :
case 3 :
...
break;
// 수평 나열도 가능
case 1 : case 2 : case 3 :
...
break;
위와 같은 형식들처럼 통합 지정할 수 있다.
Math.random()
: 임의의 "정수" 만들기필자가 Java시작 전
먼저 배웠던 Python은 물론이고, 난수만드는 모듈/라이브러리/함수 이름들은
아마 대부분의 언어들이 비슷할 것이다.
Java에서는 Math.random()
을 통해
난수를 추출한다.
이 메서드는
〔실수 0.0 과 실수 1.0 사이_ 1.0은 포함 안됨.〕 범위에 속하는
하나의 double값을 반환한다.
범위가 위와 같기 때문에
원하는 범위 내의 정수를 뽑고 싶을 경우 Math.random()
에 대해 추가적인 산술연산이 필요하다.
// 1과 3사이의 난수를 원하는 경우
int num = 0;
num = (int)(Math.random() * 3) + 1
// 1. 0.0과 1.0 이라는 범위에 *3 연산으로 0.0과 3.0사이가 되었다.
// 2. 정수형으로 바꿔 0 이상 3미만으로 범위를 맞춘다. (but 3미만이면 2까지 밖에 안나옴)
// 3. +1 연산으로 0 -> 1 / 3 -> 4 : 최댓값 범위는 .9단위이기 때문에 3.9까지로 범위를 맞춘다.
위와 같이 적절한 곱과 합으로 범위를 맞추어 사용한다.