15일차(3)/java(13) : Array, for문, 확장 for문
Step07_Array 프로젝트 생성
<MainClass01>
package test.main;
public class MainClass01 {
public static void main(String[] args) {
//int type 5개를 저장하고 있는 배열 객체를 생성해서 참조값을 nums 라는 지역변수에 담기
int[] nums={10, 20, 30, 40, 50};
//double type 5개를 저장하고 있는 배열
double[] nums2={10.1, 10.2, 10.3, 10.4, 10.5};
//boolean type 5개를 저장하고 있는 배열
boolean[] truth={true, false, false, true, true};
//String type(참조 데이터 타입) 5개를 저장하고 있는 배열
String[] names={"바나나","딸기","복숭아","사과","오렌지"};
//배열의 각각의 방 참조하기
int result1=nums[0]; //10
double result2=nums2[1]; //10.2
boolean result3=truth[2]; //false
String result4=names[3]; //"사과"
//배열 객체의 메소드와 필드 사용해 보기
int[] cloned=nums.clone(); //복제본 얻어내기
int[] copied=nums; //참조값 복사해 주기
int size=nums.length;
}
}
- 배열을 변수에 집어넣는다면
in javascript : let nums=[10,20,30,40,50]; / 나중에 추가할 경우 nums.push(60);
in java : int[] nums={10, 20, 30, 40, 50};
- java에서는 {} 으로 배열을 만든다!
타입명 int [ ] : int 배열 타입. 정수가 여러개 들어가 있는 배열을 의미한다.
- javascript와 java의 배열array은 많이 다르다.
- java의 배열은 활용도가 좀 떨어진다. java에서는 배열도 정해진 타입만 집어넣을 수 있다.
또한 java 배열은 방의 개수가 한번 정해지면 바꿀 수 없다.
(안에 들어있는 아이템을 수정할 수는 있지만 방의 개수를 늘리거나 줄일 수 없다.)
- 디버그에서 보면 참조값이 들어가 있는 것을 볼 수 있다.
인덱스가 붙은 0번방~4번방에 10~50까지의 정수가 들어있는 모양!
→ java에서는 배열도 참조 데이터 타입이다. (참조값id과 heap 영역 생성)
- 배열도 참조 데이터 타입이기 때문에 nums. 하면 호출할 수 있는 필드와 메소드가 나오는 것을 볼 수 있다.
- [ ] index 형태로 참조하고 있다!
- clone 이라는 메소드는 복제본을 만들어 내는 것이다.
복제본을 만들어서 새로운 배열을 얻어낸다. id(참조값)는 다르지만 배열의 내용은 같다.
- 참조값을 복사해주려면 int[ ] copied=nums; 로 작성하면 된다.
- cloned 도 지역변수. 똑같은 참조값을 담는 것이 아니라 똑같은 모양의 배열을 새로 만드는 것.
heap영역에 생성된 방에 저장된 내용을 그대로 복사해가는 것이다.
새로 만들었기 때문에 참조값은 다르다! 이 참조값(26)을 얻어내는 것.
-따라서 26번 사물함의 내용을 바꿔도 24번 사물함의 배열이 바뀌지는 않는다. 독립적인 배열!
- 하지만 copied 의 경우 같은 참조값을 가지므로, 24번 사물함에서 그대로 가져오는 것. nums와 동일한 객체를 사용한다.
<MainClass02>
package test.main;
public class MainClass02 {
public static void main(String[] args) {
//0으로 초기화된 방 3개짜리 int[] 객체를 만들어서 참조값을 지역변수 nums에 담기
int[] nums={0, 0, 0};
//0번방에 10, 1번방에 20, 2번방에 30을 저장해보세요.
nums[0]=10;
nums[1]=20;
nums[2]=30;
//0으로 초기화된 방 100개짜리 int[] 객체를 만들어서 참조값을 지역변수 nums2에 담기
int[] nums2=new int[100];
//0으로 초기화된 방 3개짜리 int[] 객체를 만들어서 참조값을 지역변수 nums3에 담기
int[] nums3=new int[3];
nums3[0]=100;
nums3[1]=200;
nums3[2]=300;
// nums3[3]=400; 를 작성하면 작성시에는 오류라고 나오진 않지만 run해보면 오류가 나타난다.
System.out.println("main 메소드가 정상 종료됩니다.");
}
}
- int[ ] int배열이면 int 타입만 배열에 들어갈 수 있다.
int[] 변수명=new int[n]; : n개의 int 배열을 만들어 변수명에 대입한다.
ex) int[] nums2=new int[100];
- 100개짜리 방을 만들고 싶다면... int[ ] 에 new를 붙여 만든다.
따로 지정하지 않아도 기본값은 0으로 들어간다.(디버그 환경에서 확인가능)
- 어떤 공간이 아무 내용물도 없이 만들어질 수는 없다. 배열도 마찬가지!
100개의 방이 만들어지려면 어떤 값이든 들어가 있어야 한다. int타입이라면 0이라도!
- 기본 데이터타입이 담길 수 있는 null공간은 없다. 어떤 값이든 넣어야 한다.
- 참조 데이터타입의 경우 null 상태로도 생성 가능하다.
- {0, 0, 0} = new int[3] 두가지는 같은 것!
- 존재하지 않는 nums 배열의 3번을 참조하면 작성할 때는 오류라고 나오지는 않지만,
run 해보면 배열의 인덱스가 오류가 났다는 알림창이 뜬다.(존재하지 않는 인덱스 참조)
<MainClass03>
package test.main;
public class MainClass03 {
public static void main(String[] args) {
//1. String type 을 담을 수 있는 방 3개짜리 빈 배열객체를 만들어서 참조값을 지역변수 names에 담기
String[] names=new String[3];
// String[] names={null,null,null}; //참조타입이므로 이렇게 쓸수도있다.
//2. 3개의 방에 순서대로 친구의 이름을 담아 보세요.
names[0]="김oo";
names[1]="이oo";
names[2]="박oo";
//3. 배열에 들어있는 친구의 이름을 하나씩 순서대로 콘솔창에 출력해 보세요.
System.out.println(names[0]);
System.out.println(names[1]);
System.out.println(names[2]);
//또는
for(int i=0; i<names.length; i++) {
System.out.println(names[i]);
}
}
}
javascript: for(let i=0; names.length(); i++)
java: for(let i=0; i<names.length; i++) (여기서 length는 필드!)
- for 문 작성법은 javascript와 java에서 거의 비슷하다.
- index 숫자가 자동으로 바뀌며 콘솔창에 출력되는 것을 for문으로 작성하면
for(int i=0; i<names.length; i++) {
System.out.println(names[i]);
}
- mypac 패키지에 Bike클래스를 만든다.
바이크를 타는 가상의 메소드!
<Bike>
package test.mypac;
public class Bike {
//메소드
public void ride() {
System.out.println("바이크를 타고 달려요!");
}
}
<MainClass04>
package test.main;
import test.mypac.Bike;
public class MainClass04 {
public static void main(String[] args) {
/*
* 1. Bike객체를 담을 수 있는 방3개짜리 배열객체를 생성해서 참조값을
* bikes라는 지역변수에 담아 보세요.
* 2. 배열의 각각의 방(0,1,2번)에 Bike객체를 생성해서 담아 보세요.
* 3. 반복문 for를 이용해서 순서대로 배열의 각각의 방에 있는 Bike객체의
* ride()메소드를 호출해 보세요.
*/
Bike[] bikes=new Bike[3]; // {null,null,null}
bikes[0]=new Bike();
bikes[1]=new Bike();
bikes[2]=new Bike();
for(int i=0; i<bikes.length; i++) {
bikes[i].ride();
}
}
}
- bike 타입의 배열!
Bike[] bikes=new Bike[3];
- Bike[] : Bike 배열 타입 객체를 생성한 것(빈 방 3개)이지 바이크 타입 객체를 생성한 것이 아니다.
- new Bike(); : Bike 타입 객체 생성. new 작성시마다 각각 다른 바이크가 달린 것이다(독립적)
- bikes[] 배열의 방을 참조하면 ride 메소드가 있으니까 . 점을 찍어서 호출한다.
- 아래 두가지를 구분하기!!
bikes : bike[] type 바이크 배열 타입
bikes[i] : bike type 바이크 타입
<MainClass05>
package test.main;
import java.util.Scanner;
public class MainClass05 {
public static void main(String[] args) {
System.out.println("main 메소드가 시작되었습니다.");
//키보드로부터 입력받을 수 있는 기능을 가진 객체 생성
Scanner scan=new Scanner(System.in);
System.out.print("문자열 한줄 입력:");
//한줄 입력받고
String str=scan.nextLine();
//입력받은 문자열을 콘솔에 출력
System.out.println(str);
//종료
System.out.println("main 메소드가 종료되었습니다.");
}
}
- Scanner 클래스. 다양한 변수를 받을 수 있도록 다중정의되어 있다.
- 키보드로 입력한 내용을 java변수에 담아 활용하는 연습! (사용자의 입력을 받는다)
- 사용자의 입력을 받으려면 어떤 객체의 도움을 받아야되는데, Scanner를 활용해서 객체를 생성할 수 있다.
new Scanner(System.in);
- 이 객체를 생성하면 사용자로부터 입력을 받을 수 있다(키보드, 파일 읽기, 네트워크에서 읽기, 등...)
- 생성자의 인자로 system.in을 넣어주면 키보드로부터 입력받을 수 있다. 키보드와 연결되어 있다!
System.in : 사용자로부터 입력을 받는 것
System.out : 콘솔로 출력하는 것. 콘솔 창과 연결되어 있다.
.nextLine(); → nextLine 설명 : 링크
- 사용자로부터 입력받은 것을 String 타입으로 리턴해준다. (한 줄을 읽어옴)
- 작성한 후 run 해보면, 시작되었습니다만 나오고 아래 종료되었습니다가 나오지 않는다.
breakpoint도 없고 디버그 모드가 아닌데도 중간에 블록되어 멈춰있다.
→ scan.nextLine() 지점에서 정지해 있다. 키보드로부터 입력받기 위해서.
사용자로부터 한줄을 입력받으려고 대기하고 있는 것!
- 커서를 콘솔창에 갖다놓고 직접 입력한다.(초록색 글씨)
- 입력하면 이렇게 콘솔에 출력되고 실행이 종료된다.
- 여기에 값을 넣어야 한다는 것을 알려주기 위해 System.out.print("문자열 한줄 입력:"); 을 넣어주기
<MainClass06>
package test.main;
import java.util.Scanner;
public class MainClass06 {
public static void main(String[] args) {
//1.문자열을 저장할수있는 방 5개짜리 배열객체를 생성해서 참조값을 msgs라는 지역변수에 담는다.
String[] msgs=new String[5];
//2. 키보드로부터 입력받을 수 있는 Scanner객체를 생성해서 참조값을 scan이라는 지역변수에 담는다.
Scanner scan=new Scanner(System.in);
//3. 반복문을 위에서 생성한 배열의 방의 갯수만큼 돌면서 키보드로부터 문자열을 입력받아서
// 배열에 순서대로 저장한다.
for(int i=0; i<msgs.length; i++) {
System.out.print("문자열 입력:");
//문자열 한줄 입력 받기
String line=scan.nextLine();
//배열의 i번째 방에 저장
msgs[i]=line;
//msgs[i]=scan.nextLine(); 위 2줄을 1줄로 쓴것
}
//4. 반복문 돌면서 배열에 저장되었던 모든 문자열을 순서대로 콘솔창에 출력한다.
for(int i=0; i<msgs.length; i++) {
String tmp=msgs[i];
System.out.println(tmp);
//System.out.println(msgs[i]); 위 2줄을 1줄로 쓴것
}
}
}
- System.in을 참조해서 배열에 넣어주는 것
- 어디까지 참조하느냐에 따라 데이터 타입이 달라진다.
위의 string[] 타입과 string 타입 구분!
- System.out.println 은 콘솔출력시 개행기호(줄바꿈)를 포함하는 것.
- System.out.print 는 개행기호가없어서 옆에 바로 문자열을 입력받을 수 있다.
현재 Main Method 안에서 지역변수가 몇개일까?
→ String[] msgs, Scanner scan, int i, String line, int i, String tmp
- 앞선 for문에서 생성된 변수 i는 for문이 종료되면 안에서 사라졌기 때문에, 뒤의 for문에서 다시 선언할수있다.
더 좁은 범위 안에서 만들어진 지역변수이다!
- for 문 안에 있는 line 이라는 지역변수는 총 5번 만들어진다.
1 2를 순서대로 실행한 후 line이 만들어지고, i++로 올라갈 때 기존에 만들어졌던 line은 사라지는 것!
아래 for문을 도는 tmp도 그렇다.
- 임시변수! 배열에 있는 것을 잠시 담아두는 변수
즉 지역변수는 String[] msgs, Scanner scan, int i, String line*5, int i, String tmp*5 개라고 할 수 있다.
<MainClass07> : 확장 for문
package test.main;
public class MainClass07 {
public static void main(String[] args) {
int[] nums= {10, 20, 30, 40, 50};
for(int i=0; i<nums.length; i++) {
int tmp=nums[i];
System.out.println(tmp);
}
System.out.println("----확장 for 문을 사용하면 ----");
for(int tmp:nums) {
System.out.println(tmp);
}
}
}
- for문을 보다 간단하게 작성할 수 있다.
- java에서는 배열형태로 만들어놓고 하나씩 빼낼 일이 많다.
- 두개의 for문은 같은 내용이다. 아래에 있는것이 더 쉽고 간단한 for문.
for(타입명 변수명:배열명)
ex) for(int tmp:nums){ }
- nums가 int배열이기 때문에 이렇게 선언한 것!
<MainClass08> : 확장 for문
package test.main;
import test.mypac.Bike;
public class MainClass08 {
public static void main(String[] args) {
//1.String타입 배열
String[] names={"바나나","딸기","복숭아","사과","오렌지"};
for(String tmp:names) {
System.out.println(tmp);
}
Bike[] bikes=new Bike[3];
//2.Bike타입 배열
bikes[0]=new Bike();
bikes[1]=new Bike();
bikes[2]=new Bike();
for(Bike tmp:bikes) {
tmp.ride();
}
}
}
- 확장 for문의 다른 데이터타입 버전.
for(타입명 변수명:배열명)
ex) String type: for(String tmp:names) { }
ex) Bike type: for(Bike tmp:bikes) { }
'국비교육(22-23)' 카테고리의 다른 글
[참고] github 저장소 README.md 파일 생성 / Pull (0) | 2022.10.27 |
---|---|
16일차(1)/java 퀴즈 : Array, Random 활용 예제 (0) | 2022.10.27 |
15일차(2)/java(12) : WrapperClass (0) | 2022.10.26 |
15일차(1)/java(11) : class, variable, git 외 (0) | 2022.10.26 |
[참고] Eclipse에서 Github으로 push, reset하기 (0) | 2022.10.26 |