1. 클래스
1) 개별 변수 관리의 한계:
다루어야 할 데이터가 늘어날 때마다 변수를 개별적으로 추가 선언해야 하므로 유지보수가 어렵다.
2) 배열 사용의 한계:
여러 개의 배열로 나누어 관리할 경우, 한 사람의 데이터가 여러 배열에 분산되어 수정·삭제 시 실수가 발생하기 쉽다.
위와 같은 문제들을 해결하기 위해 클래스를 사용한다.

클래스를 사용해, 학생이란 개념을 만들고, 학생 별로 이름, 나이, 학점을 관리한다.
Student <= 클래스 (관례상 대문자로 시작, 낙타표기법 사용)
name, age, grade <= 맴버 변수 or 필드
클래스가 "설계도" or "틀"이라고 한다면, 객체(인스턴스)는 설계도를 가지고 실제 메모리에 만들어진 실체를 객체(인스턴스)라고 함.

1) 객체 생성 (new): 메모리에 Student 클래스 기반의 새 인스턴스를 확보한다.
2) 참조값 반환: 생성된 객체에 접근할 수 있는 고유 메모리 주소값(예: x001)을 반환한다.
3) 참조값 보관: 변수 student1은 인스턴스 자체가 아니라 객체의 참조값(주소)을 저장한다.
4) 멤버 접근 (.): 점 연산자를 통해 참조값을 따라가 실제 객체의 필드 값을 읽거나 대입한다.
주의
변수 대입 시 객체 자체가 복사되는 것이 아니라, 오직 참조값(주소)만 복사되어 전달된다.
객체를 생성하는 코드 자체에는 아무런 이름이 없음.
생성한 객체에 접근할 수 있는 방법이 필요
=> 객체를 생성할 때 반환되는 참조값을 보관해야 함.
저장한 참조값을 통해서 실제 메모리에 존재하는 객체에 접근할 수 있음.
2. 기본형과 참조형
기본형 => 실제 사용하는 연산용 값
참조형 => 메모리 상의 객체/배열 위치값 (참조값/주소)
기본형 => int, long, double 등 (소문자 시작)
참조형 => 클래스, 배열 등 (주로 대문자 시작)
기본형 => 산술 연산 가능
참조형 => 직접 연산 불가
기본형 => 불가능
참조형 => 가능
항상 변수의 값을 복사해서 대입한다

1) 변수 대입
기본형 : 실제 값이 복사되므로, 한쪽의 값을 변경해도 다른 변수에 영향을 주지 않는다.
참조형: 참조값(주소)만 복사되므로, 두 변수가 동일한 메모리의 인스턴스를 가리킨다.
따라서 한쪽 변수를 통해 내부 멤버 변수를 수정하면 양쪽 모두 변경 사항이 반영된다.
3. 객체지향 프로그래밍
절차 지향은 절차를 지향 => 실행 순서를 중요하게 생각하는 방식 ("어떻게"를 중심으로 하는지)
객체 지향은 객체를 지향 => 객체를 중요하게 생각하는 방식 ("무엇을" 중심으로 하는지)
절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다.
반면 객체 지향에서는 데이터와 그 데이터
에 대한 행동(메서드)이 하나의 '객체' 안에 함께 포함되어 있다.
절차자향 프로그래밍의 한계는 데이터와 기능이 분리되어 있다는 점이다.
데이터가 있는 곳을 수정하면, 관련 기능이 있는 곳도 따로 수정을 해야하는 유지보수의 관점에서 관리 포인트가 2곳으로 늘어나는 단점이 존재한다.
=> 객체지향 프로그래밍의 등장

위 사진처럼 MusicPlayer클래스에 속성과 기능을 모두 정의
=> 데이터와 기능이 따로 분리되어 있지 않아 유지보수 관점에서 매우 효과적
이처럼 기능과 속성을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화 라고 한다

4. 생성자
1) 초기화 누락 방지: 객체 생성 후 필드 초기화 메서드를 별도로 호출하면, 호출을 깜빡했을 때 데이터가 비어 있는 유령 객체가 생길 위험이 있다.
2) 필수 제약 부여: 생성자를 도입하면 인스턴스를 만들 때 반드시 정의된 파라미터를 넘겨야 하므로 필수 데이터 입력을 강제할 수 있다.
인스턴스 자기 자신의 참조값(주소)을 가리킨다.
이 경우 멤버 변수보다 매개변수가 코드 블럭의 더 안쪽에 있기 때문에
매개변수가 우선순위를 가진다.
=> 멤버 변수에 접근하려면 앞에 this.을 붙여주면 됨

this는 생략 가능.
이 경우 변수를 찾을 때 가까운 지역변수를 먼저 찾고, 없으면 그 다음으로 멤버변수를 찾는다. (멤버변수도 없으면 오류뜸)
1) 생성자의 이름은 클래스와 같아야 한다. (첫 글자도 대문자)
2) 생성자는 반환타입이 없다.
3) 나머지는 메서드와 같음

