1.배열
1.2 배열의 정의
:같은 종류를 담을 수 있는 '통'. 하나의 변수에 같은 자료형을 담을 수 있는 큰 방. 순서를 가지고 있다.
ex.교실. x반의 학생만이 x반 학생만 교실에 포함될 수 있고, 학생들은 이름에 따라 번호를 가지고 있다.
1.3 배열의 필요성
배열은 하나의 값이 아니라 많은 값을 필요로하는 작업을 수행하기 위해 사용한다. 왜 데이터를 한꺼번에 모을까?? 하드디스크가 연속되게 값을 처리하는 작업을 수행하는 성격 때문이다. 이런 하드디스크의 문제를 해결하기 위해 데이터를 램에 담고 데이터 순서를 변경한다. 이런 일련의 작업을 수행하기 위해선 데이터를 담는 방 즉 배열이 필요하다. 배열은 큰 방을 마련하고 반복문(for문)과의 결합을 통해 코드 반복을 수행한다.
1.4 배열의 변수명
:kor[1]과 int kor은 동일한 공간을 가질까? 정답은 '그렇다'이다. int[] kors = new int[5]일 경우 데이터가 저장되는 배열 하나당 차지하는 공간의 크기는 4byte인데 int 변수도 4byte의 크기를 갖는다. 그래서 kor[1]와 int kor의 공간은 4byte로 같다.
1.5 배열연산
배열은 자바에서 동적으로 메모리를 할당한다. 즉, 실행중에 특정연산을 통해 메모리 공간을 확보한다. 그래서 new를 사용하여 배열을 생성한다.
int kor과 배열에 담긴 kor[1] 둘의 크기는 4byte로 같다. 변수의 이름만 다를 뿐이다. 이 점을 잊지말자.
배열은 변수를 유연성있게 쓸 수 있는 장점이 있다. kor[n]의 예시를 보듯 유연하게 변수를 지정할 수 있다.
배열을 초기화 하는 방법은 여러개다. jdk 버전에 따라 골라쓴다. 아래로 내려갈수록 상위버전.
2.배열 연습문제
문제1) 파일에서 값 90을 찾아서 그 값을 1번째 위치 값과 바꾸어 저장하시오.
절차를 잘 생각하자!
값 로드하기 -> 위치찾기 -> 값 바꾸기 -> 값 저장하기
* 배열에서 두 위치의 값 바꾸기
자주쓰이는 방법론이다. 외우자. 코딩에는 이렇게 자주 쓰이는 문법, 방법론이 있다. 처음에는 어색하지만 익숙하도록 숙달해야한다.
package ex06.array.basic;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Scanner;
public class Program {
public static void main(String[] args) throws IOException {
int[] nums = new int[100]; // nums의 출력값 변화를 살펴보자. 그러면 전역변수와 지역변수의 알 수 있다.
int idx = -1; // 우리가 원하는 숫자의 위치를 찾기 위한 변수. 왜 전역변수로 선언됐는지 생각하자.
int size=0; // 몇번 출력됐는지 확인하기 위해 변수 size를 선언한다. 공유되는 변수. 왜 공유되는지 생각하자.
// 1.값 로드하기
{
FileInputStream fis = new FileInputStream("res/array/data.txt"); // 파일을 읽어온다.
Scanner fscan = new Scanner(fis); // 파일에 적힌 데이터를 읽어온다.
for(int i=0; fscan.hasNext(); i++) { //배열의 0번째부터 배열에 데이터가 존재하는 위치까지 데이터를 불러온다.
// String num= sc.next(); //문자열을 불러온다.
// nums[i] = Integer.parseInt(num); // 문자열을 정수로 바꾼다.
int num = fscan.nextInt();
nums[i] = num;
size++; // 반복문을 돌 때 마다 size를 하나씩 증가시켜 숫자가 몇번 찍혔는지 알 수 있다.
}
fscan.close();
fis.close();
}
// nums 출력하기
{
for(int i=0; i<size; i++)
System.out.printf("%d,", nums[i]);
System.out.println();
}
// 2.위치 찾기
{
for(int i=0; i<size; i++) {
idx++;
int search = nums[i];
if(search==90) {
System.out.println("숫자 90은"+" "+idx+"번째 자리에 있지롱!");
break; // break문 까먹지 말자. 이거 까먹으면 출력문만 찍고 계속 반복문 돈다.
}
}
//break문 사용
// for(int i=0; i<size; i++) {
// if(nums[i]==90) {
// idx = i;
// break;
// }
// }
}
// 3.숫자 90과 0번째 위치에 있는 숫자 값 바꾸기
{
int tmp; // 빈 공간 하나를 만든다.
tmp = nums[0]; // 0번째에 있는 숫자를 빈 공간에 넣는다.
nums[0] = nums[idx]; // 90숫자를 0번째에 넣는다.
nums[idx] = tmp; //빈공간에 있는 숫자를 숫자 90이 있던 자리에 넣는다.
System.out.println(nums[0]+" "+nums[idx]);
}
// 4.저장하기
{
FileOutputStream fos = new FileOutputStream("res/array/dataPrint.txt");
PrintWriter fout2 = new PrintWriter(fos, true, Charset.forName("UTF-8"));
for(int i=0; i<size; i++) { //반복의 제한을 어떻게 설정할건가?
fout2.printf("%d,",nums[i]);
}
fos.close();
}
}
}
'뉴렉처 > 자바' 카테고리의 다른 글
[뉴렉처/자바] ★객체지향(객체와개체/개체의 속성/static메소드와 인스턴스 메소드)/ 생성자)2023.07.04 (0) | 2023.07.04 |
---|---|
[뉴렉처/자바] ★배열 2023.06.22 (0) | 2023.06.22 |
[뉴렉처/자바] ★반복문과 제어문 2023.06.20 (0) | 2023.06.20 |
[뉴렉처/자바]★반복문과 제어문 2023.06.19 (1) | 2023.06.19 |
[뉴렉처/자바] ★반복문과 제어문 2023.06.16 (0) | 2023.06.16 |