1.9.2 Class에서 class를 학습

yeonseong Jo·2023년 4월 24일
0

SEB_BE_45

목록 보기
12/47
post-thumbnail

저번에 말했듯이 class는 붕어빵 틀 혹은 레시피라고 할 수 있다.
오늘은 이 레시피에 대해 더 자세히 알아보고자 한다.

객체 != instance

어떤 한 대상을 추상화하여 코드로 짜놓은 것을 class라고 할 수 있다.
이 class를 바탕으로 생성된 객체를 instance라고 하는데,
엄밀히 말하면 객체와 instance는 다르다.
소갈비찜 레시피를 통해 4개의 소갈비를 만들었다고 예를 들자면,

레시피는 class,
'소갈비찜 레시피'에서 '소갈비'를 객체,
만들어진 4개의 소갈비를 instance

라고 이해했는데,
구글링을 해봤을 때

class의 타입으로 "선언"되었을 때 객체라하고,
해당 객체가 메모리에 할당되어 실제 사용될 때
instance라 한다.

출처

라는 말도 있고,
대부분은 내가 이해한 것 처럼
객체는 class의 원본이고,
class를 통해 찍어낸 것을 instance
라고 하는 것 같다.
둘 다 틀린말은 아닌것 같으나, 출처에서 나온 말이
소프트웨어 관점에 더 적합한거 같긴하다.

객체의 메모리 할당

처럼 객체를 메모리에 할당되었을 때 instance라고 한다.
이 객체가 instance로 되는 과정을 오늘 라이브 강의에서 배웠는데,
이 메모리 할당 방법은 다른 라이브러리를 import 하고
사용할 때에도 똑같이 적용할 거라 생각되기에,
(또한 효율적인 메모리 할당을 위해?)
다시 한번 복습하고자 한다.

이렇게

class Car{
	...
}

라는 class가 존재할 때,
보통 instance 생성은 이렇게

Car audi = new Car(...);
 1   2      3   4

이뤄진다.

  1. class로 메모리
  2. 참조변수
  3. new 연산자
  4. 생성자
라 할때, 위의 JVM 메모리 구조 중 Runtime Data Area에서
  • 1은 "어플리케이션 실행 시" Method Area에 할당,
  • 2는 생성할 때, Stack Area에 할당,
  • 3을 통해 Heap Area에 할당할 메모리를 확보해 놓고,
  • 4를 통해 Heap Area에 객체를 할당하며,
    할당된 메모리의 주소값을 통해 참조변수와 연결된다.

Static

java의 객체지향 프로그래밍을 학습하면서 가장 헷갈렸던 것이
이 static 키워드인 것 같다.
class member의 접근 제어자에서도 그렇고,
중첩 클래스에서 static inner class와 그냥 inner class도 그랬다.
(사실 이제는 static 키워드는 문제가 없지만,
나머지 접근 제어자에 대한 이해가 좀 더 필요할 것 같다.)

지금은 더이상 헷갈리지 말자는 뜻에서
정리하려 한다.
class안에서 static member의 경우
객체를 instance화 하지 않더라도, 각 member를 불러올 수 있다.

class Human{
	// static field
	static int age=20;
    static String name="John";
    // none static field
    int noneStatic_age=18;
    String noneStatic_name="Wick";
    
    // static method
    static void hello(){
    	System.out.printf(
        "안녕하세요. 저는 %d살 %s입니다.\n", 
        age, name
        );
    }
    void noneStaticHello(){
    	System.out.printf(
        "Hi. I'm %d old and %s.\n", 
        noneStatic_age, noneStatic_name
        ); 
    }
}

이렇게 class를 만들었을 때,
field member를 print했을 때,

print(Human.age);             
// 20
print(Human.name);            
// John
print(Human.noneStatic_age);  
// err
print(Human.noneStatic_name); 
// err

method member를 호출 했을 때,

Human.hello();
// 안녕하세요. 저는 20살 John입니다.
Human.noneStaticHello(); 
// err

이렇게 될 것이다.

static member의 메모리 할당?

이렇듯 static은 고정된(?)의 의미로
이 글을 쓰고 있는 바로 지금 예상해 보자면,
static member는 JVM 메모리 영역에서
Method Area에 할당 될 것이라 생각이 된다.
.
.
.

찾아본 결과

stackoverflow와 java8의 realease note(?)에 의하면,
java8 이전에는 JVM에 PermGen영역이라고,
static member나 class등의 정보를 저장했다고 한다.
하지만 java8 이후에는 그냥 힙 메모리에 저장한다고 한다.
참고

profile
뒤(back)끝(end)있는 개발자

0개의 댓글