너무 자바 관련 글만 올리는거 같아서.. MSA에 대해 공부하고, 개발하려고 생각하는 부분들도 조만간 올려봐야겠다.
// 💡 사용할 자료형 뒤에 []를 붙여 선언
char[] yutnori = {'도', '개', '걸', '윷', '모'};
// 💡 length : 배열의 길이 반환
int length = yutnori.length;
// 💡 [] 안에 인덱스 정수를 넣어 접근
// ⭐ 0부터 시작
char first = yutnori[0];
char last = yutnori[yutnori.length - 1];
// 💡 초기화하지 않고 일단 선언하기
// ⭐ 어떤 값으로 초기화되는지 확인
boolean[] boolAry = new boolean[3];
int[] intAry = new int[3];
double[] dblAry = new double[3];
char[] chrAry = new char[3]; // 아래 확인
String[] strAry = new String[3];
// 아스키 코드의 0번 글자. 문자열의 끝을 표시하는데 사용
char NUL = chrAry[0];
// 디버깅해봐서 확인하시길.
// 다음과 같이 원하는 위치의 값 변경
intAry[0] = 123;
intAry[1] = 456;
intAry[2] = 789;

원시 자료형의 경우에는 값이 담기지만, 참조자료형의 경우에는 그 값이 존재하는 주소가 담긴다.
// 초기화 블록을 사용한 선언 동시 초기화
// 두 가지 방법 사용 가능
char[] dirAry1 = {'동', '서', '남', '북'};
char[] dirAry2 = new char [] {'동', '서', '남', '북'};
char[] dirAry3;
// 선언만 먼저 한 상태에서는 두 번째 방법만 가능
dirAry3 = {'동', '서', '남', '북'}; // ⚠️ 불가
dirAry3 = new char[] {'동', '서', '남', '북'};
int [] intAry = {1, 2, 3, 4, 5};
// ⚠️ 런다임 에러: ArrayIndexOutOfBoundsException
int outOfAry = intAry[intAry.length];
// 이중 배열
boolean[][] dblBoolAry = new boolean[3][3];
int[][] dblIntAry = new int[][] {
// ⭐️ 요소 배열의 크기가 다를 수 있음
{1, 2, 3},
{4, 5},
{6, 7, 8, 9},
};
// 삼중 배열
char[][][] trpChrAry = {
{{'자', '축'}, {'인', '묘'}},
{{'진', '사'}, {'오', '미'}},
{{'신', '유'}, {'술', '해'}},
};
int int1 = dblIntAry[0][1];
int int2 = dblIntAry[2][3];
int[] intAry = dblIntAry[1];
char[][] dblChrAry = trpChrAry[0];
char[] chrAry = dblChrAry[0];
char chr1 = chrAry[1];
char chr2 = trpChrAry[2][0][1];
이 부분은 특별히 더 중요해서 중요표시로 체크해두었다.
// 🧪 디버깅해서 결과를 볼 것
// ⭐ 원시 자료형은 값 자체를 복사 - 별개의 값이 됨
boolean bool1 = true;
boolean bool2 = false;
bool2 = bool1; // 🔴
bool1 = false;
int int1 = 1;
int int2 = 2;
int2 = int1;
int2 = 3;
char ch1 = 'A';
char ch2 = 'B';
ch2 = ch1;
ch1 = '가';
// ⭐ 참조 자료형은 값 주머니의 주소를 복사
// 두 변수가 같은 주머니를 가리키게 됨
boolean[] boolAry1 = { true, true, true };
boolean[] boolAry2 = { false, false, false };
boolAry2 = boolAry1; // 🔴
boolAry1[0] = false;
int[] intAry1 = { 1, 2, 3 };
int[] intAry2 = { 4, 5 };
intAry2 = intAry1;
intAry2[1] = 100;
char[] chAry1 = { 'A', 'B', 'C' };
char[] chAry2 = { 'a', 'b', 'c', 'd', 'e' };
chAry2 = chAry1;
chAry1[2] = '다';
참조자료형에서는 원본을 바꾸면 대입한 값의 값도 바뀌고, 대입한 값의 값을 바꾸면 원본도 바뀐다. 쉽게 말하면 한쪽에다가 다른쪽의 값을 복사했을 때, 그 값을 한쪽에서 바꾸면 다른쪽에도 적용이 된다는 뜻이다. 그럼 이제 코드안에서 일어나는 일을 그림으로 살펴보자.

위 그림에서 보면 처음에 int1과 int2변수를 선언 후 초기화 한 다음에 int1의 값을 int2에 대입한 것이다. 여기서 int2의 값을 3으로 바꿔주면 int2의 값만 변경되고 int1의 값에는 변동이 없다.
위와 같은 원리는 원시자료형에만 해당된다. 참조자료형인 배열에서는 다르다.

위의 그림을 보면 각각 다른 배열 intAry1과 intAry2를 선언 후 초기화해주었다. 이 두 변수는 각각 메모리 상에 존재하는 배열을 가리키고 있는 상태이다. 이 다음 intAry2에 intAry1을 대입하였다. 이렇게 되면 intAry2가 가리키는 곳이 intAry1이 가리키는 곳과 같게 된다. 왜냐하면 이 두 변수에 들어있는 값은 값 자체가 아니라 배열이 존재하는 주소이기 때문이다.
따라서 결과적으로 intAry1의 두번째 값을 100으로 바꾸면, intAry1의 두번째 값과 intAry2의 두번째 값 모두 바뀌게 된다. 두 변수가 모두 한 곳을 가리키고 있기 때문이다.
// ⭐️ 문자열은 객체(참조형)지만 원시형처럼 다뤄짐
String str1 = "코인 함";
String str2 = "관심 없음";
str2 = str1; // 🔴
str1 = "고점에 익절";
// 상수 배열의 경우
final int[] NUMBERS = {1, 2, 3, 4, 5};
// ⚠️ 다른 배열을 할당하는 것은 불가
NUMBERS = new int[] {2, 3, 4, 5, 6};
// ⭐️ 배열의 요소를 바꾸는 것은 가능
NUMBERS[0] = 11;
String[] strings = {"한놈", "두시기", "석삼", "너구리"};
// 💡 join 정적 메소드 - 문자열(정확히는 CharSequence)의 배열을 하나로 이어붙임
// 첫 번째 인자를 각 사이에 삽입
String join1 = String.join(", ", strings); // join1 : "한놈, 두시기, 석삼, 너구리"
String join2 = String.join("-", strings); // join2 : "한놈-두시기-석삼-너구리"
String join3 = String.join(" 그리고 ", strings); // join3 : "한놈 그리고 두시기 그리고 석삼 그리고 너구리"
String join4 = String.join("", strings); // join4 : "한놈두시기석삼너구리"