일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CRUD
- BCryptPasswordEncoder
- localStorage
- useContext
- JDBC
- Java
- JavaScript
- assertequals
- WHEREIN
- 이딴게개발자
- git amend
- content-box
- Spring
- git
- 배열
- PathVariable
- 부적합한열
- react
- mybatis
- SQL
- git reset
- ResultType
- springboot
- Variabla
- oracle
- Thymeleaf
- passwordencoder
- git revase
- MVC
- HTML
- Today
- Total
개발새발
[Java] 배열과 리스트 1 : Array ~ 다차원 배열 본문
배열에 대해 좀 알았다!싶었는데 배열에, 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 형 정수로 변환해서 출력하면 아래와 같은 결과가 나온다~
앞으로 문자의 아스키코드가 궁금하면 이 표를 참고하자~
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);
과 같이 선언된 배열의 자리에 넣을 인스턴스를 생성해서 저장을 하는 과정이 필요하다.
아무튼 위의 코드를 출력한 결과는 아래와 같다
그리고... 배열의 처음부터 끝까지 모든 요소를 참조할 때 사용할 수 있는 향상된 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 |