Class.

DeadWhale·2023년 2월 9일
0

JAVA

목록 보기
2/10

자바의 클래스

자바에서 클래스는 객체를 정의하는 탬플릿이다
객체는 상태( State ) 와 행위( behavior )를 가지는데
클래스는 class 키워드를 사용해 선언한다.
객체는 new 키워드를 이용해 생성한다

클래스와 객체는 다른 것이다.

클래스는 객체를 정의하는 탬플릿이라는 말이 핵심이다.

가장 유명한 예시인 Car Class는

자동차 라는 걔념 자체는 Class

투싼이라는 차 자체는 Object ( 객체 )라고 표현한다.

왜 객체와 클래스로 구분할까?

❕ 만약 투산 , 롤스로이스 , 폴스타와 같은 객체가 필요할 경우 매번 새로운 코드를 작성하는 것은 매우 불편하고 비효율적인 일이다.

대표적으로 공통적인 요소들을 선언해 생성자를 통해 효율적으로 사용 할 수 있다.

	여기까지가 책에서 간단하게 설명한 객체와 클래스 였다. 
    위의 내용들은 여러번 보고 알고 있었지만 
    
    이번에 다시 읽으면서 내가 궁금했던 점을 찾아보기로 했다.
    
    객체가 생성될 때. heap 영역에 할당된다는건 들었는데 
    
    그렇다면 객체가 생성될 때. 알아내야하는  클래스의  정보는 어디에 저장될까?	
   	으로 질문을 시작해 더 깊게 알고싶어 찾아보게 되었다.

왜 효율적일가?

❕ 클래스는 생성 시 클래스의 정의가 컴파일되면서 클래스의 변수와 메서드 , 상태와 행위가 JVM의 메모리 구조 중 Static 영역에 올라가게 된다 .

Static 영역에 올라가게 되면 JVM의 생명주기에 따라 계속 유지되고 프로그램이 유지되는 동안은 메모리에 남아있다. 그래서 Static 영역에 정의된 클래스는 프로그램의 어느 위치에서든 접근이 가능한다

클래스가 해당 접근을 허용할지 말지는 구현의 차이

  • Static 클래스는 Static 영역에 올라가기 때문에 . 같은 클래스에서 생성된 객체들이 공유하게 되는 변수와 메서드는 메모리 사용이 적어지기 때문에 메모리 효율이 증가한다.
    • 일단 컴파일시 static 에 올라가는 Class의 정보는
      static변수 , static메소드,초기화 블록(initializer block)이다
      메소드와 변수는 클래스 레벨에서 정의가 되있기 때문에.
      객체의 생성 없이 클래스의 이름으로 접근할 수 있다.
      - 예)Thread.sleep() 과 같은 스태틱 클래스들
    • Static 영역은 Method Area 내부에 “논리적”으로

  • 위에서 말한 것 처럼 클래스와 메서드가 정의된 탬플릿이라 같은 클래스로 선언된 객체들은 모두 같은 기능을 (+확장) 해 코드의 재사용성이 증가한다.

  • 코드의 가독성이 증가한다.

Static 클래스들이 올라가는 Static 영역은 Method Area에 속한다
물리적으로 static 영역이 나눠진게 아닌 Method Area 내부에 논리적으로 구분된 영역이다
참조 : Namjun님 블로그 , cho님 블로그

클래스의 정보는 Method Area에 올라간다

❕ Method Area에는 클래스의 정의,상수,스태틱변수,메소드등을 담는 전역 영역이다 객체를 생성할떄 이 영역의 클래스 정보를 활용한다. 모든 쓰레드가 공유하는 영역이다.
나는 static Area가 heap 과 동등하게 분리된 영역인줄 알았는데
Method Area 내부에 논리적으로 분리된 영역이였다.

Method Area의 클래스 정보를 참조해 객체를 생성할때 Stack , heap 에 값이 할당된다.

그렇다면

Stack 영역에 올라가는 정보는?

❕ Stack이 할당되는 순간은 메서드가 호출될때 할당되는 영역이다.
ex ) 프로그램이 동작 중, 로그인을 시도해 로그인메소드가 호출될때.

Class class = new Class();
class.method();  //이 때 

호출되면 메소드의 지역 변수와 객체의 Reference를 의미한다.
우선적으로 Heap 영역에 객체의 데이터를 올려두고
그 중 Reference(포인터 같은거)가 Stack 에 할당되게 된다 ( Reference + 지역변수 )

예외적으로 primitve 타입은 데이터 자체가 Stack에 저장된다.

여기가 중요한것 같은데 스레드는 하나의 Stack 영역을 할당 받는다
이부분은 나중에 Thread 에 대해 공부할 때 더 많이 찾아봐야겟다.




그렇다면 heap에 올라가는 객체의 정보는 뭐여?

❕ heap이 할당되는 순간은 프로그램이 실행 중에 생성된 객체가 저장되는 영역이다.
new 연산자나 주입을 받으며 새로운 객체가 생성될때 메모리가 할당된다.

Class class = new Class();
이 순간 heap 영역에 할당된다.

클래스를 활용해 선언된 객체는 heap 영역에 인스턴스 변수 , 객체의 Reference 가 저장된다
인스턴스 변수는 각각의 객체마다 고유한 값을 가진다.
객체의 Reference(참조)는 객체 자체를 가르키는 포인터의 역할을 한다( 메모리주소)




정리해본 코드

public class methodArea {
        public static void main(String[] args) {
            ClassA objectA = new ClassA();  // heap 에 objectA가 호출된다.
            objectA.methodA();              // 메소드가 호출되면서 이때 . Stack에 저장된다.
        }
    }

    class ClassA {
        int classVariableA = 10; // 클래스 변수임으로 new으로 생성되면서 같이 heap 저장된다.

        public void methodA() {
            int localVariableA = 20; //로컬변수는 메소드가 호출되는 동안 Stack에 저장된다
        }
}
전체적으로 heap라는 영역이 있는 것만 알았지. 어느 순간 어디에 할당되고 하는 것들을 모르고 있었는데 
알게된 순간이였던것 같다.😭

0개의 댓글