1. JVM의 메모리 영역
1) Method Area(메소드 영역)
: 프로그램 시작될때 생성, 프로그램 종료될 때 소멸
byte code, 리터럴(literal), 상수(final), static
2) Heap(힙)
: new 생성시 생성, reference가 끊기면 Garbage Collection에 의해 자동으로 소멸
객체(object), 배열, new로 생성되는 모든 것
3) Stack(스택)
: 블럭 안에서 선언될 때 생성, 블럭이 끝날 때 소멸
지역변수(local variable), 매개변수(argument)
2. 배열 생성 초기화 할 때 JVM 메모리에서 일어나는 일
: new 는 위와 같이 heap 에 객체를 생성하고, 생성된 주소를 리턴한다.
리턴된 주소는 score 변수값에 대입되고 score 변수는 배열 객체를 reference(참조)하게 된다
[ex) int[] score = new int[3];
1) 지역변수 score가 스택에 생긴다
타입은 int[] 타입(reference 타입!)
2) new 로 생성한 int[3]개짜리 배열객체가 heap에 생성된다
각 배열원소는 int 타입이라 0 으로 초기화 됨.
[실습코드]
1. Lec10_Loop
1) practice.gugu2 패키지, Gugu2 클래스
** 숙제, 내가 작성한 코드 **
package practice.gugu2;
/*
* 구구단 ver.2
*
* 3개 열로 출력될수 있도록
* 작성해보세요
*
* 패키지: practice.gugu2
* 클래스: Gugu2
*/
public class Gugu2 {
public static void main(String[] args) {
int start = 2;
int end = 4;
while(end < 10) {
for(int n = 1; n < 10; n++) {
for(int dan = start; dan <= end; dan++) {
System.out.print(dan + " x "+ n + " = " + (dan * n) + "\t");
}
System.out.println();
}
start += 3;
end += 3;
if(end == 10) {end -= 1;}
}
}
}
2) com.lec.java.loop05 패키지, Loop05Main 클래스
package com.lec.java.loop05;
public class Loop05Main {
public static void main(String[] args) {
System.out.println("순환문 연습 - 언제 100을 넘나?");
// 1 + (-2) + 3 + (-4) + ...+ (n) >= 100 ?
// 언제(n) 합이 100을 넘나? 그 합은?
int sum = 0; // 합을 계산할 변수 선언&초기화
for (int n = 1; sum < 100; n++) {
int temp;
if (n % 2 == 1) {
// 홀수인 경우에는 숫자 그대로
temp = n;
} else {
// 짝수인 경우에는 숫자를 음수로 바꿔서
temp = -n;
} // end else
sum = sum + temp; // sum += temp;
System.out.println("n = " + n + ", sum = " + sum);
} // end for (n)
System.out.println();
System.out.println("순환문 연습 - 두 주사위 눈의 합");
// 두 주사위 눈의 합 = 6
// (1, 5), (2, 4), (3, 3), (4, 2), (5, 1)
// x + y = 6를 만족하는 x, y 쌍을 찾으면 됨.
for (int x = 1; x <= 6; x++) {
for (int y = 1; y <= 6; y++) {
if (x + y == 6) {
System.out.println(x + ", " + y);
//break;
} // end if
} // end for (y)
} // end for (x)
System.out.println("\n프로그램 종료");
} // end main()
} // end class
3) com.lec.java.loop06 패키지, Loop06Main 클래스
package com.lec.java.loop06;
/* break 레이블; // 레이블(label) 위치까지 순환문 탈출
*
* 프로그래밍의 구조적 설계에 악영향을 줄수 있으니 가급적 지양하기 바랍니다
*/
public class Loop06Main {
public static void main(String[] args) {
System.out.println("레이블 (label)");
System.out.println();
// 구구단이 결과가 50을 넘어가면 출력 종료. 어떻게 하나?
// 맨 밑의 '프로그램 종료' 까지 진행해야 한다.
z: // 레이블은 반드시 순환문 직전에 표시
for(int dan = 2; dan <= 9; dan++) {
System.out.println(dan + "단");
for(int n = 1; n <= 9; n++) {
if(dan * n > 50) {
break z; //레이블 위치까지 탈출
}
System.out.println(dan + " x " + n + " = " + (dan * n));
}
System.out.println();
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class
2. 반복제어문1, 자가진단04
package 반복제어문1.자가진단04;
import java.util.Scanner;
/*
* 정수를 계속 입력받다가 100 이상의 수가 입력이 되면
* 마지막 입력된 수를 포함하여 합계와 평균을 출력하는 프로그램을 작성하시오.
* (평균은 반올림하여 소수 첫째자리까지 출력한다.)
*
* [입력 예]
* 1 2 3 4 5 6 7 8 9 10 100
*
* [출력 예]
* 155
* 14.1
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
int sum = 0, cnt = 0;
//for(;;) {} // 무한루프
for(;true;) { // 무한루프
n = sc.nextInt();
sum += n;
cnt++;
if(n >= 100) {break;}
}
System.out.println(sum);
System.out.printf("%.1f", (double)sum / cnt);
sc.close(); // 위에가 무한루프면 Unreachable code 에러가 발생
// 현재는 위의 코드가 무한루프에 빠져 나올수 있는 조건이 생겼기 때문에
// 에러 메시지가 사라짐과 동시에 에러도 사라짐
}
}
[추가] 위에가 무한루프면 Unreachable code 오류 발생
[추가] 현재는 위의 코드가 무한루프에 빠져 나올수 있는 조건이 생겼기 때문에
에러 메시지가 사라짐과 동시에 에러도 사라짐
3. 반복제어문2, 자가진단07
package 반복제어문2.자가진단07;
/*
* 아래와 같이 출력되는 프로그램을 작성하시오.
* 2 3 4 5 6
* 3 4 5 6 7
* 4 5 6 7 8
* 5 6 7 8 9
* 6 7 8 9 10
*/
public class Main {
public static void main(String[] args) {
for(int i = 2; i <= 6; i++) {
for(int j = 0; j < 5; j++) {
System.out.print((i + j) + " ");
}
System.out.println();
}
}
}
4. 반복제어문1, 형성평가 실습 3
** 내가 만든 코드 **
package 반복제어문1.형성평가03;
/*
* 0 부터 100 까지의 점수를 계속 입력받다가 범위를 벗어나는 수가 입력되면
* 그 이전까지 입력된 자료의 합계와 평균을 출력하는 프로그램을 작성하시오.
* (평균은 반올림하여 소수 첫째자리까지 출력한다.)
*
* [입력 예]
* 55 100 48 36 0 101
*
* [출력 예]
* sum : 239
* avg : 47.8
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//사용자로부터 입력 받음(0부터 100까지 받기)
int input = 0;
//합계, 평균
int sum = 0;
double avg = 0.0;
//평균을 위한 총 입력받은 수
int cnt = 0;
while(true) {
input = sc.nextInt();
if(0 <= input && input <= 100) {
// 합계구하기
sum += input;
cnt++;
continue;
} else {
// 평균내고
avg = (double)sum / cnt;
// 출력하기
System.out.println("sum : " + sum);
System.out.println("avg : " + String.format("%.1f", avg));
break;
}
}
}
}
** 쌤이 만든 코드 **
package 반복제어문1.형성평가03;
/*
http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=27&sca=1060
127 : 반복제어문1 - 형성평가3
0 부터 100 까지의 점수를 계속 입력받다가 범위를 벗어나는 수가 입력되면
그 이전까지 입력된 자료의 합계와 평균을 출력하는 프로그램을 작성하시오.
(평균은 반올림하여 소수 첫째자리까지 출력한다.)
[입력예]
55 100 48 36 0 101
[출력예]
sum : 239
avg : 47.8
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n ;
int sum = 0, cnt = 0; // '합계' 와 '개수'
while(true) {
n = sc.nextInt(); // 계속 반복해서 숫자 입력
if(0 > n || n > 100) break; // 범위를 벗어나면 입력 종료
sum += n; // 합계 누적
cnt++; // 입력 개수 증가
}
// 결과 출력
System.out.println("sum : " + sum);
System.out.printf("avg : %.1f", (double)sum / cnt);
sc.close();
}// end main
}// end class
5. 반복제어문2, 형성평가 실습 8
** 내가 만든 코드 **
package 반복제어문2.형성평가08;
import java.util.Scanner;
/*
* 행과 열의 수를 입력받아 다음과 같이 출력하는 프로그램을 작성하시오.
*
* [입력 예]
* 3 4
*
* [출력 예]
* 1 2 3 4
* 2 4 6 8
* 3 6 9 12
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 행값, 3
int col = sc.nextInt();
// 열값, 4
int row = sc.nextInt();
for(int i = 1; i <= col; i++) {
for(int j = 0; j <= row-1; j++) {
System.out.print(i + (j * i) + " ");
}
System.out.println();
}
}
}
** 쌤이 만든 코드 **
package 반복제어문2.형성평가08;
/* 137 : 반복제어문2 - 형성평가8
http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=37&sca=1070
행과 열의 수를 입력받아 다음과 같이 출력하는 프로그램을 작성하시오.
입력 예]
3 4
출력 예]
1 2 3 4
2 4 6 8
3 6 9 12
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int row = sc.nextInt(); // 행 입력
int col = sc.nextInt(); // 열 입력
for(int i = 1; i <= row; i++) {
for(int j = 0; j < col; j++) {
System.out.print((i + i * j) + " ");
}
System.out.println();
}
sc.close();
}// end main
}// end class
6. 반복제어문3, 형성평가 실습 3
** 내가 만든 코드 **
package 반복제어문3.형성평가03;
import java.util.Scanner;
/*
* 자연수 n을 입력받아 "출력 예"와 같이 출력되는 프로그램을 작성하시오.
* 주의! '*'과 '*'사이에 공백이 없고 줄사이에도 빈줄이 없다.
*
* [입력 예]
* 3
*
* [출력 예]
* *
* **
* ***
* **
* *
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
// 증가
for(int i = 0; i < input + 1; i++) {
for(int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
//감소
for(int i = input - 1; i > 0; i--) {
for(int j = i; j > 0; j--) {
System.out.print("*");
}
System.out.println();
}
}
}
** 쌤이 만든 코드 **
package 반복제어문3.형성평가03;
/* http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=42&sca=1080
142 : 반복제어문3 - 형성평가3
자연수 n을 입력받아 "출력 예"와 같이 출력되는 프로그램을 작성하시오.
주의! '*'과 '*'사이에 공백이 없고 줄사이에도 빈줄이 없다.
입력 예]
3
출력 예]
*
**
***
**
*
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 증가 방향
for(int i = 0; i < n; i++) {
for(int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
// 감소 방향
for(int i = n; i >= 1; i--) {
for(int j = 0; j < i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
sc.close();
}// end main
}// end class
7. Lec11_Array
1) com.lec.java.array01 패키지, Array01Main 클래스
package com.lec.java.array01;
/* 배열(Array)
동일 타입의 여러개의 데이터를 담는 집합자료형
배열 선언
자료타입[] 변수이름;
배열 원소 (element)
배열에 담긴 각각의 데이터
배열의 길이 (length)
배열 원소의 개수, 즉 배열에 담긴 데이터의 개수
배열 인덱스 (첨자, index)
배열의 인덱스는 0부터 시작해서, (배열의 길이 - 1)까지가 됨
배열인덱스를 사용하여 배열원소에 접근하여 사용
배열을 new로 생성한뒤에는 자동초기화 가 됨.(즉, new로 생성할 때 무조건 자동 초기화됨)
숫자타입들은 --> 0으로
boolean타입은 --> false 로
객체타입(Object) 타입은 --> null 로.
★ 배열변수의 타입, 배열원소의 타입 확실히 구분하자
★ JVM 메모리 상에 생기는 구조 이해 필수
*/
public class Array01Main {
public static void main(String[] args) {
System.out.println("배열(Array)");
int korea1 = 99;
int korea2 = 88;
int korea3 = 77;
//...
// 다량의 데이터를 위해서 매번 변수 작성하는건... 사실상 불가 ㅜ^ㅜ
// 그래서 배열이라는 집합자료형이 나옴!!
// 배열 선언, 초기화
int[] korean = new int[3];
// int타입 배열 선언
// 3개의 int 데이터를 담는 배열로 초기화
korean[0] = 90; // 첫번째 배열원소에 90 대입
korean[1] = 80;
korean[2] = 70;
System.out.println("국어0 : " + korean[0]);
System.out.println("국어1 : " + korean[1]);
System.out.println("국어2 : " + korean[2]);
//korean[3] = 60; // Exception in thread "main"
// java.lang.ArrayIndexOutOfBoundsException: 3
// at com.lec.java.array01.Array01Main.main(Array01Main.java:51)
// korean 의 타입은? int[] 타입(인티저 배열 타입)
// korean[0] 의 타입은? int 타입(인티저 타입)
System.out.println("for문을 사용하여 배열 출력");
for(int n = 0; n < 3; n++) {
System.out.println("korea[" + n + "] = " + korean[n]);
}
System.out.println();
// int 타입의 english 라는 이름의, 5개 데이터를 담는 배열 선언, 초기화
int[] english;
english = new int[5];
// 에러 아님!
// 0을 대입한 적이 없는데 0이 출력이 됨!
// 왜? 자동초기화가 되서....!!!
System.out.println(english[1]);
System.out.println();
for(int i = 0; i < 5; i++) {
english[i] = i * 10;
}
for(int i = 0; i < english.length; i++) {
System.out.println(english[i]);
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array01Main
[추가] Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.lec.java.array01.Array01Main.main(Array01Main.java:51)
2) com.lec.java.array02 패키지, Array02Main 클래스
package com.lec.java.array02;
/* 배열의 선언과 초기화
배열 선언 따로, 초기화 따로
타입[] 이름 = new 타입[배열의 길이];
배열을 선언과 동시에 초기화 1
타입[] 이름 = new 타입[] {a, b, c, ...};
배열을 선언과 동시에 초기화 2
타입[] 이름 = {a, b, c, ...};
배열의 길이를 자동으로 알 수 있는 방법
배열이름.length
*/
public class Array02Main {
public static void main(String[] args) {
System.out.println("배열의 선언과 초기화");
// 배열 선언 따로, 초기화 따로
int[] korean = new int[3];
// length : 데이터 개수 ---> 3
// size : 용량 ---> 12 byte (이상)
korean[0] = 100;
korean[1] = 90;
korean[2] = 80;
for (int i = 0; i < korean.length; i++) {
System.out.println("국어" + i + " : " + korean[i]);
}
System.out.println();
// 선언과 동시에 초기화
int[] english = new int[] {30, 20, 40};
for (int i = 0; i < english.length; i++) {
System.out.println("영어" + i + " : " + english[i]);
}
System.out.println();
int[] math = {99, 88, 77, 66}; // new int[] {99, 88, 77, 66}
for (int i = 0; i < math.length; i++) {
System.out.println("수학" + i + " : " + math[i]);
}
// 수학 점수들의 총점과 평균 계산
int total = 0;
for (int i = 0; i < math.length; i++) {
total += math[i];
}
double avg = (double)total / math.length;
System.out.println("수학총점 : " + total);
System.out.println("수학평균 : " + avg);
System.out.println();
// 배열 변수를 출력하면...?
System.out.println(math); // 출력값 : [I@15db9742
// () 괄호
// {} brace
// [] bracket
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array02Main
[추가] System.out.println(math); // 출력값 : [I@15db9742
3) com.lec.java.array03 패키지, Array03Main 클래스
package com.lec.java.array03;
public class Array03Main {
public static void main(String[] args) {
System.out.println("여러가지 자료형의 배열");
System.out.println();
System.out.println("[1] double형 배열");
// 타입[] 이름 = new 타입[배열 길이];
// 타입[] 이름 = new 타입[] {a, b, ...};
// 타입[] 이름 = {a, b, ...};
double[] array1 = {1.2, 2.3, 3.4};
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);
}
System.out.println();
System.out.println("[2] char형 배열");
char[] array2 = new char['z' - 'a' + 1];
for (int i = 0; i < array2.length; i++) {
array2[i] = (char)('a' + i);
System.out.print(array2[i] + " ");
}
System.out.println();
System.out.println();
System.out.println("[3] boolean형 배열");
boolean[] array3 = new boolean[4];
// 짝수 index => true, 홀수 index => false
for (int i = 0; i < array3.length; i++) {
if(i % 2 == 0) {array3[i] = true;}
else {array3[i] = false;}
System.out.println(i + " : " + array3[i]);
}
System.out.println();
System.out.println("[4] String형의 배열");
String[] array4 = new String[3];
array4[0] = "Hello Java";
array4[1] = "Hello C++";
array4[0] = "Good bye HTML";
for (int i = 0; i < array4.length; i++) {
System.out.println(array4[i]);
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array03Main
4) com.lec.java.array04 패키지, Array04Main 클래스
** 내가 만든 코드 **
package com.lec.java.array04;
import java.util.Scanner;
/* 연습
* 길이 5개 int 형 배열을 선언하고
* 사용자로부터 5개 정수를 입력받아 초기화 한뒤
*
* 총점, 평균, 최대값, 최소값 출력해보기
*/
public class Array04Main {
public static void main(String[] args) {
System.out.println("배열 연습");
Scanner sc = new Scanner(System.in);
int[] number = new int[5];
int sum = 0;
double avg = 0.0;
int max = 0, min = 0;
for (int i = 0; i < number.length; i++) {
System.out.println((i + 1) + "번째 정수 입력하시오 : ");
number[i] = sc.nextInt();
sum += number[i];
}
avg = (double)sum / number.length;
max = number[0];
min = number[0];
for (int i = 1; i < number.length; i++) {
if(max < number[i]) {
max = number[i];
}
if(min > number[i]) {
min = number[i];
}
}
System.out.println("총점 : " + sum + ", 평균 : " + avg + ", 최대값 : " + max + ", 최소값 : " + min);
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array04Main
** 쌤이 만든 코드 **
package com.lec.java.array04;
import java.util.Scanner;
/* 연습
* 길이 5개 int 형 배열을 선언하고
* 사용자로부터 5개 정수를 입력받아 초기화 한뒤
*
* 총점, 평균, 최대값, 최소값 출력해보기
*/
public class Array04Main {
public static void main(String[] args) {
System.out.println("배열 연습");
// int형의 길이는 5개인 배열을 score라는 이름으로 선언
int[] score = new int[5];
int total = 0; // 총점
// 키보드로 입력을 받아서 배열 원소 5개를 초기화
Scanner sc = new Scanner(System.in);
for (int i = 0; i < score.length; i++) {
System.out.println("점수 입력: ");
score[i] = sc.nextInt();
total += score[i]; // 총점 누적
} // end for ()
sc.close();
System.out.println("총점: " + total);
System.out.println("평균: " + (double)total / score.length);
System.out.println();
// 최댓값
int max = score[0];
for (int i = 1; i < score.length; i++) {
if(score[i] > max) {
max = score[i];
}
}
System.out.println("최댓값 = " + max);
// 최솟값
int min = score[0];
for (int i = 1; i < score.length; i++) {
// if (score[i] < min) {
// min = score[i];
// } // end if
min = (score[i] < min) ? score[i] : min;
} // end for
System.out.println("최솟값 = " + min);
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array04Main
5) com.lec.java.array05 패키지, Array05Main 클래스
package com.lec.java.array05;
/* 2차원 배열 (2-dimensional array)
* 직전의 예제와 같이 같이 배열 첨자를 하나만 쓰는 배열을
* 1차원 배열 (one-dimensional array) 이라고 함
* 배열원소가 '1차원 배열' 들로 이루어진 배열을 2차원 배열 이라 한다
* 배열원소가 '2차원 배열' 들로 이루어진 배열을 3차원 배열 이라 한다
*/
public class Array05Main {
public static void main(String[] args) {
System.out.println("2차원 배열");
// 1차원 배열들...
int[] arr1 = {1,2};
int[] arr2 = {3,4};
int[] arr3 = {5,6};
// 2차원 배열 : (배열 원소가 1차원 배열)
// 1차원 배열 x 3개 갖고 있는 2차원 배열
int[][] array = {
{1, 2}, // <-- array[0]
{3, 4}, // <-- array[1]
{5, 6} // <-- array[2]
};
System.out.println(array[0][0]);
System.out.println(array[0][1]);
System.out.println(array[1][0]);
System.out.println(array[1][1]);
System.out.println(array[2][0]);
System.out.println(array[2][1]);
//System.out.println(array[3][0]); //오류: ArrayIndexOutOfBoundsException
// 흔히 2차원배열은 '행'과 '열'로 표기(표현)하기도 함
// 위 array는 3행(row) x 2열(column) 인 2차원 배열
// 2차원 배열에서 length의 의미:
// array.length: 2차원 배열의 원소, 즉 1차원배열의 개수
// 행열의 개념에선 2차원 배열의 행(row)의 개수를 의미
System.out.println("array.length = " + array.length);
// array 의 타입 --> int[][]
// array[0] 의 타입 --> int[]
// array[0][0] 의 타입 --> int
System.out.println("array[0].length = " + array[0].length);
System.out.println("array[1].length = " + array[1].length);
// 2차원 배열 원소, for
for (int x = 0; x < array.length; x++) {
for (int y = 0; y < array[x].length; y++) {
System.out.print(array[x][y] + " " );
}
System.out.println();
}
// TODO:
// 2행 4열의 2차원배열을 두 개를 만들어서
// 아래와 같이 초기화하고 출력하기
// 첫번째 배열 출력
// 1 2 3 4
// 5 6 7 8
// System.out.println();
// int[][] arrData = new int[2][4];
// int data = 0;
//
// // 값 저장
// for (int i = 0; i < arrData.length; i++) {
// for (int y = 0; y < arrData[i].length; y++) {
// data++;
// arrData[i][y] = data;
// }
// }
//
// // 값 출력
// for (int i = 0; i < arrData.length; i++) {
// for (int y = 0; y < arrData[i].length; y++) {
// System.out.print(arrData[i][y] + " ");
// }
// System.out.println();
// }
int [][] arr4 = {
{1, 2, 3, 4},
{5, 6, 7, 8}
};
for(int x = 0; x < arr4.length; x++) {
for(int y = 0; y < arr4[x].length; y++) {
System.out.print(arr4[x][y] + "\t");
}
System.out.println();
} // end for
System.out.println();
System.out.println("array\t\t: " + array); // 2차원 배열 주소값 출력 : [[I@15db9742
System.out.println("array[0]\t: " + array[0]); // 1차원 배열 주소값 출력됨 : [I@6d06d69c
System.out.println("array[1]\t: " + array[1]); // 1차원 배열 주소값 출력됨 : [I@7852e922
System.out.println("array[2]\t: " + array[2]); // 1차원 배열 주소값 출력됨 : [I@4e25154f
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array05Main
6) com.lec.java.array09 패키지, Array09Main 클래스
package com.lec.java.array09;
/* ragged array: column(열)의 개수가 일정하지 않은 배열
가변 배열 선언 방법: 행의 개수만 지정을 하고, 열의 개수는 비워둠
열(column)이 몇 개가 될 지 모르기 때문에 메모리 할당이 되지 않습니다.
*/
public class Array09Main {
public static void main(String[] args) {
System.out.println("Ragged Array(가변 배열)");
//int[] arr[]; // 가능은 하다...
//int arr[][];
int[][] arr = new int[3][]; // int[] 3개짜리 2차원배열 객체만 생성
// 오류 : NullPointerException
// NullPointerException 오류를 해결하기 위해 아래의 3줄 코드를 작성하면됨
// 아래의 3줄이 누락되면 NullPointerException 오류 발생
arr[0] = new int[]{10};
arr[1] = new int[]{11, 12};
arr[2] = new int[]{20, 30, 40};
// 확인
for (int x = 0; x < arr.length; x++) {
for (int y = 0; y < arr[x].length; y++) {
System.out.print(arr[x][y] + " ");
} // end for(y)
System.out.println();
} // end for(y)
// arr[1]과 arr[2]를 바꾸고 싶다!
System.out.println();
int[] temp = arr[1];
arr[1] = arr[2];
arr[2] = temp;
// 확인
for (int x = 0; x < arr.length; x++) {
for (int y = 0; y < arr[x].length; y++) {
System.out.print(arr[x][y] + " ");
} // end for(y)
System.out.println();
} // end for(y)
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array09Main
[추가] int[] 3개짜리 2차원 배열 객체만 생성.
int 1차원 배열 값을 설정하지 않으면 초기값으로 Null 값이 들어가고 Null값으로 어떠한 액션을 취할 수 없음
즉, NullPointerException 오류 발생!!!
[추가] NullPointerException 오류를 해결하기 위해 아래의 3줄 코드를 작성하여
int 1차원 배열 값을 설정해주면 됨!!
7) com.lec.java.array10 패키지, Array10Main 클래스
package com.lec.java.array10;
/* Enhanced for (향상된 for) 문
for (배열타입 변수 : 배열이름) { ... }
*/
public class Array10Main {
public static void main(String[] args) {
System.out.println("Enhanced for (향상된 for) 문");
int[] arr = {11, 22, 33, 44, 55};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i] + " ");
}
System.out.println();
System.out.println("Enhanced-for 사용");
for(int x : arr) {
System.out.println(x);
}
System.out.println();
System.out.println("2차원 배열에서 Enhanced-for 사용");
int[][] arr2 = {
{1, 2},
{3, 4, 5, 6},
{7, 8, 9}
};
for(int[] row : arr2) {
for(int e : row) {
System.out.print(e + " ");
}
System.out.println();
} // end for
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array10Main
8) com.lec.java.array11 패키지, Array11Main 클래스
package com.lec.java.array11;
/* for와 enhanced for의 차이점
enhanced for문에서는 배열의 원소를 꺼내서
변수에 복사(저장)해서 사용하는 것입니다.
즉, 배열의 원소를 직접 변경하는 것은 불가능하다.
*/
public class Array11Main {
public static void main(String[] args) {
System.out.println("for와 enhanced for의 차이점");
int[] arr1 = {10, 20, 30, 40, 50};
// 증가 전 값 화면 출력하기
System.out.println("증가 전");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i] + " ");
}
System.out.println("\n\n증가 후");
// 배열의 원소를 +1씩 증가
for (int i = 0; i < arr1.length; i++) {
arr1[i] += 1; // arr1[i]++, arr1[i] = arr1[i] + 1
}
// 증가된 값 출력하기
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + " ");
}
System.out.println("\n\nEnhanced for 증가후");
int [] arr2 = {10, 20, 30, 40, 50};
// enhanced for문에서는 사본을 이용하는 것이기 때문에
// 값이 증가가 안된다
// 즉, 배열의 원소를 직접 변경하는 것은 불가능하다.
for(int num : arr2) {
num += 1;
}
// 값이 증가가 되지 않았음을 확인하기 위해 출력
for(int num : arr2) {
System.out.print(num + " ");
}
System.out.println();
System.out.println("\n프로그램 종료");
} // end main()
} // end class Array11Main
9) com.lec.java.array12 패키지, 클래스
package com.lec.java.array12;
/* main() 의 매개변수 String[] args
*/
public class Array12Main {
// 윈도우 환경에서 path 설정이 되어 있으면 커맨드 창 에서
// bin>java com.lec.java.array12.Array12Main ~~ ~~
// 이클립스 환경에선 Run-Run configuration 에서 [Argument] 를 설정해주면 된다.
public static void main(String[] args) {
System.out.println("main 메소드 매개변수: String[] args");
System.out.println("args.length = " + args.length);
for(String arg : args) {
System.out.println("--> " + arg);
}
} // end main
} // end class Array12Main
[추가] main()의 매개변수 String[] args를 cmd 창을 이용하여 값을 입력해보기
[추가] main()의 매개변수 String[] args를 이클립스를 이용하여 값을 입력해보기
: Run > Run Configurations
> Arguments > Program arhuments > 매개 변수 입력 > Debug 클릭
> main()의 매개변수 길이와 값을 알 수 있음!!
10) com.lec.java.array13 패키지, 클래스
package com.lec.java.array13;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/* java.util.Arrays 클래스
배열을 다루는 유용한 메소드들 제공
Arrays.toString() : 문자열 형태로 리턴
Arrays.copyOf(원본배열, 복사할 length)
Arrays.copyOfRange(원본배열, from, to))
Arrays.fill() : 배열에 특정 값으로 채우기
Arrys.sort(원본배열) : 오름차순 변경
Arrays.asList() : array -> List 로
*/
public class Array13Main {
public static void main(String[] args) {
System.out.println("java.util.Arrays 클래스");
int[] arr = {10, 20, 30, 40, 50};
// Arrays.toString() : 배열 -> 문자열로 리턴
System.out.println(Arrays.toString(arr));
// Arrays.copyOf(원본배열, 복사할 length)
// 배열을 복사하여 새로운 배열생성하여 리턴
int[] arr2 = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(arr2));
// length가 원본보다 크면, 나머지 부분은 기본값으로 채워짐
// 출력 : [10, 20, 30, 40, 50, 0, 0, 0, 0, 0]
int[] arr3 = Arrays.copyOf(arr, 10);
System.out.println(Arrays.toString(arr3));
// Arrys.sort(원본배열)
// 오름차순 변경. 원본 배열을 변경시킨다
// 내림차순은 지원하지 않는다.
int[] arr7 = {8, 9, 3, 5, 1, 2};
System.out.println(Arrays.toString(arr7));
Arrays.sort(arr7);
System.out.println(Arrays.toString(arr7));
// Arrays.equals(배열1, 배열2)
int[] arr8 = {10 ,20 ,30};
int[] arr9 = {10 ,20 ,30};
// 주소 비교를 했기 때문에 false값이 출력됨
System.out.println(arr8 == arr9);
// 그렇기 때문에 배열의 값이 일치하는지 확인하기 위해서는 Arrays.equals() 메서드를 사용하자!
System.out.println(Arrays.equals(arr8, arr9));
System.out.println("\n프로그램 종료");
} // end main
} // end class
8. 배열1.자가진단09
package 배열1.자가진단09;
import java.util.Arrays;
import java.util.Scanner;
/*
* 10개의 정수를 입력받아 배열에 저장한 후 내림차순으로 정렬하여 출력하시오.
*
* [입력 예]
* 95 100 88 65 76 89 58 93 77 99
*
* [출력 예]
* 100 99 95 93 89 88 77 76 65 58
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] array = new int[10];
for (int i = 0; i < array.length; i++) {
array[i] = sc.nextInt();
}
sc.close();
// 배열 정렬하기
// bubble sort
// cycle
for (int i = array.length; i > 0; i--) {
// 비교
for (int j = 0; j < i - 1; j++) {
if(array[j] < array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
} // end for
System.out.println();
}
}
'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글
2020.03.23 (0) | 2020.03.23 |
---|---|
2020.03.20 (0) | 2020.03.20 |
2020.03.18 (0) | 2020.03.18 |
2020.03.17 (0) | 2020.03.17 |
2020.03.16 (0) | 2020.03.16 |