Java Syntax - (6)2차원[다차원] 배열

가빈·2023년 12월 6일
post-thumbnail

2차원 배열은 1차원 배열을 그대로 이어받아 개념은 쉽게 알지만 방법이 매우 어렵다!
하지만 어느 것도 거를 타선없이 중요한 방법들이다..

2차원(다차원) 배열의 선언

특징) 1차원과 마찬가지로 동일한 자료형만 가능하고 어떤 자료형인지 알아야한다

  • 자료형[ ][ ] 변수명
  • 자료형 변수명[ ][ ]
  • 자료형[ ] 변수명[ ]

*일관성을 위해서 첫번째 방식으로 선언할 것을 권장


2차원(정방행렬) 배열

: 가로(행)과 세로(열)로 정렬된 배열
→ 2차원에서는 index를 두개 사용한다 int[][]a;

⭐️메모리 저장 방식

메모리는 1차원으로만 저장가능하다 → 2차원(행과 열)을 1차원배열(각각의 행)으로 나누어서 저장한 다.
int[][] -> int[]1차원배열을 1차원 배열속으로...

a[ 100 ]100[200번지][300번지] 200번지[1,2,3] 300번지[4,5,6]
  1. int [ ]로 일단 1차원 배열의 행을 만든다
    → 100번지에 a0(200번지),a[1](1번째 행)(300번지)

  2. 각 행에 열들을 나타낸다
    → 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

⭐️⭐️2차원 배열의 객체 생성—정방행렬

방법 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;
..

방법 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 넣어라
//직접적으로 표현하는 방법이 되겠다

방법 3) 자료형과 대입할 값만 입력

자료형[][]참조변수명 = 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}};

방법 4) 대입 값만 입력

자료형[][] 참조변수명 = {{,,},{,,}};
//선언과 동시에 값을 대입하는 방식이다

int [][] a = {{1,2,3},{4,5,6}};
//분리해서 쓰는 경우는 안된다
//new가 없으면 분리가 안된다고 봐도 된다.

2차원(비정방행렬) 배열

: 행마다 열의 개수가 서로 다른 2차원 행렬

012
0000102
11011
220

방법 1) 행 성분만 생성, 각 행에 열성분 생성 (=정방행렬의 방법2)

자료형[][] 참조변수명 = 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
//출력에서도 다른 열의 개수임을 확인할 수 있다.

방법 2) 자료형과 대입할 값만 입력(=정방행렬 방법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}};

방법 3) 대입 값만 입력(=정방행렬의 방법4)

자료형[][] 참조변수명 = {{,},{,,}};
//선언과 동시에 값을 대입하는 방식이다

int [][] a = {{1,2},{3,4,5}};
//분리해서 쓰는 경우는 안된다
//new가 없으면 분리가 안된다고 봐도 된다.

2차원 배열의 출력

  • for 반복문을 이용
    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으로 출력
    		}
    }
  • ⭐️for-each 반복문을 이용
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);
    }
}

배열에서의 main() method 매개변수

: 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함수에 인덱스로 넣어놓고 인덱스로 꺼내면서 쓴다

⭐️⭐️⭐️main()는 핸드폰의 앱폴더 매우 유사!!!! 우리가 핸드폰 키자마자 여는게 오늘은 뭐볼까~~?하고 앱폴더이기 때문

이처럼 main메서드도 Java 소스에서 맨먼저 살펴보는 앱폴더인 셈

main 출력

인텔리제이로 예를 들자면,,,
1. run-> run configuration-> application으로 만들어준다
2. 이름 정하기-> main class 옆에 조그만 문서모양 클릭-> main으로 지정 -> 확인
3. 위에 플레이 버튼 누르면 정한 이름이 뜨면서 main 메서드가 실행된다

이클립스는 Arguments에 있다


클래스(Class)와 객체(Object)

뒤에서 자세하게 배우므로 이정도만

클래스

: 타입의 틀

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.
-> 즉, 특정값을 설정할 수 있는 개체로 설명하고 있다.


String 참조자료형

String 클래스

: 문자열 저장 클래스 타입. 모든 문자열은 " "안에 표기한다

객체를 생성한다는 것?

: 붕어빵 기계 틀(class)로 슈크림붕어빵, 팥붕어빵을 만들어내는것(object생성)
-> 좀 더 유추해보자면 class는 한 개, object는 여러개 생성가능

객체 생성 방법

방법1) new 키워드를 사용한 객체 생성(배열에서 많이 보던거) = 인스턴스화
String 참조변수명 = new String("문자열");
String(" ") => 생성자라고 함

방법2) 직접적으로 문자열 리터럴 입력
String 참조변수명 = "문자열";

⭐️String 클래스만의 독특한 특징!

  • 객체 내 값을 변경이 안된다 -> 생성하려면 새로 생성해야함
     String 슈붕 = new String("맛있어");
     String 슈붕 = 슈많이;
     /*=는 대입하라는 의미이므로 슈많이를 슈붕에 대입
     매우중요한 사실 슈많이는 참조하는 Stack 값이지 진짜인 heap값이 아니다*/
     
    슈많이 = "맛있어요"; -> !!불가능하다 값을 바꿀수 없음!
  • 리터럴을 바로 입력한 데이터가 문자열이 같을 때, 하나의 객체를 공유한다
profile
지금부터 시작!

0개의 댓글