Java 인스턴스화(instantiate) 개념잡기
클래스
데이터테이블과 유사개념
비슷한 데이터들을 하나의 묶음으로 만든 것
묶음으로 프로그래밍- 객체지향 프로그래밍
묶음(객체)=상태와 동작
클래스를 만드는 부분과 = 건물의 설계도, 필드와 메소드가 포함됨
클래스를 이용하는 부분이 있다. =그 설계도를 바탕으로 실제로 건물을 짓고 사용하는 과정, 인스턴스화 하는부분
데이터베이스와 차이
데이터베이스는 데이터를 저장, 관리하는 시스템
테이블(레코드, 컬럼) 형식으로 데이터를 구조화하여 저장
테이블간 외래키를 이용 (RDMS)
클래스는 객체를 생성하기 위한 설계도
속성과 메서드를 정의하며, 이를 통해 특정 유형의 객체를 생성
상속을 통해 객체 지향적인 관계 형성 (OOP)
인스턴스
클래스(Class)의 정의를 기반으로 메모리상에 할당된 구체적인 객체
ex- Person이라는 클래스가 있다면 "홍길동" 이라는 이름을 가진 person1의 인스턴스가 생성될 수 있다.
new키워드를 사용하여 heap메모리에 할당 된다.
Person person1 = new Person();
person1.name="홍길동";
person1.age=30
각 인스턴스는 고유한 상태와 행동을 가지며, 클래스에서 정의된 속성과 메서드를 통해 구현된다.
- 고유성: Person 클래스에 생성된 여러 인스턴스는 각각 다른 이름과 나이를 가질 수 있다.
- 메서드 호출: 인스턴스를 통해 클래스에 정의된 메서드를 호출하여 특정 행동을 수행할 수 있다.
예를들어 person1.walk()와 같은 호출로 walk 메서드를 실행할 수 있다. - 객체와의 관계: 객체와 인스턴스는 얼핏보면 같아보이지만,
객체는 넓은 개념이고, 인스턴스는 특정 클래스에 생성된 객체를 강조하는데 사용된다.
객체
new()로 생성한 heap 메모리에 할당된 person1(name,age)
자바의 객체(person1)는 필드(name,age)를 통해 데이터를 보유하고, DB의 테이블은 컬럼을 통해 데이터를 보유
변수
person1
Person클래스의 인스턴스를 가리키는 참조변수
main 메서드 내에서 선언되었으므로 로컬변수
stack메모리에 할당되어있으며, 힙 메모리에 위치한 실제 객체에 대한 주소를 저장
name,age
클래스의 속성을 정의하는 멤버변수(=필드)
제품 정보 담을 클래스 만들기
프로덕트의 내용을 저장하는 클래스 Product 와
메인함수를 동작시키는 클래스 ClassTest 생성
RAM은 code, data, stack, heap으로 나눠진다.
- code - 실행할 프로그램의 코드가 저장됨
- data - 프로그램의 전역 변수와 정적 변수(static)가 저장되는 영역, 프로그램이 시작될때 할당되며 종료할 때 소멸
- stack - 함수 호출 시 생성되는 지역변수, 매개변수가 저장되는 영역, 함수호출이 완료되면 데이터 소멸
- heap - 사용자가 직접 메모리를 동적으로 할당, 해제할 수 있는 영역
malloc() 또는 new 연산자로 메모리 할당
free() 또는 delete 연산자로 해제
stack과 heap을 주목하자.
Stack메모리와 Heap메모리
Stack 메모리 | Heap 메모리 |
정적 할당 메모리영역 기본 데이터타입의 값 저장 (boolean, char, short, int, long, float, double) Heap 영역에 생성된 객체의 참조 값을 저장함 각 스레드마다 별도의 Stack이 할당됨 메소드 호출 시 생성되는 지역변수와 매개변수 저장 후입선출(LIFO)방식 동작 컴파일 시 크기가 결정됨. 정해진 크기를 초과하면 StackOverflowError 발생 빠른엑세스, 짧은 생명주기의 데이터에 적합 |
동적 할당 메모리영역 모든 객체(Object)타입의 데이터가 저장 String, Integer, ArrayList 등의 참조형 타입 여러 스레드가 공유하는 하나의 Heap 영역만 존재 객체 생명주기가 길고 크기가 큰 데이터를 저장 메인함수 종료시 stack 에 생성된 부분은 삭제되지만 heap 부분은 남아있음 = garbage 생성 Java는 이런 쓰레기 데이터를 Garbage Collecter를 통해 주기적으로 삭제함 동적메모리 할당과 객체의 장기저장에 사용됨 |
CPU의 동작 과정
public class ClassTest {
public static void main(String[] args) {
// 아이디는 1, 이름은 컴퓨터 인 데이터를 만들자 = 객체생성
Product p1 = new Product();
p1.id = 1;
p1.name = "컴퓨터";
1) main()에서 시작 in Stack
public static void main(String[] args) {
2) Product 클래스에 p1 객체 메모리 할당 in Heap
Product p1 = new Product();
new Product() 객체 저장공간 생성
Product 라는 클래스 정보를 찾기위해 scr Product의 class로 점프
public class Product {
// 제품 아이디
int id;
// 제품명
String name;
3) Product의 생성자 호출, id, name 필드 초기화, 객체 생성 in Heap
p1.id = 1;
p1.name = "컴퓨터";
4) 주소 반환: 생성된 객체의 메모리 주소가 변수에 저장 in stack
p1.id = 1;
p1. | id | =1; |
(참조변수) | (멤버변수, 필드) | 데이터 |
* CPU의 작업 흐름과 어떤 변수가 어느 메모리에 위치하는지 이해하도록하자.