Java | 클래스와 객체, 인스턴스의 차이? 지역 변수는 왜 초기화가 필요한가

송은석·2022년 9월 16일
0

자바의 신 - 정리

목록 보기
1/5

자바의 신(책)을 통해 배우게 된 내용과 추가로 공부한 내용을 정리합니다.
1-4강 부분

이전에 자바를 해본 적이 있으므로, 정리하는 차원에서 책을 보게 되었다. 책 초반은 술술 넘어가게 되는 것 같다.

그래서 두렵다. 후반으로 갈수록 잘 안 넘어갈까봐..ㅋ

1-3장은 기본적인 내용을 다룬다. 프로그래밍이란 뭘까에 대해, 자바 설치, 간단한 예약어 및 용어 설명 등..

거의 잘 넘어갔는데, 보다가 헷갈리는 부분들이 있었다. 그 내용들을 아래에서 다루고자 한다.

Class와 객체와 인스턴스

Class와 객체와 인스턴스의 차이가 뭐지..? 분명히 전에 배웠는데..ㅋㅋ

구글 서치를 통해 조금 정리는 되었다. 내가 이해한 바에 따르면 아래와 같다.

일단 객체는 현실 세계의 사물이나 추상적인 어떠한 것을 프로그램(소프트웨어)으로 표현한 것이다.
객체는 어떠한 추상적인 대상이나 사물을 가리키는 말이다.

그런데 프로그래밍에서 이 객체를 표현하는 방식에 있어서, 자바가 class 방식을 선택했다 라는 거다.
이를 소프트웨어에서 구현하는 도구로, class를 채택한 것이다.
자바스크립트가 프로토타입을 통해 객체를 만들었던 것이 떠오르면서, 이해가 확 됐다.

그러니까.. 클래스는 객체를 소프트웨어에서 코드 상으로 구현하는 하나의 방법인 것이다. 코드 상으로는 변수와 메서드들을 모은 집합이다.

그리고, 인스턴스는 객체를 표현한 클래스가 실제 메모리에 올라간 것, 즉 객체가 실체화된 것을 의미한다. 인스턴스가 생성됨으로써 껍데기 뿐이던 객체가 소프트웨어 세상에서 실체로 사용될 수 있게 된다.


헷갈리는 변수 명칭

전에는 클래스 안에 메소드와 필드(멤버 변수), 이 2가지만 있다고 생각 했다.
근데 보다보니 무슨 전역 변수도 나오고 인스턴스 변수도 나오고 클래스 변수도 나오고..
보다 보니 이해는 됐다.

필드 == 멤버 변수 == 전역 변수 이고,

멤버 변수인데 static이 붙어 있고, 클래스 호출 시부터 사용 가능하며 이후 프로그램 종료 시까지의 생명 주기를 갖는 멤버 변수는 클래스 변수이고,

static이 없으며 클래스가 인스턴스를 생성할 때부터 인스턴스를 참조하는 변수가 없어질 때까지를 생명 주기로 삼는 것이 인스턴스 변수!

그리고 메소드 블록 안에서 선언되는 변수들은 지역 변수로 생각하면 될 듯하다.

잘 모르겠는 점

특이하다고 생각했던 것은 클래스 안의 멤버 변수를 전역 변수라고 표현한 것이다. 왜냐하면 자바스크립트에서는 파일의 모든 블록 밖에 있는 변수들만 전역 변수라고 칭했기 때문이다. 클래스 안에 있는데 왜 전역 변수라고 할까? 클래스 밖의 변수는 없는 것일까?
.java 파일이 .class 파일로 컴파일 되는 것을 생각했을 때, 각 class를 하나의 전역으로 생각하는 것 같기도 하다. 그렇다면 클래스라는 여러 개의 전역이 연결되어 하나의 프로그램을 만든다는 개념인건가..? 아직은 아리송한 게 많다.

비트로 이루어진 정수 자료형

자바의 정수 자료형의 범위를 설명할 때는 비트를 가지고 설명할 수 있다.
자바의 가장 작은 정수 자료형은 byte인데, 이는 8개의 비트로 이루어져 있다. 1개의 비트를 부호로 사용하며 나머지 7개로 이진수를 통해 정수를 표현하므로 -128~127의 정수를 표현할 수 있다.
short, int, long으로 이동하면서 bit의 수가 2배씩 늘고, 따라서 표현하는 수의 범위도 증가한다.



지역 변수는 초기화가 필요하다??

처음 볼 때는 그냥 그렇구나.. 했는데 다시 생각해보니까 이상했다.
왜냐면 인스턴스 변수는 초기화를 안해주어도 자동 초기화가 가능하다고 했기 때문이다. 왜지?

1) 일단은 자바 문서에 다음과 같이 적혀 있다고 한다.

Each local variable and every blank final field must have a definitely assigned value when any access of its value occurs.

그래서 원칙상 지켜지는 부분이라고 할 수 있다.

2) 한편, 메소드의 지역 변수는 JVM 스레드 생성 시 만들어지는 Stack의 frame(메소드 호출 시마다 만들어지는 메소드 상태 정보. 지역 변수와 Operand Stack, Constant Pool Reference를 저장)에 할당되는데, Stack의 크기를 보다 명확히 할당하기 위해 지역 변수의 초기화를 엄격하게 다루게 되었다는 의견도 있었다. 왜냐하면, 스레드가 쓸 수 있는 스택의 사이즈를 넘기게 될 경우 StackOverFlowError가 발생할 수 있기 때문이다.
인스턴스 변수의 경우는 어떠할까? 인스턴스 변수의 초기화 여부는 컴파일 단계에서는 알 수 없으므로 기본값으로 초기화 시킨 것이라는 의견이 있었다. 인스턴스 변수는 힙 메모리에 할당이 되는데, 이는 런타임 시 동적으로 메모리 할당이 가능하므로 일단 초기화해도 상관이 없다는 것이다.

책 내용 자체는 어렵지 않았는데 이해 안가는 부분들을 조금씩 따로 정리하니까 시간이 꽤 든다.. 그래도 무언가 확실히 쌓아가는 느낌이 나쁘지 않다..ㅎ 화이팅!


참고

책 | 자바의 신, 이상민 저
웹 사이트 | https://docs.oracle.com/javase/specs/jls/se11/html/jls-16.html
웹 사이트 | https://kd3302.tistory.com/780
웹 사이트 | https://johngrib.github.io/wiki/jvm-stack/
웹 사이트 | https://jypthemiracle.medium.com/weekly-java-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%B3%80%EC%88%98%EB%8A%94-%EA%B8%B0%EB%B3%B8%EA%B0%92%EC%9C%BC%EB%A1%9C-%EC%B4%88%EA%B8%B0%ED%99%94%EB%90%98%EC%A7%80%EB%A7%8C-%EC%99%9C-%EC%A7%80%EC%97%AD-%EB%B3%80%EC%88%98%EB%8A%94-%EC%B4%88%EA%B8%B0%ED%99%94%EB%90%98%EC%A7%80-%EC%95%8A%EB%82%98%EC%9A%94-bc7bf7a1a295
profile
Done is better than perfect🔥

0개의 댓글