Tip. do while 예제//잘 안 쓰겠지만 한번은 써보자.
public class Do_While {
public static void main(String[] args) {
char c = 'a';
do
{
System.out.printf("%c", c);//C언어의 printf와 같다. printformat
c = (char) (c + 1);//c++ 해도 똑같이 출력된다. format은 char이나 처리는 아스키 코드 즉, 수로 하기 때문
}while(c <= 'z');
}
}
출력 : 처음에 a를 프린트라고 그 다음부터
Tip. break문은 하나의 반복문만 벗어난다.
-> 내 기준 실수를 많이 하는 부분이다. int check를 이용하자.
배열이란?
인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조
같은 타입의 데이터들이 순차적으로 저장된다.
-인덱스를 이용하여 원소 데이터 접근
-반복문을 이용하여 처리하기에 적합
배열 인덱스
-0부터 시작
-인덱스는 배열의 시작 위치에서부터 데이터가 있는 상대 위치
일차원 배열 만들기
배열 선언과 배열 생성의 두 단계 필요
int intArray[];
char charArray[];
또는
int[] intArray;
char[] charArray;
intArray = new int[10];
charArray = nuw char[20];
또는
int intArray[] = new int[10];
char charArray[] = new char[20];
new연산이 반드시 와야만 객체 생성!! -> 배열은 하나의 객체이다!
앞에서
Scanner sc = new Scanner(System.in); 과 비슷한 문법이다.
레퍼런스 변수와 배열
레퍼런스 변수란?
-(메모리) 참조 변수 , 포인터와 거의 같은 개념이다.
(1) 배열에 대한 레퍼런스 변수 intArray 선언
int intArray[];//레퍼런스 변수 intArray, [] : 배열임을 선언
int[] intArray 역시 마찬가지, 배열의 레퍼런스 변수 intArray를 선언하는 것이다.
(2) 배열 생성
intArray = new int[5];
//new 는 배열 생성, int는 타입, 5는 원소 개수
//malloc처럼 레퍼런스 변수 intArray에 메모리 주소를 할당
이 때 생성된 배열은 heap메모리 공간에 생성된다.
즉, 전역변수와 같다.
배열을 초기화하면서 생성한 결과
int intArray[] = {4, 3, 2, 1, 0};
-> 5칸짜리 배열이 생성되면서 배열의 각 칸에 원소 4, 3, 2, 1, 0이 할당
위와 같이 int[] intArray = {}로 배열을 초기화하면서 생성하는 것 역시 가능하다.
배열 인덱스와 원소 접근
배열 원소 접근
배열 변수명과 [] 사이에 원소의 인덱스를 적어 접근
베열의 인덱스로 음수는 사용 불가, 배열의 범위를 넘은 인덱스 사용 불가
그리고 반드시 배열 생성 후 접근해야함.
레퍼런스 치환과 배열 공유
하나의 배열을 다수의 레퍼런스가 참조 가능하다.
레퍼런스 변수와 배열 공간이 분리되어 있기 때문
int[] intArray = new int[5];
int myArray[] = intArray;
라 하면 intArray[1] = 2라 하면
둘은 같은 배열이기 때문에 myArray[1] 역시 2이다.
예제 - 배열에 입력 받은 수 중 제일 큰 수 찾기
import java.util.Scanner;
public class Find_Max {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] intArray = new int[5];
int max = 0;
System.out.println("양수 5개를 입력하세요. ");
for(int i = 0; i < 5; i++)
{
intArray[i] = scanner.nextInt();
if(intArray[i] > max) max = intArray[i];
}
System.out.println("가장 큰 수는 " + max + "입니다.");
scanner.close();//메모리 낭비를 막기 위해 scanner는 반드시 close해주어야 한다.
}
}
배열의 크기, length 필드
배열은 자바에서 객체로 관리
배열 객체 내에 length필드는 배열의 크기를 나타낸다.
int[] intArray;
intArray = new int[5];
int size = intArray.length;//size는 5
예제 - 배열 원소의 평균 구하기
import java.util.Scanner;
public class Mean_Value {
public static void main(String[] args) {
int intArray[] = new int[5];
int sum = 0;
double average = 0.0;
Scanner scanner = new Scanner(System.in);
System.out.print(intArray.length + "개의 정수를 입력하세요 >>");
for(int i = 0; i <intArray.length; i++)
{
intArray[i] = scanner.nextInt();
sum += intArray[i];
}
average = (double)sum / intArray.length;
System.out.println("평균은 " + average);
scanner.close();
}
}
배열과 for - each 문
for-each 문
배열이나 나열(enumeration)의 각 원소를 순차적으로 접근하는데 유용
for(변수 : 배열)
{
반복 작업문
}
int[] num = {1,2,3,4,5};
int sum = 0;
for(int k : num)
{
sum += k; -> 배열의 각 성분들이 k에 순서대로 들어간다.
}
System.out.println("합은 " + sum);
String names[] = {"사과", "배", "바나나", "체리", "딸기", "포도"};
for(String s : name)
{
System.out.print(s + " ");
}
enum Week{월, 화, 수, 목, 금, 토, 일};
for(Week day: Week.values())
{
System.out.print(day + "요일 ");
}
Tip.
enum의 value메소드는 열거된 모든 원소를 배열에 담아 순서대로 리턴한다.
이차원 배열
2차원 배열 선언
int intArray[][];
char charArray[][];
또는
int[][] intArray;
char[][] charArray;
2차원 배열 생성
intArray = new int[2][5];
charArray = new char[5][5];
또는
int intArray[][] = new int[2][5];
char charArray[][] = new char[5][5];
또는
int[][] intArray = new int[2][5];
char[][] charArray = new char[5][5];
2차원 배열 선언,생성,초기화
선언과 동시에 초기화를 수행할 경우, 크기를 입력하지 않음.
new자료형[][] 생략 가능!
int[][] intArray = new int[][]{{0,1,2},{3,4,5},{6,7,8}};
char charArray = {{'a','b','c'},{'d','e','f'}};
2차원 배열의 length필드
Array.length -> 2차원배열의 행의 개수
Array[i].length -> 2차원 배열의 i번쨰 행의 열의 개수
public class Mean_Grade {
public static void main(String[] args) {
double[][] score = {{3.3, 3.4},
{3.5, 3.6},
{3.7, 4.0},
{4.1, 4.2}};
double sum = 0;
System.out.println("score.length: " + score.length);
System.out.println("score[0].length: " + score[0].length);
for(int year = 0; year < score.length; year++)
{
for(int term = 0; term < score[year].length; term++)//학기
{
sum += score[year][term];
}
}
int n = score.length;
int m = score[0].length;
System.out.println("평균 평점은 : " + sum/(n * m));
}
}
비정방향 배열
정방향 배열 - 각 행의 열의 개수가 같은 배열
int[][] Array = new int[4][4];
비정방향 배열 - 각 행의 열의 개수가 다른 배열
int[][] array;
array = new int[4][];
array[0] = new int[1];
array[1] = new int[2];
array[2] = new int[3];
array[3] = new int[4];
예제
public class Non_Square_Array {
public static void main(String[] args) {
int intArray[][] = new int[4][];
intArray[0] = new int[3];
intArray[1] = new int[2];
intArray[2] = new int[3];
intArray[3] = new int[2];
for(int i = 0; i < intArray.length; i++)
{
for(int j = 0; j <intArray[i].length; j++)
{
intArray[i][j] = 10*(i+1) + j;
}
}
for(int i = 0; i < intArray.length; i++)
{
for(int j = 0; j <intArray[i].length; j++)
{
System.out.print(intArray[i][j] + " ");
}
System.out.println();
}
}
}
출력
10 11 12
20 21
30 31 32
40 41
메소드에서 배열 리턴
메소드의 배열 리턴 -> 배열 공간 전체가 아니라 배열에 대한 레퍼런스만 리턴
메소드의 리턴 타입 -> 메소드의 리턴 타입과 리턴 받는 배열 타입은 일치
리턴 타입에 배열의 크기는 지정하지 않음
int[] makeArry(){
int temp[] = new int[4];
return temp;//배열 리턴!!
}
int[] intArray;
intArray = mekeArray();
return후 temp가 가리키는 배열 메모리는 사라지지 않음 -> 힙 메모리에 만들어지기 떄문
지역변수 temp는 사라짐.
예제
public class ReturnArray {
static int[] makeArray()
{
int temp[] = new int[4];
for(int i= 0; i < 4; i++)
{
temp[i] = i;
}
System.out.println("temp : " + temp);
return temp;
}
public static void main(String[] args) {
int intArray[];
intArray = makeArray();
System.out.println("intArray : " + intArray);
for(int i = 0; i < intArray.length; i++)
{
System.out.print(intArray[i] + " ");
}
}
}
출력
temp : [I@5ca881b5
intArray : [I@5ca881b5
0 1 2 3
main() 메소드
main() 은 자바 응용 프로그램의 실행 시작 메소드
main()의 원형 :
반드시 static : 객체가 생성되기 전에 호출 가능
반드시 public
반드시 void
반드시 매개변수 타입은 문자열 배열
main(String[] args) 메소드의 인자 전달
main() 메소드의 매개변수로 명령행 인자의 전달 -> 리눅스에서 특히 많이 쓰임
ex.
C:> java Hello abc 3 5.7