개발새발

[Java] 배열과 리스트 1 : Array ~ 다차원 배열 본문

Java/개념을 Java

[Java] 배열과 리스트 1 : Array ~ 다차원 배열

칸쵸. 2023. 9. 18. 01:44
728x90

 

배열에 대해 좀 알았다!싶었는데 배열에, ArrayList에, 2차원 배열에, LinkedList 어쩌구까지;;

여기저기서 튀어나오는 개념이 너무 방대하다!!! 헷갈려죽겠다!!!해서 쓰는 글~


 

1. 배열 (Array)

일단 배열이 뭔가? 여러 개의 자료를 순차적으로 관리하는 자료 구조이다.

예를들어 학생 한두 명도 아니고, 전교생의 학번을 모두 관리하려면? 학생마다 변수를 다 선언해서 관리하는 것은 불가능에 가깝고, 비효율의 끝판왕이다. 이럴 때 사용하는 자료형이 바로 배열! 

배열을 사용하면 자료형이 같은 자료 여러 개를 한 번에 관리가 가능하고, 이 때의 자료는 연속으로 나열된 꼴이다.

 

1) 배열 선언과 초기화

 

배열의 선언은 이렇게 가능하다

자료형[] 배열이름 = new 자료형[개수];

포켓몬 도감번호을 배열로 선언해본 예시

int[] pokemonNum = new int[10]; //int형 요소가 10개인 배열 선언

 

자바에서 배열은 선언하자마자 각 요소의 값이 초기화가 동시에 진행된다. 정수형 자료는 0, 실수는 0.0, 객체 배열은 null로 초기화 되는데.. 만약 배열 선언과 동시에 특정 값으로 초기화를 원한다면 다음처럼 진행하면 된다.

int[] pokemonNum = new int[] {146, 147, 148}; //개수는 생략

 

선언과 동시에 초기화를 하는 것은 곧 int형 요소가 3개인 배열을 생성한다는 의미이므로 new int[ ]를 생략해도 된다.

int[] pokemonNum = {146, 147, 148}; //int형 요소가 3개인 배열을 생성하겠어요~

그런데 만약 위와 같이 값을 넣어 초기화를 진행하려는 경우에  [ ] <안에 개수를 쓰면 오류가 발생한다

int[] pokemonNum = int[3] {146, 147, 148}; //오류가 나는 배열 선언

또, 만약 배열의 자료형을 먼저 선언해놓고 그 요소를 초기화하는 경우에는 new int[ ]를 생략하면 또 오류가 난다

int[] pokemonNum; //포켓몬 도감 번호를 int형 배열로 선언하겠어
pokemonNum = new int[] {146, 147, 148}; //new int[] 생략 불가

왜 그런 오류가 나냐고? Java 맘이니까 그런가보다 하는게 정신건강에 좋을 것같다.

 

 

2) 배열 사용하기

 

선언한 배열의 각 요소에 값을 넣을 때나, 배열 요소에 있는 값을 가져올 때는 [ ]를 사용한다.

배열의 [ ]는 인덱스 연산자로, 배열 요소가 저장된 메모리 위치를 찾아주는 역할을 한다. 만약 배열 길이를 n이라고 하면, 배열 순서는 1번부터가 아닌 0번부터 n-1까지로 계산되기 때문에 0번 요소를 배열의 첫 번째 요소라고 한다.

pokemonNum[0] = 1; //배열의 첫 번째 요소에 값 1을 저장한다

선언한 배열의 길이를 알고싶을 경우에는 배열이름.length를 통해 값을 반환해서 확인 가능하다

//배열의 길이를 반환하는 메서드
public int pokemonlength() {
	return pokemonNum.length;
}

 

**주의

배열을 선언하는 것은, 선언한 배열 길이만큼의 메모리를 할당하는 것 뿐이지 그만큼 값을 저장하는 것과는 아니기 때문에 전체 배열 길이는 배열에 저장된 값의 개수와는 전혀 다르다.

 

그리고 지금까지는 계속 숫자값을 집어넣는 배열만을 만들어봤는데, 만약 문자형을 저장하는 배열을 만들고싶다면?

char[] pokemonGrade = new cahr[10]; //문자를 저장하는 배열
pokemonGard[0] = 'S'; //첫 번째 자리에 저장되는 포켓몬에는 S등급 매겨줬다

이렇게 자료형을 char로 바꿔서 선언하면 끝!

참고로 이 때 저장되는 알파벳 문자는 실제 메모리에 아스키 코드 값으로 저장이 된다. 따라서 아래와 같은 코드도 작성이 가능하다

package array;

public class CharArray {
	public void static main(Strign[] args) {
    	char[] testASCII = new char[26]; //각 알파벳과 아스키코드 매치를 확인하기 위한 배열 선언
        char ch = 'A';
        
        for(int i=0 ; i < testASCII.length ; i++,ch++) {
        	testASCII[i] = ch;
        }
        
       for(int i=0 ; i<testASCII.length ; i++) {
       		System.out.println(testASCII[i] + "," + (int)testASCII[i]);
       }
	}
}

위 코드에서 testASCII[0]에는 A가 들어가고, 실제 메모리에는 A의  아스키 코드 값인 65가 저장될 것이다.

그리고 두 번째 for문에서 형변환 연산자 (int)를 통해, testASCII[i] 배열에 저장된 char형 문자를 int 형 정수로 변환해서 출력하면 아래와 같은 결과가 나온다~

각 알파벳과 아스키 코드가 매칭되어 출력된 결과
출처: 위키피디아&nbsp;https://simple.m.wikipedia.org/wiki/File:ASCII-Table-wide.svg

앞으로 문자의 아스키코드가 궁금하면 이 표를 참고하자~

 

3) 객체배열 사용하기

 

배열은 참조 자료형으로도 선언할 수 있는데, 이를 객체 배열이라고 부른다.

**참조 자료형 변수: 클래스형으로 선언하는 변수

 

따라서 객체 배열은 클래스를 2개 이상 생성해서 사용이 가능하다..!

Pokemon 클래스를 만들고, 이 클래스로 객체 배열을 생성하는 코드를 만들어 보자!

package array;

public class Pokemon {
	
	//멤버변수 선언
	private String pokemonName; //포켓몬의 이름
	private int pokemonNum; //포켓몬의 도감번호
	
	public Pokemon(String name, int Num) { //포켓몬 이름과 도감번호를 매개변수로 받는 생성자
		this.pokemonName = name;
		this.pokemonNum = Num;
	}

	public String getPokemonName() {
		return pokemonName;
	}

	public void setPokemonName(String pokemonName) {
		this.pokemonName = pokemonName;
	}

	public int getPokemonNum() {
		return pokemonNum;
	}

	public void setPokemonNum(int pokemonNum) {
		this.pokemonNum = pokemonNum;
	}
	
	public void showPokemonInfo() { //포켓몬 이름과 도감번호를 매치해서 출력하는 메서드
		System.out.println(pokemonName + "(" + pokemonNum + ")");
	}
}

Pokemon 클래스는 포켓몬의 이름과 도감번호를 멤버 변수로 받는 클래스로, 이 멤버 변수 모두를 매개변수로 받는 생성자까지 구현했다. 그리고 멤버 변수는 private으로 접근제한을 걸었으므르, GetterSetter 메서드를 통해 다른 코드에서 이 클래스를 사용할 때 멤버변수 값을 가져오거나 지정할 수 있도록 했다. 마지막으로는 포켓몬의 정보를 출력하는 showPokemonInfo() 메서드까지 구현 끝!

 

그럼 이제 포켓몬의 정보를 저장하는 배열을 생성하고, 각 배열 요소에 인스턴스를 생성해 넣는 코드를 또 다른 클래스를 통해 작성해보자~

package array;

public class PokemonArray {

	public static void main(String[] args) {
		
		//Pokemon 클래스형으로 객체 배열 생성
		Pokemon[] pokedex = new Pokemon[6];
		
		//인스턴스 생성 후 배열에 저장
		pokedex[0] = new Pokemon("유크시", 146); //new + Pokemon생성자
		pokedex[1] = new Pokemon("엠라이트", 147);
		pokedex[2] = new Pokemon("아그놈", 148);
		pokedex[3] = new Pokemon("디아루가", 149);
		pokedex[4] = new Pokemon("펄기아", 150);
		pokedex[5] = new Pokemon("기라티나", 210);
		
		for(int i=0 ; i < pokedex.length ; i++) {
			pokedex[i].showPokemonInfo();
		}
	}

}

위에서 Pokemon[ ] pokedex = new Pokemon[6]; 라는 코드는 배열을 선언한 것 뿐이지, 배열을 생성한 것이 아님에 주의해야한다. 정확히 말하자면 인스턴스가 생성된 것이 아닌데, 이때는 배열을 선언할 때 지정한 사이즈인 인스턴스 6개를 담을 수 있는 공간을 확보한 것 뿐이라고 보면 될듯하다. 도감 자리 6칸을 만들어놓고, 아직 그 안에 어떤 포켓몬을 넣을지 지정은 하지 않은 상태인 셈. 따라서 우리는

pokedex[0] = new Pokemon("유크시",146);

과 같이 선언된 배열의 자리에 넣을 인스턴스를 생성해서 저장을 하는 과정이 필요하다.

 

아무튼 위의 코드를 출력한 결과는 아래와 같다

4세대 전설의 포켓몬 6마리가 아주 잘 들어가있다 호호

 

그리고... 배열의 처음부터 끝까지 모든 요소를 참조할 때 사용할 수 있는 향상된 for문 및 다차원 배열 이야기는

시간이 늦은 이슈로.. 그냥 자고 다음에 이어서 쓰겟습니다

 

도감에 들어간 친구들

 

4) 향상된 for문

향상된 for문(Enhanced for loop)은 배열의 처음에서 끝까지 모든 요소를 참조할 때 사용하면 편리한 반복문으로,

배열 요소 값을 순서대로 하나씩 가져와서 변수에 대입한다. 별도의 초기화 및 종료 조건은 없기 때문에 모든 배열의 시작 요소부터 끝 요소까지 실행한다는 특징이 있다. 향상된 for문의 구조는 다음과 같다!

for(변수형 변수 : 배열) {
	반복 실행문;
}

그리고 예시.

향상된 for문을 통해 모든 배열 요소를 출력해보자~

public class EnhancedForLoop {

	public static void main(String[] args) {
		String[] pokemon = {"브케인", "라이코", "치코리타", "파이리", "꼬부기", "이상해씨"};
		
		//향상된 for문을 통해 모든 배열 요소를 출력하기
		for(String name : pokemon) { //String변수 name에 pokemon배열의 각 요소가 대입된다
			System.out.println(name);
		}
	}
}

출력화면

 

2. 다차원 배열

앞선 배열은 모두 행 하나로 이루어진 '일차원 배열'이었다면 다차원 배열은 평면 및 3차원 공간을 구현할 수 있다.

일단 앞으로 말하는 다차원 배열은 주로 평면을 나타내는 이차원 배열이라고 보면 될듯..

 

 

1) 이차원 배열

이차원 배열은 일단 행과 열로 구성된 평면이라고 보면 된다. 구조 및 예시는 다음 코드와 같음.

// 자료형[][] 배열이름 = new 자료형[행 개수][열 개수];

// int형 배열 요소로 이루어진 2행 3열의 이차원 배열 arr를 생성
int [][] arr = new int[2][3];

이차원 배열의 초기화는 행과 열 개수에 맞추어서 중괄호 { } 안에 콤마(,)로 구분해 값을 적으면 된다

// 1행 1~3열까지 1,2,3이, 2행 1~3열가지 4,5,6이 들어간 이차원 배열
int[][] arr = {{1,2,3}, {4,5,6}};

이차원 배열에도 길이는...더보기 졸려요 여기부터 arrayList는 또 나중에 쓸게요

이쯤되면 무슨 기면증같군요

맨날 졸린사람...

 

2) 이차원 배열 연습문제

 

예제 가져왔습니다..

알파벳 소문자를 13행 2열로 출력하는 프로그램을 이차원 배열로 구현하기

보아하니 아스키코드를 이용하는 문제같다. ( a의 아스키코드 값은 97)

 

** 내가 생각한 코드구현 관건

 

1) 13행 2열으로 출력하면

     a b

     c d

     e f

     g h ... 와 같은 모양이 나올 것이고, 그렇다면 각 행을 출력하고 줄을 바꾸는 무언가가 필요할 것이다

 

2) 배열 이름을 arr이라고 한다면 arr[ i ] [ j ] = ?에 들어갈 값이 또 하나씩 커질 수 있도록하는 장치가 필요할 것이다

 

정도인데.. 이를 통해 구현해본 결과! (갑분문제풀이)

package array;
// 알파벳 소문자를 2글자씩 13줄(13행 2열)로 출력하는 프로그램을 이차원 배열로 구현해보세요
public class TwoDimension {

	public static void main(String[] args) {
		
    	char[][] arr = new char[13][2]; // 13행 2열 배열 선언
    	
    	// a 아스키코드 : 97
    	char k = 'a'; // a에는 97이 저장된다
    	
    	for(int i = 0; i < arr.length ; i++) { //arr.length : 행의 개수 13
    		for(int j = 0; j < arr[i].length ; j++) { //arr[i].length : 열의 개수 2
    			arr[i][j] = k;
    			System.out.print(arr[i][j]); // 행이 끝나기 전에는 줄 바꿈 x
    			k ++ ; // 배열의 각 요소가 채워질 때마다 k의 아스키코드 값이 1씩 커짐
     		}
    		System.out.println(); // 행이 끝날 때마다 줄 바꿈
    	}
    	
	}
	
}

출력결과

하나씩 차근차근 풀어가야 하는 요소를 고려해서 코드를 작성하니 크게 어렵진 않았다..!

아직은 연습문제 단계라 그렇겠지만 ㅋ

 

암튼 이차원배열은 이렇게 흘러간다~ 정도만 알고 가자


원래는 글 하나에 ArrayList까지 같이 쓸 예정이었는데 애는 클래스이기도 하고...

글도 너무 길어져서 part2로 나누어 쓰겠다 안뇽!

'Java > 개념을 Java' 카테고리의 다른 글

[Java] JUnit  (0) 2023.09.22
[Java] 배열과 리스트 2 : ArrayList  (0) 2023.09.20
[Java] API  (1) 2023.09.14
[Java] 추상클래스 Abstract  (0) 2023.09.12
[Java] 변수의 종류  (0) 2023.09.12