공부일지/Java

[JAVA] 6/20 배운거 클래스

박수빈98 2024. 6. 20. 16:46

객체지향의 추상화를 구현시켜 주는 개념

미술에서 추상화란 점, 선, 면으로 대상을 표현하는 것이라고 한다.

클래스는 객체지향의 기본단위인 객체를 생성하기 위한 설계도이다.

 

 

객체지향의 추상화도 비슷한 의미 같다. 현실 세계의 사물은 매우 방대한 정보를 가진다.

이 정보를 모두 입력하기란 불가능 할 것이다. 이걸 추상화해 단순하게 표현한 것이라고 이해했다.

단순화한다는 면에서 모델링과도 일맥상통하는 것 같다.

 

클래스의 멤버 변수(중 인스턴스 변수만)는 인스턴스 생성 시 초기화된다.

멤버 변수에는 인스턴스 변수와 클래스 변수가 있다.

인스턴스 변수는 인스턴스 마다 각각 가지고 있다. 인스턴스 생성 시 초기화

클래스 변수는 static으로 클래스가 로딩될 때 메모리에 올라가며 모든 인스턴스가 공유한다. 로딩 시 초기화

하나의 클래스 파일에는 하나의 public 클래스만 가능하다. 파일명과 같은 클래스가

 

인스턴스 변수는 객체 생성과 함께 힙영역에 저장된다.

 

클래스의 클래스 변수(정적변수), 메서드(정적, 인스턴스) 모두 메서드 영역에 저장

정적이든 인스턴스든 메서드는 클래스 파일(.java에서 javac로. class)이 JVM에 처음 참조 될 때 클래스가 메모리에 로드된다.

이때 모든 메서드가 메서드 영역에 저장됨

 

 

int [2][]는 되고 int [][5]는 안 되는 이유 1) 경우 [null, null] 차후에 배열의 주소값을 넣어 줄 수 있다.

C에서는 그냥 연속된 메모리인 1차원 배열을 행과 열로 나눈 거에 불가한데 

java는 2차원 배열은 배열의 배열이라는 것 그렇기에 어떤 배열의 길이도 가능하다. 연속적일 필요가 없다.

 

String을 리터럴로 생성하면 해당 객체는 문자열 상수 풀에 저장 문자열 상수 풀은 힙메모리의 일부이지만 특별히 관리된다.

(런타임 상수 풀은 메소드 영역에 존재 Class Constant pool(컴파일 시간에 생성됨)에서 읽어온 상수 값, 클래스 메타데이터 저장(해당 클래스가 로드 될 때 런터임 상수 풀에 즉 런타임에 올라온다.))

그렇기에 가비지 컬렉션에 의해 회수되지 않는다.

만약 동일하게 리터럴로 문자열 생성 시 문자열 상수 풀에서 동일한 객체가 있는지 확인하고 있다면 해당 주소로 반환하고 없을 경우 상수 풀에 추가한다.

new를 통해 객체 생성 시는 상수풀에서 확인하지 않고 힙 메모리에 생성

참조가 사라질 경우 가비지 컬렉션이 회수해 버림