
2차원 배열은 1차원 배열을 그대로 이어받아 개념은 쉽게 알지만 방법이 매우 어렵다!
하지만 어느 것도 거를 타선없이 중요한 방법들이다..
특징) 1차원과 마찬가지로 동일한 자료형만 가능하고 어떤 자료형인지 알아야한다
*일관성을 위해서 첫번째 방식으로 선언할 것을 권장
: 가로(행)과 세로(열)로 정렬된 배열
→ 2차원에서는 index를 두개 사용한다 int[][]a;
메모리는 1차원으로만 저장가능하다 → 2차원(행과 열)을 1차원배열(각각의 행)으로 나누어서 저장한 다.
int[][] -> int[]1차원배열을 1차원 배열속으로...
| a[ 100 ] | 100[200번지][300번지] 200번지[1,2,3] 300번지[4,5,6] |
|---|
int [ ]로 일단 1차원 배열의 행을 만든다
→ 100번지에 a0(200번지),a[1](1번째 행)(300번지)
각 행에 열들을 나타낸다
→ 200번지에 0행 0~2번째 열 (a[0][0]..), 300번지에 1행 0~2번째 열 (a[1][0]..)
마치 a폴더 안에 100번지 폴더 안에 200번지,300번지 폴더가 있는 것이다
폴더개념 기억!!
System.out.println(a.length);//a이 가리키는 방의 길이: 2
System.out.println(a[0].length);//a의 0번째 행이 가리키는 방의 길이 : 3
System.out.println(a[1].length);//a의 1번째 행이 가리키는 방의 길이 : 3
방법 1) 배열 객체의 생성 + 값 대입
자료형[][] 참조변수명 = new 자료형[행의 길이][열의 길이];
//어떤타입의 참조변수 이름이 있고 힙에다가 해당타입의 행과열을 만들어라
참조변수명[0][0] = 값;
...
참조변수명 [행의 길이-1][열의 길이-1] = 값;//0부터 시작하므로 -1
int[][] a = new int[2][3];
//int타입이고 이 배열의 주소는 a, 힙에다가 int타입의 2행3열을 만들어라.
a[0][0]=1; //0행0열값은 1
a[0][1]=2;
..
❗️배열의 정보가 직접적으로 나타나있으면 적지 않는다는 것을 명심하자
자료형[][] 참조변수명 = new 자료형[행길이][];//열의 길이는 표현x
참조변수명[0] = 1차원 배열의 생성;
...
참조변수명 [행길이-1] = 1차원 배열의 생성;
int[][] a = new int[2][];
/*int 타입의 2차배열을 만드는데, 2행의 배열임을 알 수 있다 -> 배열의 2번째 특징에 위배가 되지 않는다. a참조하는 곳의 행의 정보가 이미 나와있기 때문이다*/
좀전의 방법1)
a[0] = new int[3];
a[0][0]=1, a[0][1]=2; ....
방법2)
a[0] = new int[]{1,2,3}; a의 0행에 1,2,3 넣어라
a[1] = new int[]{4,5,6}; a의 1행에 4,5,6 넣어라
//직접적으로 표현하는 방법이 되겠다
자료형[][]참조변수명 = new 자료형[][]{{값,값,값}, {값,값,값}};
//값을 나열할 때는 행과 열에 기입X
int[][] a = new int[][]{{1,2,3},{4,5,6}}
//행과 열의 개수와 내용이 다 나와있기 때문에 길이부분은 적지 않는다
System.out.println(a.length); //2
System.out.println(a[0].length); //3
System.out.println(a[1].length); //3
1차원 배열과 동일하게 분리하여 표현 가능하다.
int[][] a;
a = new int[][]{{1,2,3},{4,5,6}};
자료형[][] 참조변수명 = {{값,값,값},{값,값,값}};
//선언과 동시에 값을 대입하는 방식이다
int [][] a = {{1,2,3},{4,5,6}};
//분리해서 쓰는 경우는 안된다
//new가 없으면 분리가 안된다고 봐도 된다.
: 행마다 열의 개수가 서로 다른 2차원 행렬
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 00 | 01 | 02 |
| 1 | 10 | 11 | |
| 2 | 20 |
자료형[][] 참조변수명 = new 자료형[행의 길이][];
//정방행렬과 같은 이유로 열의 정보를 적지 않음
참조변수명[0]= 1차원 배열 생성;
..
참조변수명 [행의 길이-1] = 1차원 배열의 생성;
//분리해서 적는 방법
int[][] a = new int[2][];//2행을 가지는구나
a[0] = new int[2];//번째 행렬은 2개의 1차원배열을 갖는다
a[0][0] =1;.....
a[1] = new int[3];//여기서 0번째의 길이와 다르게 3개의 1차원열을 갖는다는 점에서 비정방임을 알 수 있다.
a[1][0] = 3;....
//직관적으로 보이게 적는 방법
int[][] a = new int[2][];
a[0] = new int []{1,2};
a[1] = new int []{3,4,5};
System.out.println(a.length);//2
SYstem.out.println(a[0].length);//2
System.out.println(a[1].length);//3
//출력에서도 다른 열의 개수임을 확인할 수 있다.
자료형[][]참조변수명 = new 자료형[][]{{값,값,값}, {값,값,값}};
//값을 나열할 때는 행과 열에 기입X
int[][] a = new int[][]{{1,2},{3,4,5}}
//행과 열의 개수와 내용이 다 나와있기 때문에 길이부분은 적지 않는다
System.out.println(a.length); //2
System.out.println(a[0].length); //2
System.out.println(a[1].length); //3
1차원 배열과 동일하게 분리하여 표현 가능하다.
int[][] a;
a = new int[][]{{1,2},{3,4,5}};
자료형[][] 참조변수명 = {{값,값},{값,값,값}};
//선언과 동시에 값을 대입하는 방식이다
int [][] a = {{1,2},{3,4,5}};
//분리해서 쓰는 경우는 안된다
//new가 없으면 분리가 안된다고 봐도 된다.
int[][] a = {{1,2},{3,4,5}};
for(int i=0; i<a.length; i++;{//a.length는 2다
for(int j=0; J<a[i].length; j++;{
//a[i].length는 a[0]의 길이를 물어보니까 2이다
System.out.println(a[i][j]);
//00,01,10,11,12 -> 1,2,3,4,5으로 출력
}
}int[][] a = {{1,2,}, {1,2,3}}; //1차원 배열 2개를 나타낸다 ->그래서 for문이 2번 실행된다
for(int[] m: a){//1차원 배열을 m에 대입해도 1차원배열
for (int n: m){//그러므로 1차원 배열에 대한 1차원배열을 n으로 실행한다
System.out.println(m);
}
}
: Java에서 가장 먼저 실행되는 함수
초기에 배웠던 public static void main(String[]) args{ ... }를 생각해보면
여기서 String[]은 스트링 배열인 것이다
main()메서드가 처음 실행될때 main메서드로 매개변수 전달이 가능
❗️정수와 실수가 아닌 문자열이다
❗️String + 숫자 = String
만약 정수나 실수로 바꾸고 싶다면?
문자열->정수 : Integer.parseInt(문자열);
문자열->실수 : Double.ParseDouble(문자열);
```java
public static void main(String[] args{
String a = ar[0]; //안녕하세요
String b = ar[1]; // 2
String c = ar[2]; // 0.5
int d = Integer.parseInt(b); //진짜 정수 2가 됨
double e = Double.parseDouble(e); // 진짜 실수가 됨
}
ㄴ
이처럼 main메서드도 Java 소스에서 맨먼저 살펴보는 앱폴더인 셈
인텔리제이로 예를 들자면,,,
1. run-> run configuration-> application으로 만들어준다
2. 이름 정하기-> main class 옆에 조그만 문서모양 클릭-> main으로 지정 -> 확인
3. 위에 플레이 버튼 누르면 정한 이름이 뜨면서 main 메서드가 실행된다
이클립스는 Arguments에 있다



뒤에서 자세하게 배우므로 이정도만
: 타입의 틀
CHAT GPT왈, In Java, a class is a blueprint or template for creating objects. It serves as a template that defines the properties and behaviors common to all objects of a certain type...
이와 같이 자바는 특정 타입의 속성값들을 정의하는 템플릿과 같다 = 틀!!
: 클래스 내에서 실현하거나 동작하는 속성집합 = 클래스의 인스턴스(객체가 발생하거나 실행되는 것)
An instance, in the context of programming and object-oriented programming (OOP), refers to a specific occurrence or realization of an object from a particular class. In other words, when you create an object from a class, you are creating an instance of that class.
-> 즉, 특정값을 설정할 수 있는 개체로 설명하고 있다.
: 문자열 저장 클래스 타입. 모든 문자열은 " "안에 표기한다
: 붕어빵 기계 틀(class)로 슈크림붕어빵, 팥붕어빵을 만들어내는것(object생성)
-> 좀 더 유추해보자면 class는 한 개, object는 여러개 생성가능
방법1) new 키워드를 사용한 객체 생성(배열에서 많이 보던거) = 인스턴스화
String 참조변수명 = new String("문자열");
String(" ") => 생성자라고 함
방법2) 직접적으로 문자열 리터럴 입력
String 참조변수명 = "문자열";
String 슈붕 = new String("맛있어");
String 슈붕 = 슈많이;
/*=는 대입하라는 의미이므로 슈많이를 슈붕에 대입
매우중요한 사실 슈많이는 참조하는 Stack 값이지 진짜인 heap값이 아니다*/
슈많이 = "맛있어요"; -> !!불가능하다 값을 바꿀수 없음!