제어문 = ' 프로그램의 처리 순서를 바꾸는 것'
선택 제어문 : if, switch
반복 제어문 : for, while, do-while
중괄호를 생략했을 때 제어문의 동작
if 문을 포함한 모든 제어문은 중괄호를 포함하며 생략했을 때에는 컴파일러가 자동으로 삽입
주의해야 할 점 : 컴파일러가 삽입하는 중괄호는 반드시 하나의 실행 구문만을 감싼다는 것
# if 단일 구문 : 조건식 1개, 중괄호 1개
if (조건식) { // boolean 타입 (true, false)만 가능
실행 구문; // 조건식이 true일 때만 실행
}
# if-else 구문 : 조건식 1개, 중괄호 2개
if (조건식) {
실행 구문;
}
else {
실행 구문; // 조건식이 false일 때만 실행 (생략 가능)
}
# if-else if-else 구문 : 조건식 N개, 중괄호 N+1개
if (조건식 1) {
실행 구문; // 조건식 1이 true일 때 실행한 후 제어문 탈출
}
else if (조건식 2) {
실행 구문; // 조건식 2가 true일 때 실행한 후 제어문 탈출
}
.
.
else if (조건식 N) {
실행 구문; // 조건식 N이 true일 때 실행한 후 제어문 탈출
}
else {
실행 구문; // 모든 조건식이 false일 때만 실행
}
switch (점프 위치 변수) { // 점프 위치 변수 : 정수, 문자, 문자열 사용 가능
case 위칫값 1:
실행 구문;
case 위칫값 2:
실행 구문;
.
.
case 위칫값 n:
실행 구문;
default: // 일치하는 위칫값이 없을 때 이 위치로 이동 (생략 가능)
실행 구문;
}
for (초기식; 조건식; 증감식) {
실행 구문; // 조건식이 true인 동안 실행
}
# STEP 1 : 초기식 > 조건식 (참) > 실행 구문
# STEP 2 : 중괄호 닫힘 > 증감식 > 조건식 (참) > 실행 구문
.
.
# STEP 3 : 중괄호 닫힘 > 증감식 > 조건식 (거짓) > 종료
- 초기식 : for문이 시작될 때 딱 한 번 실행되고 다시는 실행되지 않음
따라서 for문 안에서만 사용할 변수는 주로 초기식에서 초기화
* 초기식에 포함된 변수의 선언 위치
for문의 내외부에서 선언 가능, 먼저 외부에서 변수를 선언하고 초기식에서 초기화만 했을 때 for문이 종료된 이후에도 변수는 사라지지 않음
- 조건식 : 실행 구문으로 들어가기 위한 유일한 출입구 , 이 조건식의 결과가 true 가 나오는 동안은 실행 구문을 계속 반복함
민일 조건식이 false가 나오면 더 이상 반복을 수행하지 않고 for문을 빠져나감
* 조건식 생략 시 컴파일러는 자동으로 true 입력 > 무한루프
- 증감식 : for문의 실행 구문이 모두 수행된 후 닫힌 중괄호를 만나면 다음 번 반복을 위해 다시 이동하는 위치로 매회 반복이 수행할 때마다 호출됨
초기식; // 필수는 아니지만 대부분 사용
* 중괄호 안에 넣을 경우, 매 반복마다 초기돼 원하지 않는 무한루프에 빠질 수 있음
while (조건식) { // 조건식 : while문으로 들어가는 유일한 입구 (생략 불가능)
실행 구문;
증감식;
}
# STEP 1 : 조건식 (참) > 실행 구문
# STEP 2 : 중괄호 닫힘 > 조건식 (참) > 실행 구문
.
.
# STEP 3 : 중괄호 닫힘 > 조건식 (거짓) > 종료
# for문과 while 문의 상호 변환
for (초기식; 조건식; 증감식) {
살행 구문;
}
초기식;
while (조건식) {
실행 구문;
증감식;
}
초기식;
do {
실행 구문; // 최초 1회는 무조건 실행
증감식;
} while (조건식); // 문법 구조상 중괄호 존재 X > 세미콜론으로 끝남
# STEP 1 : 실행 구문
# STEP 2 : 조건식 (참) > 실행 구문
# STEP 3 : 조건식 (거짓) > 종료
if 문을 제외한 가장 가까운 중괄호를 탈출하는 제어 키워드
# 반복문 안에 if문과 함께 break가 사용된 예
for (int i = 0; i < 10; i++) {
if (i == 5) {
break;
}
System.out.println(i); // i = 0, 1, 2, 3, 4 일 때 출력
} // break 로 틸출하는 중괄호
# 레이블을 이용해 이중 for문 한 번에 탈출하는 예
out: // 레이블 위치 지정 (break 라고자 하는 반복문 앞에 레이블 표기)
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j ++) {
if (j == 3)
break out; // out 레이블이 달린 반복문 탈출
System.out.println(i + "," + j);
}
} // break out으로 탈출하는 중괄호
반복 제어문의 닫힌 중괄호 역할을 하는 제어 키워드
반복 과정에서 특정 구문을 실행하지 않고 건너뛰고자 할 때 사용
# 반복문 안에 if문과 함께 continue가 사용된 예
for (int i = 0; i < 10; i++) {
if (i == 5) { // if문으로 continue를 실행할 조건 설정
continue;
}
System.out.println(i); // 0, 1, 2, 3, 4, 6, 7, 8, 9
} // continue가 대체하는 중괄호
배열
동일한 자료형을 묶어 저장하는 참조 자료형
생성할 때 크기를 지정해야 하고, 한 번 크기를 지정하면 절대 변경할 수 없는 특징 지님
배열의 길이
배열 참조 변수.length
# 반복문을 이용한 1차원 배열의 값 출력
int[] a = new int[200];
a[0] = 1, a[1] = 2, .., a[99] = 100;
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
# for-each문
for (원소 자료형 변수명; 집합 객체) {
}
int[] a = new int[200];
a[0] = 1, a[1] = 2, .., a[99] = 100;
for (int k: a) {
System.out.println(k);
}
# 1차원 배열의 모든 원소 값 출력
System.out.println(Arrays.toString(1차원 배열 참조 변수))
int a = 0;
int[] b = null;
# 참조 자료형 변수는 실제 데이터의 위치를 저장하므로 초깃값으로 실제 데이터값이 아닌 '가리키고 있는 위치가 없음' 을 나타내는 null 사용
# 힙 메모리에서의 강제 초깃값
- 기본
boolean > false
byte, short/char, int, long > 0
float, double > 0.0
- 참조
클래스, 배열 > null
STEP 1 배열 선언
자료형[] 변수명 ex) int[] a;
자료형 변수명[] ex) int a[];
* 스택 메모리에 변수의 공간만 생성하고 공간 안은 비운 채로 둔 것
STEP 2 힙 메모리에 배열의 객체 생성
new 자료형[배열의 길이] ex) new int[3];
STEP 3 배열 자료형 변수에 객체 대입
# 한 번에 작성하기
자료형[] 변수명 = new 자료형[배열의 길이];
ex) int[] a = new int[3];
# 구분해 작성하기
자료형[] 변수명;
변수명 = new 자료형 [배열의 길이];
ex) int[] a;
a = new int[3];
- int[] : int 배열 자료형
- a : 참조 변수
- new : 힙 메모리에 넣을 것 표기
- int[3] : int 자료형 3개를 저장할 수 있는 공간
* 객체의 위치를 참조 변수에 저장하는 이유
new 키워드를 이용해 객체를 생성하면 JVM은 힙 메모리 내에 비어 있는 공간에 객체 생성
힙 메모리에 비어 있는 공간은 매번 다를 것이므로 객체가 생성될 때마다 다른 위치에 저장될 수 있음
> JVM이 생성한 객채의 위치를 반드시 알아야 개발자가 해당 객체 사용 가능
STEP 4 객체에 값 대입
# 배열 객체 값 대입
참조 변수명[인덱스] = 값;
ex) int[] a = new int[3];
# 배열 객체 값 읽어오기
참조 변수명[인덱스];
ex) System.out.println(a[0]);
자료형[] 참조 변수명 = new 자료형[배열의 길이];
참조 변수명[0] = 값;
.
.
참조 변수명[배열의 길이-1] = 값;
자료형[] 참조 변수명 = new 자료형[]{값, 값 , . . , 값};
# 배열의 길이 지정 X > 배열의 길이는 값의 개수로 결정
# 선언과 객체 대입 분리 가능
int[] a = new int[]{3,4,5}; // (O)
int[] a;
a = new int[]{3,4,5}; // (O)
자료형[] 참조 변수명 = {값, 값, . . , 값};
# 선언과 객체 대입 불가능
int a[] {3,4,5}; // (O)
int[] a;
a = {3,4,5}; // (X)
- 자료형[][] 변수명
- 자료형 변수명[][]
- 자료형[] 변수명[]
자료형[][] 참조 변수명 = new 자료형[행의 길이][열의 길이];
참조 변수명[0][0] = 값;
.
.
참조 변수명[행의 길이 -1][열의 길이 -1] = 깂;
자료형[][] 참조 변수명 = new 자료형[행의 길이][]; // 열의 길이는 표시하지 않음
참조 변수명[0] = 1차원 배열의 생성;
참조 변수명[1] = 1차원 배열의 생성;
.
.
참조 변수명[행의 길이 -1] = 1차원 배열의 생성;
자료형[][] 참조 변수명 = new 자료형[][]{{값,값,. . , 값},. ., {값,값,. . ,값}};
자료형[][] 참조 변수명 = {{값,값,. . , 값},. ., {값,값,. . ,값}};
* 선언과 객체 대입 불가능
각 행마다 열의 길이가 다른 2차원 배열
2차원 비정방 행렬 배열 생성
자료형[][] 참조 변수명 = new 자료형[행의 길이][]; // 열의 길이는 표시하지 않음
참조 변수명[0] = 1차원 배열의 생성;
참조 변수명[1] = 1차원 배열의 생성;
.
.
참조 변수명[행의 길이 -1] = 1차원 배열의 생성;
자료형[][] 참조 변수명 = new 자료형[][]{{값,값,. . ,값}, . . ,{값,값,. . ,값}};
// 배열의 길이는 신경쓰지 않음
자료형[][] 참조 변수명 = {{값,값,. . ,값},. . ,{값,값,. . ,값}};
* 선언과 객체 대입 불가능
2차원 비정방 행렬 배열 출력
int[][] a = {{1,2},{3,4,5}};
for(int i = 0; i < a.length; i++) {
for(int j = 0; j < a[i].length; j++) {
System.out.println(a[i][j]);
}
}
int[][] a = {{1,2},{3,4,5}};
for(int[] m: a) {
for (int n: m) {
System.out.println(n);
}
}
public static void main(String[] ar) {
}
// 여러 개의 String 객체를 묶어 저장하는 문자열 배열
# 타입 변환 메서드
- 문자열 > 정수 : Integer.parseInt (문자열)
- 문자열 > 실수 : Double.parseDouble (문자열)
- 정수 > 문자열 : String.valueOf (정수)
- 실수 > 문자열 : String.valueOf (실수)
String a = "문자열"
* 반드시 큰따옴표 안에 표기할 것
- String 참조 변수명 = new String("문자열")
- String 참조 변수명 = "문자열"
String str1 = new String("안녕");
* 스택 영역에 str1 생긴 것
String str2 = str1;
* 참조 자료형의 값을 복사하면 스택 메모리의 값이 복사
str1 = "안녕하세요";
* "안녕하세요" 라는 문자열을 포함하고 있는 새로운 String 객체 생성 > 이 위치를 str1 공간에 저장
System.out.println(str1);
System.out.println(str2);
* String 클래스의 특징과 배열의 특징 비교
String 클래스 : 값 변경 시 새로운 객체 생성
배열 : 객체의 값 자체가 수정 > 참조 변수 복사 이후 하나의 변수에서 수정하면 나머지 변수에도 적용
String str1 = new String("안녕");
String str2 = "안녕";
String str3 = "안녕";
String str4 = new String("안녕");
* 문자열 리터럴로 생성할 때
힙 메모리에 리터럴로 생성된 동일 문자열을 포함하고 있는 개체가 있으면 그 객체를 공유
String str = "안녕" + "하세요" + "!";
"안녕하세요"
"안녕하세요!"
"안녕"/"하세요"/"!"/"안녕하세요"/"안녕하세요!"
위와 같이 객체가 5개 생성
기본 자료형 > 문자열 change
System.out.println(1+"안녕"); // 1안녕
- length() : 문자열의 길이 return
- charAt() : 문자열에서 특정 인덱스에 위치해 있는 문자을 알아냄
- indexOf() : 문자열에서 특정 문자나 특정 문자열을 앞에서부터 찾아 위칫값 알아냄
- lastIndexOf() : 문자열에서 특정 문자나 특정 문자열을 뒤에서부터 찾아 위칫값을 알아냄
- String.valueOf() : 기본 자료형을 문자열로 바꾸는 정적 메서드
- concat() : 2개의 문자열 연결 , 연산자와 동일한 기능 수행
- getBytes(): 문자열을 byte 배열로 반환, 자바 입출력 과정에서 주로 사용
- toCharArray() : 문자열을 char 배열로 변환, 자바 입출력 과정에서 주로 사용
- toLowerCase() : 영문 문자를 모두 소문자로 변환
- toUpperCase() : 영문 문자를 모두 대문자로 변환
- replace() : 일부 문자열을 다른 문자열로 대체
- substring() : 문자열의 일부만을 포함하는 새로운 문자열 객체 생성
- split() : 특정 기호를 기준으로 문자열 분리
- trim() : 문자열의 좌우 공백 제거
- equals() : 두 문자열의 위칫값이 아닌 실제 데이터값 비교, 이 때 대소문자 구분
- equalsIgnoreCase() : 두 문자열의 위칫값이 아닌 실제 데이터값을 비교하나 대소문자 구분 X
Java에서 제어문과 배열은 유용하게 쓰이므로 개념부터 꼼꼼하게 익혀두는 것이 좋음