2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[자바 기초] 자바 객체 생성 이글 하나로 완벽히 이해하자.

2023. 7. 4. 00:16ㆍJAVA 기초

 
 

[객체 생성이란?]

 
객체 생성이란 정확히 어떻게 일어나는 것 일까?
 
예를들어 보자.
 
우리는 Student라는 클래스를 만들었다.
 

 
나는 이러한 클래스를 만들었고
 
이 객체를 사용하기 위해선 객체를 생성해야한다.
 
하지만 이 Student 객체가 무엇을 가진지 중요한 것이 아닌 객체 생성원리를 알고 싶어한다.
 

 
자 여기서부터가 중요하다 한번 보자.
 

Student student = new Student();

 
나는 Student라는 객체를 생성했다.
 
이것이 객체 생성 이라는 것은 우리는 알지만 정확히 어떻게 되는 것일까?
 

[객체 생성 원리]

 
 ▶객체는 new 연산자와 같이 사용되며 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다
 
 ▶ 객체 초기화 : 기본적으로 메모리 안에는 쓰레기 값이 담겨있기 때문에 new 연산자를 통해
    객체를 초기화 시켜준다. 
 
 ▶ 객체를 생성할 땐 반드시 생성자가 실행된다.
 
 ▶ new 연산자의 의해 생성자가 성공적으로 실행되면 힙 영역에 객체가 생성되며 변수값에 객체의 주소가 반환된다.
 
 ▶ 반환된 객체 주소는 타입 변수에 저장되며 객체를 접근할 때 사용된다.
 
 ▶ 생성자가 실행안되면 에러 , 객체 생성이 불가하며 반드시 생성자가 성공적으로 실행되어야 한다.
 
 
객체를 한번 생성하는데 이렇게 많은 요구과정이 있다.
 
아직까지 말로해선 설명이 어려운거 같다.
 
나와 같이 하나하나 자세히 알아보자.
 
 
[01.  ▶객체는 new 연산자와 같이 사용되며 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다]
 
 
 
과연 이게 무슨 뜻일까?
 
일단 이 객체 생성 과정을 보자.
 

 
 
기본적으로 객체를 생성할 때는 객체를 메모리 어딘가에 저장해야만 한다.
 
하지만 그 메모리 저장공간에는 쓰레기 값이 들어있다.
 
지역 변수도 쓰레기 값이 들어있기 때문에 초기화를 시켜줘야만 하며 객체도 예외는 아니다.
 
이 쓰레기 값을 new 연산자를 통해 "초기화" 시키는 것 이다.
 
new 연산자를 초기화 시키고 
 

 
 
이 Student란 클래스를 메모리에 저장하겠다는 내용이다.
 
 
 

 

 [▶02 .  객체 초기화 : 기본적으로 메모리 안에는 쓰레기 값이 담겨있기 때문에 new 연산자를 통해

    객체를 초기화 시켜준다.]

 
 ▶ 밑에서 설명한 내용이기에 생략하겠다.
 
 

 

 ▶  03.  객체를 생성할 땐 반드시 생성자가 실행된다.

 
객체 생성 과정을 보자.
 

 
이 부분이 생성자이다.
 
기본적으로 객체는 생성자를 가지고 있는데 
 
생성자를 안만들면 기본 생성자가 실행된다
 
하지만 기본생성자는 우리가 정의하지 않았기 때문에 보이지 않는 것 이다.
 
생성자를 정의 해보자.
 

 
이렇게 나는 Student 생성자를 생성했다.
 
이제 이것은 객체를 생성할때 " 반드시 " 실행되는 것 이다.
 

Student student = new Student();

 
즉 내가 Student 객체를 생성할때 반드시 생성자가 실행되며
 
student() 생성자가 반드시 실행된다는 뜻이다 
 
그렇다면 객체를 생성한다면 "무조건"  grade = 2가 들어가는 것 이다.
 

 
 
찍어보면 2가 나오는걸 볼 수 있다.
 

 
 
[▶ new 연산자의 의해 생성자가 성공적으로 실행되면 힙 영역에 객체가 생성되며 변수값에 객체의 주소가 반환된다.]
 
 
자 이렇게 생성자 까지 정상적으로 실행되었다면 힙 영역이라는 곳에 저장된다.
 
 

 
힙 영역의 특징은 객체와 배열 형식이 담기는 메모리 공간이며
객체와 배열 형식의 주소 값이 저장되는 공간이다.
 
이렇게 까지 저장이 되었다면 객체의 변수 값에 Student라는 클래스의 주소가 저장된다.
 
여기서 Tmi를 한개 말하자면..
 
자바의 경우 C언어와 유사하게 작동한다.
C언어는 기본적으로 포인터라는 메모리 주소로 변수 값을 만지는데
자바는 메모리 값을 직접적으로 만지지는 못해도 변수안에 c언어처럼 메모리 주소가 저장되는 형식이다.
 
 

 
즉 이 student 변수안에 Student 클래스에 주소가 담기게 된다.
 
자바는 메모리 주소가 같다면 변수는 모두 같은 주소 공간을 참조하고있다.
 
 

 
 
즉 stduent 클래스의 메모리 주소가 같다면 변수는  모두 같은 메모리 공간을 보고있다.
 
즉 student 변수에는 Student라는 클래스의 주소가 담겼음으로
student 변수는 Student 클래스를 직접적으로 변경 할 수 있다는 뜻이 된다.

즉 쉽게 생각해보자.

 

 

Stundent라는 클래스의 주소 값은 #1003이라고 치자.

 

그러면 우리가 student의 담은 주소 값도 #1003이 된다.

 

같은 주소 값을 가졋기 때문에 student의 메서드와 변수를 사용할 수 있으며

student 변수를 통해 값을 바꾼다면 원본객체인 #1003의 주소 값이 담긴

Student의 클래스의 값도 바뀌게 되는 것 이다.

 

만약 엑셀을 사용하는 분 이라면 이것이 무슨뜻인지 쉽게 이해가 될 것 이다.
 
 
[ ▶ 반환된 객체 주소는 타입 변수에 저장되며 객체를 접근할 때 사용된다.]
 
위에서도 설명했듯이 
 

 
객체 주소가 student 변수에 담기며 객체를 접근 할 수 있게 된다.
 
참고로 객체 타입이 라는 것은 이 Student가 저장되어있는 메모리 주소의 접근권한을 허용 해주는 것 이다.
 
즉  객체 타입이라는 것은 Student라는 클래스가 들어있는 메모리의 접근권한을 허용 해주겠다는 뜻이다.