티스토리 뷰

728x90
반응형

자바에도 배열이 존재한다.

하지만 자바스크립트와 다른 점은, 자바스크립트에서는 push(), splice() 등을 통해 배열에 원소를 추가, 삭제함으로써 배열의 크기를 조정할 수 있었지만, 자바는 처음에 선언한 크기에서 늘릴 수도, 줄일 수도 없다는 것이다. 

따라서, 활용도가 조금 떨어지는 편이다.

 

한가지 더 다른점은, 자바스크립트에서는 [ ] 대괄호로 표현을 했었는데, 자바에서는 { } 중괄호로 표현을 한다는 점이다. 

 

선언은 자료형 [ ] 변수명 = {}; 와 같은 형태로 한다.

 

예시)

//원소로 10, 20, 30, 40, 50을 갖는 nums라는 이름의 int형 배열
int[] = nums = {10, 20, 30, 40, 50};

 

예제를 통해 더 자세히 살펴보자.


배열 기초 

MainClass01.java 

package test.main;

import java.util.ArrayList;

import test.mypac.Speaker;

public class MainClass01 {
	public static void main(String[] args) {
		//10, 20, 30, 40, 50을 배열 객체에 담고 그 객체의 참조값을 nums 라는 징역 변수에 담기
		
		int[] nums = {10, 20, 30, 40, 50};
		double[] nums2 = {10.1,10.2,10.3,10.4,10.5};
		boolean[] truth = {true,false,false,true,true};
		
		String[] names = {"김구라","해골","원숭이","주뎅이","덩어리"};
		
		Speaker[] speakers = {new Speaker(), new Speaker(), new Speaker()};
		
		int[] a = nums.clone();
		int[] b= nums;
		
		nums[0] = 999;
		int result1 = a[0];
		int result2 = b[0];

	}

}

nums는 int형 배열, nums2는 double형 배열, truth는 boolean형 배열, names는 String형 배열이다. 

 

speakers는 Speaker형 배열인데, 클래스는 자료형처럼 사용할 수 있기 때문에 배열로 생성할 수 있다.

원소로는, Speaker 객체가 들어가야하기 떄문에, new Speaker()을 통해 객체를 생성하여 원소로 넣어준다.

 

a는 int형 배열인데 nums.clone()을 통해 nums를 복제한 배열 객체의 참조값이 들어있다.

clone()은, 똑같이 생긴 새로운 객체를 생성하기 때문에, 참조값이 nums와는 다르다.

 

반면에, b는 nums객체의 참조값이 들어있기 때문에, b에 들어있는 값은 nums의 참조값과 동일하다.

 

nums[0] = 999는 0번방의 값을 999로 바꾼다는 뜻이다.

따라서, nums의 0번방의 값은 999로 바뀌지만, clone은 값을 바꾸기 이전에 했기 때문에, 원래 들어있던 값인 10이 0번방에 그대로 들어있다.

 

따라서, result1은 999, result2는 10이다. 

 


배열 생성 시점에 값을 넣지 않고 나중에 넣고 싶다면?

 

배열은 방의 크기를 조정할 수 없다고 했다. 따라서, 처음에 값을 넣지 않더라도 원하는 방의 갯수는 선언 시에 정해주어야 한다.

 

배열은 { } 중괄호를 이용한다고 했는데, int 형은 초기값으로 0을, String을 비롯한 참조 데이터  타입은 null을 배열에 넣어준다.

 

따라서 다음과 같이 선언할 수 있다.

int[] myNums = {0,0,0,0,0};
String[] msgs = {null,null,null,null,null};

 

선언 후에 값을 넣고 싶을 때는, for문을 사용하여 원하는 값을 넣어준다.

for(int i=0;i<5;i++) {
			myNums[i] = 100*i;
}

for(int i=0;i<5;i++) {
			msgs[i] = "김구라"+i;
}

 

예제1에서 nums[0]을 바꾸었던 것처럼, 방에 들어있는 데이터는 얼마든지 수정할 수있다.

//java에서 배열은 한번 만들어지면 방의 갯수를 늘리거나 줄일 수 없다.
int[] nums = {10,20,30};
//방에 들어있는 데이터를 수정 가능
nums[0]=999;

 

 

 

전체코드

MainClass02.java

package test.main;

public class MainClass02 {
	public static void main(String[] args) {
		//java에서 배열은 한번 만들어지면 방의 갯수를 늘리거나 줄일 수 없다.
		int[] nums = {10,20,30};
		//방에 들어있는 데이터를 수정 가능
		nums[0]=999;
		
		//배열을 생성하는 시점에 값을 넣지 않고 나중에 넣고 싶으면
		int[] myNums = {0,0,0,0,0};
		for(int i=0;i<5;i++) {
			myNums[i] = 100*i;
		}
		//참조 데이터 type 배열의 빈값은 null을 이용해서 만든다.
		String[] msgs = {null,null,null,null,null};
		for(int i=0;i<5;i++) {
			msgs[i] = "김구라"+i;
		}
		
	}
}

 

하지만, 위와 같이 배열을 초기화하면, 원하는 방의 크기가 매우 클 때 선언이 힘들 것이다.

 

단순히 방의 크기를 숫자로 활용하여 배열을 선언하는 방법을 다음 예제에서 알아보자!


방의 갯수를 활용하여 배열 객체 생성하기

new 배열 안에 

저장할 데이터 type[ 방의 갯수 ]와 같은 형식으로 배열 객체를 생성할 수 있다.

 

예시.

int[] nums = new int[5];
String[] names = new String[10];

 

전체코드

MainClass03.java

package test.main;

public class MainClass03 {
	public static void main(String[] args) {
		/*
		 * new 배열안에 저장할 데이터 type [ 방의 갯수 ] 
		 * 와 같은 형식으로 배열 객체를 생성할 수 있다.
		 */
		int [] nums = new int[5];
		//방 5개짜리 배열 객체가 생성된걸 알 수가 있다.
		int length = nums.length;
		
		//String type을 담을 수 있는 방 10개짜리 배열 객체를 생성해서 
		//names라는 지역변수에 참조값을 담아보세요.
		String[] names = new String[10];
	}

}

확장 for문 / Class 객체 배열 활용하기

new 저장할 데이터 type[ 방의 갯수 ]는 클래스 타입의 객체에도 사용할 수 있다.

본 예제는 매우 중요하다고 하니 천천히 생각하면서 풀어보면 좋을 것 같다!

 

Car.java

package test.mypac;

public class Car {
	public void drive() {
		System.out.println("달려요!");	
	}
}

 

Q1. Car type을 담을 수 있는 방 5개짜리 빈 배열 객체를 생성해서 그 참조값을 cars라는 이름의 지역 변수에 담아보세요.

 

Q2. 반목문을 돌면서 cars 배열의 모든 방에 각각 다른 Car 객체의 참조값을 넣어보세요.

 

Q3. 반복문을 돌면서 cars 배열 안에 있는 Car 객체의 참조값을 하나씩 참조해서 drive() 메소드를 호출해 보세요.

 

 

sol1) 위의 배열 객체 생성방법을 따라 다음과 같이 만들 수 있다.

Car[] cars = new Car[5];

 

sol2) 반복문을 돌라고 했으니 for문을 사용하면 될 것이다. 

cars의 i번째 방에 어떤 값을 넣느냐가 문제인데, 각각 다른 Car객체의 참조값을 넣으라고 했으니, Car객체를 생성하여 그 참조값을 넣어주라는 의미임을 알 수 있다.

따라서, 다음과 같이 작성할 수 있다.

for(int i=0;i<cars.length;i++) {
	cars[i] = new Car();
			
}

 

sol3) 반복문을 돌며 car 배열의 각각의 Car객체의 참조값을 참조하여 drive()메소드를 호출하라 했으니,

for문에서 cars[i].drive()를 호출하면 될 것이다.

따라서 다음과 같이 작성할 수 있다.

for(int i=0;i<5;i++) {
	cars[i].drive();
}

 

동일한 표현으로 tmp를 사용해서 작성하면 다음과 같다.

//3.반복문 돌면서 cars 배열 안에 있는 Car 객체의 참조값을 하나씩 참조해서 drive() 메소드를 호출해보세요.
for(int i=0;i<5;i++) {
	//cars[i].drive();
	//i번째 방에 저장된 값을 tmp라는 임시 변수에 담기
	Car tmp = cars[i];
	//tmp 안에 있는 참조값을 이용해서 메소드 호출
	tmp.drive();
			
}

 

tmp를 사용한 코드와 동일한 표현으로 다음과 같이 작성할 수 있다.

System.out.println("확장 for문을 활용하면 아래와 같다.");
for(Car tmp:cars) {
	tmp.drive();
}

 

위와 같은 표현 방법을 확장 for문이라 한다.

확장 for문은 인덱스값이 필요하지 않을 때 주로 유용하게 사용되고, 보통 배열의 요소를 수정하지 않고 읽기만 할때 사용된다.

 

 

전체코드

MainClass04.java

package test.main;

import test.mypac.Car;

public class MainClass04 {
	public static void main(String[] args) {
		//1. Car type을 담을 수 있는 방 5개짜리 빈 배열 객체를 생성해서
		//그 참조값을 cars 라는 이름의 지역변수에 담아보세요.
		
		Car[] cars = new Car[5];
		
		//2. 반복문 돌면서 cars 배열의 모든 방에 각각 다른 Car 객체의 참조값을 넣어보세요.
		for(int i=0;i<cars.length;i++) {
			cars[i] = new Car();
			
		}
		
		//3.반복문 돌면서 cars 배열 안에 있는 Car 객체의 참조값을 하나씩 참조해서 drive() 메소드를 호출해보세요.
		for(int i=0;i<5;i++) {
			//cars[i].drive();
			//i번째 방에 저장된 값을 tmp라는 임시 변수에 담기
			Car tmp = cars[i];
			//tmp 안에 있는 참조값을 이용해서 메소드 호출
			tmp.drive();
			
		}
		
		//같은 표현 
		System.out.println("확장 for문을 활용하면 아래와 같다.");
		for(Car tmp:cars) {
			tmp.drive();
		}
	}

}

클래스 객체 배열을 새로운 생성자를 활용하여 생성하기

 

Computer.java -  두개의 생성자를 갖고 Cpu, Memory type의 cpu, memory를 필드로 갖는 Computer 클래스

package test.mypac;

public class Computer {
   private Cpu cpu;
   private Memory memory;
   
   // Cpu type 과 Memory type 을 인자로 전달 받는 생성자
   public Computer(Cpu cpu, Memory memory) {
      this.cpu=cpu;
      this.memory=memory;
   }
   
   public void doGame() {
      if(cpu == null || memory == null) {
         System.out.println("부품이 부족해서 컴퓨터가 작동을 안해요!");
         return;
      }
      System.out.println("신나게 게임을 해요!");
   }
}

 

Cpu.java - Cpu 클래스

package test.mypac;

public class Cpu {

}

 

Memory.java - Memory 클래스

package test.mypac;

public class Memory {

}

문제

Q1. Computer type을 담을 수 있는 방 5개짜리 빈 배열 객체를 생성해서 그 참조값을 coms라는 이름의 지역 변수에 담아보세요.

 

Q2. 반복문을 돌며 coms 배열의 모든 방에 각각 다른 Computer 객체의 참조값을 넣어보세요.

 

Q3. 반복물은 돌며 coms 배열 안에 있는 Computer 객체의 참조값을 하나씩 참조해 doGame() 메소드를 호출해보세요.


 

sol1) 위의 배열 생성 방법을 통해 다음과 같이 작성할 수 있다.

Computer[] coms = new Computer[5];

 

sol2) 위의 예제와 같은 방법으로, coms[i]마다 new Computer을 해주면 된다.

그런데, Computer는 default 생성자가 없고 생성자에 인자로 Cpu type 객체와 Memory type객체를 넘겨주어야 하기 때문에, Cpu 객체와 Memory 객체를 생성하여 넘겨준다.

for(int i=0;i<coms.length;i++) {
	coms[i] = new Computer(new Cpu(),new Memory());
}

 

sol3) 확장 for문을 사용하여 메소드를 호출해보자.

for(Computer tmp:coms) {
	tmp.doGame();
}

 


전체 코드

MainClass05.java

package test.main;

import test.mypac.Computer;
import test.mypac.Cpu;
import test.mypac.Memory;

public class MainClass05 {
	public static void main(String[] args) {
		//1. Computer type 을 담을 수 있는 방 5개짜리 빈 배열객체를 생성해서 
        // 그 참조값을 coms 라는 이름의 지역변수에 담아 보세요.

		Computer[] coms = new Computer[5];
		
		//2. 반복문 돌면서 coms 배열의 모든방에 각각다른 Computer객체의 참조값을 넣어보세요.
		for(int i=0;i<coms.length;i++) {
			coms[i] = new Computer(new Cpu(),new Memory());
		}
		
		//3. 반복문 돌면서 coms배열안에 있는 Computer객체의 참조값을 하나씩 참조해서
        //doGame() 메소드를 호출해보세요.
		for(Computer tmp:coms) {
			tmp.doGame();
		}
		
	}

}

문자열을 입력받아 배열에 넣고 출력해보기


문제

Q. Scanner 객체를 이용해서 친구 이름을 총 5명 입력 받아서 배열에 순서대로 저장한 후 반복문 돌면서 배열에 저장된 친구 이름을 순서대로 콘솔창에 입력하는 프로그래밍을 해보세요.


[ run 했을 때 콘솔의 실행 화면 ]
   
이름입력:김구라
이름입력:해골
이름입력:원숭이
이름입력:주뎅이
이름입력:덩어리
   
입력한 이름:김구라
입력한 이름:해골
입력한 이름:원숭이
입력한 이름:주뎅이
입력한 이름:덩어리


1) 우선 Scanner 객체를 만든다.

Scanner scan = new Scanner(System.in);

 

2) 5번 입력받아야 하므로, 방 크기가 5인 String 배열을 선언한다.

String[] friends = new String[5];

 

3) for문으로 "이름입력:" 이 출력되고, 바로 뒤에 사용자가 입력할 수 있도록 프로그래밍한다.

"이름입력:" 뒤에 개행이 되면 안되므로, System.out.print()를 사용한다.

for(int i=0;i<friends.length;i++) {
	System.out.print("이름입력:");
	friends[i] = scan.nextLine();
}

 

4) 배열을 순회하며 "입력한 이름:" 과 배열에 저장된 값을 출럭한다.

for(String tmp:friends) {
	System.out.println("입력한 이름:"+tmp);
}

 


전체코드

MainClass06.java

package test.main;

import java.util.Scanner;

public class MainClass06 {
	public static void main(String[] args) {
		/*
		 * Scanner 객체를 이용해서 친구 이름을 총 5명 입력 받아서
		 * 
		 * 배열에 순서대로 저장한 후
		 * 
		 * 반복문 돌면서 배열에 저장된 친구 이름을 순서대로 콘솔창에 입력하는 프로그래밍을 해보세요.
		 * 
		 * [ run 했을 때 콘솔의 실행 화면 ]
		 * 
		 * 이름입력:김구라
		 * 이름입력:해골
		 * 이름입력:원숭이
		 * 이름입력:주뎅이
		 * 이름입력:덩어리
		 * 
		 * 입력한 이름:김구라
		 * 입력한 이름:해골
		 * 입력한 이름:원숭이
		 * 입력한 이름:주뎅이
		 * 입력한 이름:덩어리
		 */
		Scanner scan = new Scanner(System.in);
		String[] friends = new String[5];
		for(int i=0;i<friends.length;i++) {
			System.out.print("이름입력:");
			friends[i] = scan.nextLine();
		}
		for(String tmp:friends) {
			System.out.println("입력한 이름:"+tmp);
		}
		
		
	}

}
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함