객체
- 우리 주변에 있는 모든 것으로, 프로그래밍의 대상(주체가 활용)
- 주체가 아닌 것
객체지향 프로그래밍: 주변의 많은 것들을 객체화해서 프로그래밍 하는 것
- 객체는 많을수록 좋음
- 주체의 쉬운 사용
- 자유로운 객체 교체
- 블록 형태의 모듈화
- 신뢰성 높은 프로그래밍
- 추가 / 수정 / 삭제 용이
- 재사용성 ↑
- 현실의 객체가 갖는 속성, 기능 👉 추상화 👉 클래스에 정의
- 클래스 👉 구체화 👉 객체(instance, object)가 됨
- 속성, 상태: 필드, 멤버 변수
- 동작: 멤버 메서드
- 추상화하는 과정: 프로그래밍
- 클래스: 객체의 설계도, 타입, 붕어빵 틀
- 직접 사용할 수 없고 객체를 만들기 위한 틀 제공
- 구체화하여 객체 생성. 객체는 메모리에 올려야 사용 가능
- 클래스는 객체를 정의해 놓은 설계도
- 객체는 클래스를 데이터 타입으로 메모리에 생성됨
자바의 메모리 구조
- class area: 클래스 원형 로딩
- Field 정보, Method 정보, 타입 정보, 상수 풀
- method stack: 메서드 실행 공간. thread 별 존재, 호출 순서대로 쌓임
- 메서드 프레임에 로컬변수도 쌓이는 구조
- 로컬변수는 선언된 영역을 벗어나면 삭제
- heap: 객체 저장 영역. thread에 의해 공유
변수
- 멤버변수: 클래스 변수, 인스턴스 변수
- 지역변수: 지역 변수, 파라미터
인스턴스 변수
- 클래스 영역 내 위치
- 객체 별 생성(heap)
- GC에 의해 관리
- 객체가 만들어질 때 객체 별로 생성
- 타입 별 기본값으로 초기화
- 객체 생성 후(메모리 적재) 객체 이름으로 접근
- 객체를 만들 때마다 객체 별로 생성 👉 객체마다 고유한 상태 유지
클래스 변수
- static 키워드
- 정적. 클래스 영역에 클래스 로딩 시 메모리 등록
- 개별 객체 생성과 무관
- 모든 객체가 공유
로컬 변수
- 명시적 초기화 필요
- 쓰레드별 스택에 생성
- 선언된 라인 실행 시 변수 생성
메서드: 동작을 프로그래밍화
클래스 멤버와 인스턴스 멤버간 참조와 호출
- 메모리에 있으면 호출 가능
- static member: 언제나 메모리에 있음
- instance member: 객체 생성 전에는 메모리에 없음
오버로딩: 파라미터의 순서, 타입, 개수가 달라야함
생성자
this.
- 참조 변수로 객체 자기 자신을 가리킴
- this를 통해 자기 자신의 멤버에 접근 가능(명시적 호출)
- 객체 참조이므로 static 영역에서는 사용 불가
this()
- 생성자의 가장 첫줄에 위치
- 다른 생성자 호출(오버로딩)