배열
변수: 하나의 값을 저장하기 위한 메모리 공간
배열: 서로 관련이 있고 데이터 타입이 같은 데이터의 집합
JVM메모리구조
- stack & heap
new 해서 생성하면 heap영역에 생성됨.
그냥 변수에 값 넣으면 스택메모리 저장
배열형식
배열생성 - 메모리 생성(확보)
- new 키워드를 이용해서 배열을 생성
- 참조 데이터 타입을 가지고 메모리를 확보할 때 new라는 키워드를 사용
- 각 요소(element)마다 인덱스가 0부터 주어짐.
초기값을 할당하면서 배열을 생성
이렇게 할 때는 배열의 크기를 지정할 수 없다.
배열과 반복문
데이터 유형별 초기값
2차원배열
행열 바꿔서 출력해보기
헷갈림
연습문제
//[데이터]
//홍길동 90 85 40
//이영희 100 35 75
//
//[출력결과]
//홍길동 90 85 40 215 71.7
//이영희 100 35 75 210 70.0
public class Java045_array {
public static void main(String[] args) {
String[] name = { "홍길동", "이영희" };
int[][] jumsu = { { 90, 85, 40 }, { 100, 35, 75 } };
// 점수합계,평균
int hap = 0;
for (int row = 0; row < 2; row++) {
hap = 0;
System.out.printf("%s", name[row]);
for (int col = 0; col < 3; col++) {
System.out.printf("%4d", jumsu[row][col]);
hap += jumsu[row][col];
}
System.out.printf("%4d", hap);
System.out.printf("%5.1f", hap/3.0);
System.out.println();
}
}
}
복잡하구마잉 꼭 복습하자
2.
package java0328_array;
//1 2 3 4 5
//6 7 8 9 10
//11 12 13 14 15
//16 17 18 19 20
//[출력결과]
// 1 2 3 4 5
// 10 9 8 7 6
// 11 12 13 14 15
// 20 19 18 17 16
public class Java048_array {
public static void main(String[] args) {
int[][] num = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, { 16, 17, 18, 19, 20 } };
for (int i = 0; i < num.length; i++) {
if (i % 2 == 1) {
for (int j = num.length; j >= 0; j--)
System.out.printf("%4d", num[i][j]);
} else {
for (int j = 0; num[i].length > j; j++)
System.out.printf("%4d", num[i][j]);
}
System.out.println();
}
}
}
답:
더 간단한 방법.
num의 요소 안의 요소를 불러내는 번호만 바꾸기.
4.
//* a b c d
//a * b c d
//a b * c d
//a b c * d
//a b c d *
public class Java049_array {
public static void main(String[] args) {
char[][] alpa = new char[][] { { 'a', 'b', 'c', 'd' }, { 'a', 'b', 'c', 'd' }, { 'a', 'b', 'c', 'd' },
{ 'a', 'b', 'c', 'd' } };
for (int i = 0; i < alpa.length; i++) {
for (int j = 0; j < alpa[i].length; j++) {
if(i==j) {
System.out.printf("%4c",'*');
}
System.out.printf("%4c", alpa[i][j]);
}
System.out.println();
if(i==alpa.length-1) {
for(int k=0; k <alpa[i].length; k++) {
System.out.printf("%4c", alpa[i][k]);
}
System.out.printf("%4c",'*');
}
}
} // main
}// class
반복문에서 2번째 거 조건에 j라고 안 하고 실수로 i라고 해놓고 발견 못해서 몇십 분 날림.
러버덕한테 설명하다가 찾음ㅋㅋㅋㅋㅋㅋㅋ 러버덕 진짜 도움되네
자료구조
배열
연결리스트
가변배열(2차원 배열부터 사용 가능)
:가변배열을 생성할 때는 제일 마지막의 배열 크기는 지정하지 않다.
가변 배열을 제공하는 이유는 메모리 손실을 최소화하기 위해서 임.
가변배열에서 array.length의 진면모(?)를 볼 수 있다.
숙제
다른 건 다 풀었는데
이 문제
어렵네
/*
* 4행 4열 data배열에 가로 세로 합계를 구하는 프로그램을 구현하시오.
* [출력결과]
* 1 2 3 6
* 4 5 6 15
* 7 8 9 24
* 12 15 18 45
*/
public class Prob_02 {
public static void main(String[] args) {
int[][] data = new int[4][4];
int cnt = 1;
// 여기를 구현하시오.
int hap = 0;
int hap2 = 0;
for (int i = 0; i < data.length; i++) {
hap = 0;
hap2 = 0;
for (int j = 0; j < data[i].length; j++) {
if (i != 3 && j != 3) {
data[i][j] = cnt;
hap += cnt;
cnt++;
} else if (j == 3) {
data[i][j] = hap;
} else if (i == 3) {
hap2 += cnt;
data[i][j] = hap2;
}
System.out.printf("%4d", data[i][j]);
}
System.out.println();
}
}// end main()
}// end class
풀다가 밥 먹으러 감.
답
package java0328_array.prob;
/*
* 4행 4열 data배열에 가로 세로 합계를 구하는 프로그램을 구현하시오.
* [출력결과]
* 1 2 3 6
* 4 5 6 15
* 7 8 9 24
* 12 15 18 45
*/
public class Prob_02 {
public static void main(String[] args) {
int[][] data = new int[4][4];
int cnt = 1;
// 여기를 구현하시오.
//3x3값 넣어주기
for(int i = 0;i < 3;i++) {
for(int j = 0;j<3;j++) {
data[i][j] = cnt++;
}
}
//끝부분 계산값 넣어주기
for(int i =0; i < data.length-1;i++) {
for(int j=0;j<data[i].length-1;j++) {
data[i][3]+=data[i][j];
data[3][j]+=data[i][j];
}
data[3][3]+=data[i][3];
}
//출력하기
for(int i = 0;i < data.length;i++) {
for(int j =0;j < data[i].length;j++) {
System.out.printf("%4d",data[i][j]);
}
System.out.println();
}
}// end main()
}// end class
겁나 어렵네
아니 저렇게 할 생각을 누군가 해낸다고..?
이해하는데 한 시간 넘게 걸림.
for(int i =0; i < data.length-1;i++) {
for(int j=0;j<data[i].length-1;j++) {
data[i][3]+=data[i][j];
data[3][j]+=data[i][j];
}
data[3][3]+=data[i][3];
}
이 부분이 이해가 안 됐음.
근데 이제 알게 됨.
data[i][j]는 같은데 어떻게 data[i][3]이랑 data[3][j]다 더한 거의 결과는 값이 다르게 나오지?
했는데 자리가 달라서 쌓이는 숫자가 다름.
예를 들어 i = 0 ,j =0일때 같은 0행0열의 데이터인 1을 더하지만 data[i][3]은 0행3열에 저장하고 data[3][j] 3행0열에 저장함. 두번째로 i=0,j=1일때 값2를 data[i][3]은 똑같이 0행3열에 값을 더해서 1+2=3이되지만 data[3][j]은 새로운 메모리인 3행 1열에 저장함. 그러므로 그대로 2.
이런 식으로
그렇게 다르게 쌓이면서 값이 달라짐.
원하는 값을 얻을 수 있음.
이해는 됐지만 뭔가 찝찝.
알긴 알겠는데 다음에 이런 유형의 문제를 만났을 때 스스로 생각해내서 써먹을 수 있을지 모르겠다.
익숙해질 때까지 매일 써봐야겠다. ㅎㅎ 의지의 한국인
'study > JAVA' 카테고리의 다른 글
JAVA 종류별 값의 합 구하기(값 누적) (0) | 2022.03.31 |
---|---|
[자바 JAVA] 주어진 수까지의 소수 구하기(break 활용하기) (0) | 2022.03.29 |
Java 기초 제어문 (0) | 2022.03.29 |
반복문 숙제 체크 (0) | 2022.03.29 |
자바기초 - 연산자(operators) (0) | 2022.03.27 |
댓글