4번째는
입니다.
자료구조의 일종입니다.
구조를 이미지로 알아보면
이런식으로 자료와 인덱스와 그 인덱스 위치에 자료를 저장하는 방식입니다.
선언 방법으로는
int[] mscore; // 배열 타입을 먼저 선언한 후 변수명
int mscore[]; // 변수명을 먼저 적고 배열임을 표시
int mscore[]= {80,96,100,76,36,88};//길이와 값으로 초기화
int mscore[]=null;//완전 초기화
int mscore[]=new int[6];//길이로만 (초기값없이) 배열 선언
이런 식으로 선언합니다
크기와 자료를 선언한 배열의 값을 수정하는 방법도 있습니다.
mscore[0]=48; 인덱스 위치에 값을 바꿈
mscore[1]=78;
mscore[2]=98;
mscore[3]=1;
해당 인덱스의 값을 선언하고 그 안에 원하는 데이터를 넣는 방식으로도 가능합니다.
출력은
System.out.println(mscore[0]);
System.out.println(mscore[1]);
System.out.println(mscore[2]);
System.out.println(mscore[3]);
System.out.println(mscore[4]);
System.out.println(mscore[5]);
인덱스 값을 선언하면 해당 배열의 인덱스 값을 출력합니다.
이걸 여러번 치기 귀찮으니 반복문을 쓰면
int[] mscore= {80,96,100,76,36,88};
int ndx=0; //인덱스 값을 반복문으로 바꿔서 출력할수 있음
while(ndx<mscore.length) {
System.out.println(mscore[ndx]);
ndx++;
}
결과
80
96
100
76
36
88
이런식으로 인덱스의 값만 바꾸면 원하는 위치의 데이터를 출력 가능합니다.
원하는 입력으로 배열을 자료를 저장할 수도 있습니다.
//내가 입력한 값을 인덱스에 원소로 저장하는 코드
Scanner ii=new Scanner(System.in);
int sscore[]= new int[5];
int ndx=0;
while(ndx<sscore.length) {
sscore[ndx]=ii.nextInt();
ndx++;
}
System.out.println("----------------");
ndx=0;
while(ndx<sscore.length) {
System.out.println(sscore[ndx]);
ndx++;
}
결과
15
45
23
859
84654
----------------
15
45
23
859
84654
하지만 array는 한계가 있는게 크기를 사전에 지정해서 인덱스 값 이상은 저장할 수 없습니다.
근데 지정한 크기만큼 입력을 받으면 좋지만
세상에 무슨일이 일어날줄알고
그래서 나온게
입니다.
ArrayList는 가변길이로
타입 이름을 쓸때 전부 써줘야 합니다.
예시로
ArrayList<Integer> alMath = new ArrayList<Integer>();
ArrayList는 크기가 지정되어있지 않기 때문에
원하는 만큼 값을 추가할 수 있습니다.
int score=i.nextInt();
while(score>-1) { //스코어가 마이너스 1 보다 큰동안
alMath.add(score);//인덱스에 게체를 추가
score=i.nextInt();//입력을 받음
}
//배열의 길이:배열명.length
//배열리스트의 길이: 배열리스트명.size()
System.out.println("__________________");//스코어가 -1이 입력되면
int ndx=0;//ndx를 0으로 초기화 하고
while(ndx<alMath.size()) { //ndx가 배열리스트의 길이보다 작은동안
System.out.println(alMath.get(ndx));
ndx++;
}
결과:
12
23
241
124
123
12
-1
__________________
12
23
241
124
123
12
Control_Statement
프로그래밍에서 가장 중요한게 조건문이 아닌가 생각이 듭니다.
이걸로 다양한 기능을 구현하고 또 처음 배울떄 가장 헷갈리는 부분이 아닌가 싶습니다.
// if(비교/논리){
// 조건이'참(true)'일 때 실행문들
// }
// if(비교/논리) {
// 조건이 '참(true)'일때 실행문들
// }else {
// 조건이 '거짓(false)'일때 실행
// } if안에 if를 쓸 수 있고 else안에 if를 쓸 수 도 있다
이런식으로 내가 원하는 상황에 원하는 코드를 출력하는게 주요 기능이라고 볼 수 있습니다. 근데 이게 if(만약)와 else(나머지)만 있냐 그게 아닙니다.
int i = 11;
int n=(i>10)?++i:--i;
System.out.println(n);
결과
12
이런식으로 ":" 앞뒤로 참일때 거짓일때 실행문을 실행시킬 수 있습니다.
switch case는 특정 상황에 특정 실행문을 실행시키는 겁니다.
int a = 100;
switch(a) {
case 100:
System.out.println("100점");
break;//다음 case문이 나오기전에 만드시 써야함
case 90: //부등호가 들어가면 switch문을 쓸 수 없음 (>,<,<=,>=)불가 등호(==)만 가능 (a.quals)도 포함
//조건1. 등호만으로 구성된else if문만 switch문으로 변환할 수 있다. 그외 x
//조건2.
System.out.println("90점");
break;
case 80:
System.out.println("80점");
break;
default: //else
System.out.println("낙제");
}
결과: 100점
다음과 특정 상황에 따른 실행문을 볼 수 있습니다.
반복문은 우리가 여러번 할 일을 대신 여러번 해주는 방법이라고 생각합니다.
int a;
a=1;
while(a<=10) { //거짓이되지않게끔 조건을 안 넣어주면 무한루프됨
System.out.println(a);
a++; //변동부는 프로그램 맨 마지막에 쓰는걸 권장
} //1.초기화 2.조건 3.변동부
//while문은 최소 0회 실행된다
System.out.println("Program Ended");
결과:
1
2
3
4
5
6
7
8
9
10
Program Ended
이런식으로 반복문안에 원하는 실행문을 넣으면 반복적으로 출력이 가능합니다.
이중반복문을 작성하면 구구단을 자동으로 출력도 가능합니다.
int i,j;
i=8; //구구단을 작성할 수 있다
while(i<10) {
j=1;
while (j<10) {
System.out.println(i+"X"+j+"="+i*j);
j++;
}
i++;
}
System.out.println("Program Ended");
결과:
8X1=8
8X2=16
8X3=24
8X4=32
8X5=40
8X6=48
8X7=56
8X8=64
8X9=72
9X1=9
9X2=18
9X3=27
9X4=36
9X5=45
9X6=54
9X7=63
9X8=72
9X9=81
Program Ended
do while
do while은 do일단 코드를 한번이라도 실행시키고 그 후에 조건문을 비교하는 방법입니다
int i1=0;
while(i1<10) {
System.out.println(i1);
i1++;
}
System.out.println("-------------");
i1=0;
do {
System.out.println(i1);
i1++;
}while(i1<10);
결과:
0
1
2
3
4
5
6
7
8
9
-------------
0
1
2
3
4
5
6
7
8
9
둘다 결과는 같지마 과정이 조금 다른데 그냥 while문은 조건을 먼저 비교하고 실행하지만 do while문은 코드를 실행하고 그뒤에 조건을 비교합니다.
for문은 while과 비슷하니 이해가 좀더 빠르지마 헷갈리수 있으니 주의가 필요합니다.
수업을 들을떄 메모한 특이 사항 하나가 있는데 서술하면
for문 안에서 선언한 i 는 for문 안에서만 동작함
for문이 끝나면 변수i를 반납함
문제는 변수를 for문 밖에 선언하면
항상 메모리를 잡아먹음 변수의 가용 범위 안에서
변수를 선언하는걸 추천함
자바는 안쓰는 변수를 보관안하려고함
변수는 메모리를 차지하기 때문
변수의 선언에 가용범위를 결정 짓는건 "{}" 다
n이 if안에 선언되었으므로
else에 n은 선언되지 않은 변수이다 if가 끝나는 순간
n은 삭제된다.int i=10; int j=20; if(i<20) { int n; n=i; i=j; j=n; }else { n=j; j=i; i=n; }
해당 코드를 보면 else 안에서의 n은 선언 되어있지 않은 변수라고 나옵니다.
이런식으로 가용 범위 밖에 변수를 선언할지 말지를 잘 고려하는게 중요하다는 내용입니다.
본론으로 와서 for문을 보면
for(int i=0; i<10; i++) {
System.out.println(i);
}
이런식으로 for문 가로 안에 변수를 선언할 수 도 있고 그 변수에 따른 조건을 통해 몇번 반복할지를 만들 수 있습니다.
for문을 while 문으로 바꿔보면
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
// while 문으로 바꿔보면
int i = 0;
while (i < 10) {
System.out.println(i);
i++;
}
// 또는
i = 0;
while (true) {
if (i >= 10) break;
System.out.println(i);
i++;
}
// for 문으로 다시 변환
for (int i = 0; true; i++) {
if (i >= 10) break;
System.out.println(i);
}
이런 방식으로 while과 for를 같은 결과를 나오게끔도 쓸 수 있습니다.
향상된 for문은 이름을 들을때 뭔가 엄청나 보였습니다 ㅎㅎ
사실 다른게 아닌 배열 ,array List 여러 원소를 포함한 자료형 등을 출력할때 사용합니다.
그냥 for문을 쓰면
int [] score = {10,20,30,40,50,60,70,-1};
for(int i=0;i<score.length;i++) {
score[i]*=2;
System.out.println(score[i]);
}
출력:
20
40
60
80
100
120
140
-2
이런식으로 출력이 가능합니다 하지만 advanced for의 특징을 살릴 수 있는 코드를 보면
for(int x:score) {//향상된 for문은 x에 배열을 저장해 사본을 만들고 거기에 연산을한다
x*=2; //원래 값은 바뀌지 않는다
System.out.println(x); //향상된 for문은 index 0부터 끝자리까지 출력한다.
//for(int i=0;i<score.length;i++) 을 대체함
} //하지만 위에 코드는 배열 원본을 바꾼다
이런식으로 작성하는데 중요한 점은 원본의 값을 바꾸는 게 아닌 사본을 만들고 거기에 연산을 한다는 점 입니다.
System.out.println("----------------");//즉 향상된 for문은 원본을 유지하고 값을 바꾼다
for(int x:score) { //주로 값을 읽을때 쓴다
System.out.println(x); //레거시 for는 create update delete할때 쓴다
}
한번더 출력을 해보겠습니다. 이런식으로 결과를 3번 출력해 봤는데 이를 살펴보면
결과:
20
40
60
80
100
120
140
-2
----------------
40
80
120
160
200
240
280
-4
----------------
20
40
60
80
100
120
140
-2
첫번째 코드가 각 요소를 곱하기 2를 해서 score에 값을 바꾸 었고
두번째 코드 향상된 for를 사용해서 다시 한번 값을 2배씩 곱하였습니다.
3번째 코드로 출력하니 2번째 곱셈은 적용이 안되고 첫번쨰 곱셈만 적용되어 있습니다. 이러한 예를 보면서 향상된 for문은 원본을 안건드린다는 점을 알 수 있습니다.
enum은 내가 새로운 추상적인 개념을 정의해서 사용하는 겁니다.
예를 들어 월, 달 이런식의 개념을 말이죠.
public enum Week {
// enum은 타입을 정의 문자도 숫자도 아닌 개념값임
// Week는 내가 새 타입을 만든 것임
// Java에서는 개념을 만드는 것을 허용함
// 같은 프로젝트 안에서만 사용할 수 있음
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
이런식으로 요일을 정의하고
Week today = null;
Calendar cal = Calendar.getInstance(); // 오늘의 월일시간 등 모든 데이터가 저장됨 Calendar 타입
int weekDay = cal.get(Calendar.DAY_OF_WEEK); // 오늘의 요일 // DAY_OF_WEEK는 요일 정보를 숫자로 가지고 있음 1~7
// 1~7: 일~토
switch (weekDay) {
case 1: today = Week.SUNDAY; break;
case 2: today = Week.MONDAY; break;
case 3: today = Week.TUESDAY; break;
case 4: today = Week.WEDNESDAY; break;
case 5: today = Week.THURSDAY; break;
case 6: today = Week.FRIDAY; break;
case 7: today = Week.SATURDAY; break;
}
System.out.println("Today's Day of the Week: " + today); // today에는 열거값을 가져옴 ex) SUNDAY
if (today == Week.SUNDAY) { // 열거 타입 이름 열거값 외워야 함
System.out.println("Play football");
} else {
System.out.println("Work hard");
}
// 결과:
// Today's Day of the Week: THURSDAY
// Work hard
실제 날짜 정보를 가져오고 그에 따라 대조해서 원하는 결과를 출력할 수 있습니다.