[Java] 01. 기본 문법 및 응용(반복문, 배열)
1. 반복문
for문
- for(변수 초기화; 반복 조건; 증감식){실행문}
- 실행 순서 : 1.변수 초기화 -> 2. 반복 조건 체크 -> 3. (반복 조건 true) 실행문 (break 있으면 바로 종료) -> 4. 증감식
//1부터 10까지 더하기 (for문)
int sum = 0;
for(int i=0; i<=10; i++){
sum+=i;
}
// 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
//주사위를 100번 던진 결과의 합과 평균값 출력 (for문)
int sum = 0;
int cnt = 100;
double avg = 0;
Random rand = new Random();
for(int i=0; i<cnt; i++){
sum += rand.nextInt(6) + 1;
}
avg = 1.0*sum/cnt; //sum이 int형이므로 1.0을 곱해서 실수로 형 변환
System.out.printf("sum: %d, avg: %f%n", sum, avg); //%d : 정수, %f : 실수, %n : 개행문자
while문
- while(반복조건){실행문, 증감식}
- 실행 순서 : 1. 반복 조건 체크 -> 2. 실행문 -> 3. 증감식 (break 있으면 바로 종료) -> 4. 1번부터 다시 반복
//1부터 10까지 더하기 (while문)
int sum = 0;
int i = 0;
while(i<=10){
sum+=i;
i++;
}
//0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
//주사위를 100번 던진 결과의 합과 평균값 출력 (while문)
int sum = 0;
int cnt = 100;
double avg = 0;
int i = 0;
Random rand = new Random();
while(i<cnt){
sum+= rand.nextInt(6) + 1;
i++;
}
avg = 1.0*sum/cnt; //sum이 int형이므로 1.0을 곱해서 실수로 형 변환
System.out.printf("sum: %d, avg: %f%n", sum, avg); //%d : 정수, %f : 실수, %n : 개행문자
for vs while
- for
- 초기값, 조건식, 증감식의 위치가 명확
- 반복 회수 예측이 가능한 반복
- index의 증감 활용- while
- 예측 가변적인 반복
- index보다는 break, continue 활용
///break, continue 활용 //출력
for(int i=1; i<10; i++){ 1 2 c 4 b
for(int j=1; j<10; j++){ 2 4 o 8 r
if(j==5) break; 3 6 n 12 e
if(j==3) continue; 4 8 t 16 a
System.out.print(i*j +"\t"); 5 10 i 20 k
} 6 12 n 24
System.out.println(); 7 14 u 28
} 8 16 e 32
9 18 36
//outer 활용
outer: for(int i=1; i<10; i++){ //출력
for(int j=1; j<10; j++){ 1 2 2 4 3 6 4 8 5 10 6 12 7 14 8 16 9 18
if(j==5) break outer;
if(j==3) continue outer;
System.out.print(i*j +"\t");
}
System.out.println();
}
- #찍기
for(int i=0; i<5; i++){ for(int i=5; i>0; i--){ for(int i=0; i<5; i++){
for(int j=0; j<=i j++){ for(int j=0; j<i; j++){ for(int j=0; j<i; j++){
System.out.print("#"); System.out.print("#"); System.out.print(" ");
}System.out.println(); }System.out.println(); }
} } for(int j=9-2*i; j>0; j--){
System.out.print("#");
}
System.out.println();
}
//출력 //출력 //출력
# ##### #########
## #### #######
### ### #####
#### ## ###
##### # #
2. 배열
- 배열(Array) 사용 이유
- 동일한 타입의 변수를 여러개 사용하면?
- 변수의 수 증가
- 코드의 길이 증가
- 반복문 적용 불가
- 변수의 수가 동적으로 결정될 경우, 사용 불가
- 배열(Array)로 동일 타입 변수 묶어서 사용하기
- 배열이란?
- 동일한 타입의 데이터 0개 이상을 하나의 연속된 메모리 공간에서 관리하는 것
- 요소에 접근하는 속도가 매우 빠르다.
- 한번 생성하면 크기 변경 불가
- 배열(Array) 만들기 #1
- 타입 [] 변수명;
- 타입 변수명[];
- int[] points;
- String[] names;
- 변수의 타입과 저장하는 데이터의 타입?
- int a => a의 타입? int
- int [] arr => arr의 타입? int의 배열타입 (Reference형), arr이 저장하는 데이터 타입? int
- 배열의 생성과 초기화
- 생성
- new keyword와 함께 배열의 데이터 타입 및 크기 지정 : new data_type[length]
- new int[3]; => int 타입의 자료 3개를 저장할수 있는 배열을 메모리에 생성
- points = new int[3]; 생성된 배열을 points라는 변수에 할당
- points는 메모리에 있는 배열을 가리키는 reference 타입 변수
- 초기화
- 배열을 생성과 동시에 자료형에 대한 default 초기화 진행
자료형 기본값 비고 boolean false char ‘\u0000’ 곰백문자 byte, short, int 0 long 0L float 0.0f double 0.0 참조형 변수 null 아무것도 참조하지 않음
배열의 사용
-배열은 index번호를 가지고 각 요소에 접근 가능
- index 번호는 0부터 시작
- 배열의 길이 : 배열이름.length로 배열의 크기 조회 가능
int [] points = new int[3];
System.out.printf("배열의 크기: %d%n", points.length); => 3
points[0] = 1;
points[1] = 'A'; //묵시적 형 변환
//points[2] = 1.5; //double 할당 불가 (배열이 int형이므로)
System.out.printf("0 번째 요소: %d%n", points[0]); // 1
System.out.printf("1 번째 요소: %d%n", points[1]); // 65
System.out.printf("2 번째 요소: %d%n", points[2]); // 0
char[]을 이용해 String “KKH”의 각 문자를 저장하고 출력하는 코드
String str = "KKH";
char[] ch = new char[str.length()]; //배열의 길이는 str의 길이
for(int i=0; i<ch.length; i++){
ch[i] = str.charAt(i); //문자열에서 문자를 하나씩 가져오기
}
for(int i=0; i<ch.length; i++){
System.out.print(ch[i]);
}
String “1234567890” 의 자리 별 수를 1차원 배열에 저장하고 배열을 순회해서 합 구하기
String str = "1234567890";
char[] nums = str.toCharArray(); //char 배열로 만들어줌
int sum = 0;
for(int i=0; i<nums.length; i++){
sum += num[i]-'0'
}
System.out.printf("sum: %d%n", sum);
- 배열(Array) 만들기 #2
- 생성과 동시에 할당
- int [] b = {1,3,5,6,8};
- int [] c = new int[] {1,3,5,6,8};
- 선언 후 생성 시 초기화 주의
- int [] points;
points = {1,3,5,6,8}; // 컴파일 오류- int [] points;
points = new int[]{1,3,5,6,8}; // 선언할 때는 배열의 크기를 알 수 없을 때
for-each문
- 가독성이 개선된 반복문으로, 배열 및 Collections에서 사용
- index 대신 직접 요소(elements)에 접근하는 변수를 제공
- naturally ready only(copied value)
- : 사용
- index를 사용하지 않아서 간편해졌지만 index를 사용 할 경우에는 사용 불가
int intArray[] = {1,3,5,7}; for(int i=0; i<intArray.length; i++){}
for(int x : intArray){ int x = intArray[i];
System.out.println(x); = System.out.println(x);
} }
//순서 바꾸기 (swap)
int intArray[] = {1,3,5,7};
int temp = intArray[1];
intArray[1] = intArray[2];
intArray[2] = temp;
for(int x : intArray){
System.out.println(x);
}
Array is Immutable
- 최초 메모리 할당 이후, 변경할 수 없음
- 개별 요소는 다른 값으로 변경이 가능하나, 삭제할 수는 없음.
- 크기를 늘리거나 줄일 수 없음
배열 요소의 각 숫자가 몇번 사용 되었는지 숫자별로 사용 횟수 출력
int arr[] = {3,7,2,5,7,7,9,2,8,1,1,5,3};
int used[] = new int[10];
for(int num:arr){
used[num]++; //배열 숫자가 used 배열의 index로 활용
}
System.out.println(Arrays.toString(used)); //배열 값 출력
- 2차원 배열(Array) 만들기 #1
- int Type 기준으로 4*3 배열 만들기
선언 | 생성 | 할당 |
---|---|---|
int [][] arr | arr = new int[4][3]; | arr[0][2] = 3; |
int arr[][] | ||
int []arr[] |
- 2차원 배열 만들기 #2
- int Type 기준으로 4*3 배열과 값을 동시에 만들기
- {}안에 , 와 {}을 이용해서 선언과 동시에 값을 할당
선언 생성 할당 동시에 |
---|
int [][] arr = {{0,1,2},{0,1,2},{0,1,2},{0,1,2}} |
- 2차원 배열 만들기 #3
- int Type 기준으로 4*? 배열 만들기
- 1차 배열만 생성 후, 필요에 따라 2차 배열을 생성함
1,2차 선언 / 1차 생성 |
---|
int [][] arr = new int[4][] |
2차 생성 |
---|
arr[1] = new int[2]; |
arr[0] = new int[4]; |
arr[2] = {1,2,3}; X |
etc. ★배열 탐색★
X로 표시된 항목의 상하좌우 숫자의 합을 구하는 코드
2 | 3 | 1 | 4 |
1 | X | 3 | 2 |
3 | 4 | X | X |
X | 4 | 1 | 5 |
int deltas[][] = { {-1,0},{1,0},{0,-1},{0,1}}
int sum = 0;
for(int r = 0; r<4; r++)
for(int c=0; c<4; c++)
if(arr[r][c] == 'X'){
for(int d=0; d<4; d++){
int nr = r + deltas[d][0];
int nc = c + deltas[d][1];
if(nr>=0 && nr<4 && nc>=0 && nc<4 && arr[nr][nc] != 'X'){
sum += arr[nr][nc] - '0';
arr[nr][nc] = '0';
}
}
}
System.out.println(sum);
댓글남기기