1차원 배열 : 변수를 하나의 묶음으로 다루는 것
2차원 배열 : 1차원 배열을 묶음으로 다루는 것
3차원 배열 : 2차원 배열을 묶음으로 다루는 것
1차원 배열의 묶음으로 배열 안에 다른 배열이 존재
2차원 배열은 할당된 공간마다 인덱스 번호 두 개 부여 (앞 번호는 행, 뒷 번호는 열 ([0][0]))

배열 선언
자료형[][] 배열명;
자료형 배열명[][];
자료형[] 배열명[];
배열 할당
자료형[][] 배열명 = new 자료형[행크기][열크기];
자료형 배열명[][] = new 자료형[행크기][열크기];
자료형[] 배열명[] = new 자료형[행크기][열크기];
ex)
int[][] arr = new int[3][4];
int arr[][] = new int[3][4];

arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 30;
arr[1][0] = 40;
arr[1][1] = 50;
arr[1][2] = 60;
int num = 10; // 배열 요소 초기화에 사용할 변수
// * 배열 길이
System.out.println(arr.length); // 2 (행 길이)
// arr이 참조하고 있는 2차원 배열의 행의 길이
System.out.println(arr[0].length); // 3 (열 길이)
// arr[0]이 참조하고 있는 배열의 길이 (메모리구조 pdf참고)
System.out.println(arr[1].length); // 3 (열 길이)
// arr[0]이 참조하고 있는 배열의 길이
for(int row = 0; row < arr.length; row++) { // 행 반복 (0,1)
for(int col = 0; col < arr[row].length; col++) { // 열 반복 (0,1,2)
arr[row][col] = num;
num += 10;
int[][] arr2 = {{10, 20, 30}, {40, 50, 60}}; // 2행 3열
// Arrays.toString(배열명) : 참조하고 있는 1차원 배열의 값을 문자열로 반환 (1행까지만 보여줌)
System.out.println(Arrays.toString(arr));
// Arrays.deepToString(배열명)
// : 참조하고 있는 배열의 실제 데이터가 나오는 부분까지 파고 들어가서
// 모든 값을 문자열로 반
System.out.println(Arrays.deepToString(arr));
System.out.println(Arrays.deepToString(arr2));
2차원 배열 생성 시 마지막 배열 차수(열)를 지정하지 않고 -> ([] 빈공간으로)
나중에 서로 크기가 다른 1차원 배열을 생성하여 참조하는 배열
char[][] arr = new char[4][];
// char 2차원 배열 생성 시 행 부분만 생성
arr[0] = new char[3]; // new char[4] -> 0행에 3열짜리 1차원 배열을 생성하여 주소값 저장
arr[1] = new char[4]; // 1행에 4열짜리 1차원 배열을 생성하여 주소값 저장
arr[2] = new char[5]; // 2행에 5열짜리 1차원 배열을 생성하여 주소값 저장
arr[3] = new char[2]; // 3행에 2열짜리 1차원 배열을 생성하여 주소값 저장
char ch = 'a';
for(int row = 0; row < arr.length; row++) { // arr.length = 4
for(int col = 0; col < arr[row].length; col++) {
arr[row][col] = ch++;
}
}
System.out.println(Arrays.deepToString(arr));
}
객체 (Object : 객체, 물건) : 독립적으로 각각 구분해서 인식할 수 있는 모든 것
키보드, 김치, 옆집아저씨, 나 미세먼지, 모래한알, 판소리,
무형문화제 (실체가 없어도 객체로 인정)
지향 : 어떤 것을 목표로 함
객체 지향 : 독립적으로 각각 구분해서 인식할 수 있도록 하는 것을 목표로 한다 + 코딩방식
ex) 내(객체)가 문(객체)을 열었다(사건) -> 상호작용
현실에서 객체(Object)란?
자신의 속성(값, data)과 기능(동작, 행동)이 다른 것들과 구분되어 식별 가능한 것
속성 : 이름, 나이, 키, 몸무게, 생년월일 등 명사
기능 : 밥을 먹는다, 잠을 잔다, 출근 한다, 퇴근 한다 등 동사
객체 지향 언어란?
현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며,
발생하는 모든 사건들은 객체간의 상호작용이다.
이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.
자바에서 객체(Object)란?
클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것

== 알아두기==
MVC 패턴 - => 애플리케이션의 역할을 세가지로 분리하는 설계 패턴
Model - 프로그램 로직과 관련되어 있는 데이터를 저장하는 용도 + 비즈니스 로직 (DB, 서비스, 객체)
vo( Value Obect) : 값 저장용 객체를 만들기 귀한 클래스를 모아두는 패키지
View - 사용자에게 보여지는 화면 (UI - HTML, JSP, Thymeleaf, React)
Controller - 사용자의 요청을 받고, 모델과 뷰를 연결하는 역할 (응답)
Service : 특정 기능(비즈니스 로직)을 제공하는 패키지
(비밀번호 -> 암호화 / 파일 -> 유효한 파일 걸러내는 작업)
===========
캡슐화 : 외부로부터 보호하기 위함
상속 : 공통된 코드만 작성
ex) 김아빠 -> 김길동, 김춘자, 김삼순 -> 자녀 김씨를 없애고 이름만
다형성 : 다양한 형태를 지니는 성질
ex) 메타몽, 김아빠가 길동이 될 수 있음...?
추상화 : 공통적으로 가지고 있는 속성
객체의 특성(속성, 기능)에 대한 정의를 한 것
ex) 제품의 설계도, 빵 틀
속성 == 값 == data
값을 저장하기 위한 변수 선언
-> 국민이라면 공통적으로 가지고 있는 속성만 작성 (추상화를 해야함)
ex) 이름, 성별, 나이, 주민번호, 주소, 전화번호
필드 == 필드변수 == 멤버변수

People p1 = new People();
People p1 : People 객체의 주소를 저장하여 참조하는 변수 p1(== 참조변수)
new People() : 새로운 People 객체를 Heap 영역에 생성
* 클래스 이름이 자료형처럼 사용된다 *
== 그래서 클래스를 "사용자 정의 자료형" 이라고 부른다!
추상화(abstraction), 캡슐화(encapsulation)이 적용되어야 함
프로그램에서 필요한 공통점을 추출하고, 불필요한 부분을 제거하는 과정
ex) 국민 한 사람의 속성



데이터(속성)와 기능을 하나로 묶어서 관리하는 기법
데이터의 직접적인 접근을 제한하는 것이 원칙이다
-> 직접접근 못하기 때문에 클래스 내부에서 간접접근 방법을 제공하는
기능(메서드)을 작성해둔다
-> getter / setter
=> 추상화를 통해서 정리된 속성과 기능을 하나로 묶고,
속성(데이터)의 직접 접근 방지를 하는 것.
이로 인해 부가적으로 정보 은닉 효과가 발생함.

*데이터 직접접근 제한
public (공공의) -> private (사적인, 개인적인) 변경

p1.name = "홍길동";
p1.gender = '남';
p1.pNum = "123456-1234567";
System.out.println("p1의 name : " + p1.name);
System.out.println("p1의 gender : " + p1.gender);
System.out.println("p1의 pNum : " + p1.pNum);
[접근제한자] 반환명 메서드명(){}
public String getpNum() { // pNum 변수의 값을 호출한 쪽으로 반환하게 해주는 기능
return pNum;
// return 값/변수; : 현재 메서드를 종료하고
// 값/변수 가지고 호출한 쪽으로 되돌아감
}
public void setpNum(String pNum) {
this.pNum = pNum;
}
↓
p1.setpNum("123456-1234567");
System.out.println(p1.getpNum());
/* getter() : 반환형이 무조건 있음
getter는 필드에 작성된 변수값을 호출한 쪽으로 되돌려주는 것
변수는 자료형이 있을 것
그 변수를 되돌려준다면 당연히 반환형도 존재할 것!

getter/setter 단축키!!
"미리 알아두기!!"
메서드(기능) 형태인 getter/setter를 이용하면 본인이 원하는 기능을 추가할 수 있음
age가 0보다 작을 때 예외 발생시키기
age가 0보다 클 때 속성에 전달받은 값 세팅하기
if(age > 0) {
this.age = age;
} else {
throw new IllegalArgumentException("음수는 안됨");
// IllegalArgumentException
// 메서드에 전달된 인자가(매개변수)유효하지 않을 때 발생하는 예외
public class Person {
private String name; // 1. private 변수 선언
// 3. Getter 메서드 (값 읽기)
public String getName() {
return name;
}
// 2. Setter 메서드 (값 저장)
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Person p1 = new Person(); // 객체 생성
p1.setName("홍길동"); // 4. Setter로 값 저장
System.out.println(p1.getName()); // 5. Getter로 값 가져와 출력
}
}