국비교육(22-23)

15일차(3)/java(13) : Array, for문, 확장 for문

서리/Seori 2022. 10. 26. 23:00

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) { }