지정 예약어에 대해 알아보기 전에 Java의 인스턴스와 정적 멤버에 대해 먼저 알아보겠습니다.
클래스로부터 객체(인스턴스)는 하나가 아니라 여러 개가 만들어질 수 있습니다.
이때 객체마다 필드 값이 달라야 한다면 해당 필드는 객체마다 가지고 있는 것이 맞지만, 객체의 필드 값이 모두 같아야 한다면 이 필드를 객체마다 가지고 있을 필요가 없게 됩니다.
Java는 이런 경우를 위해 클래스 멤버를 인스턴스와 정적으로 구분해서 선언할 수 있도록 합니다.
인스턴스 멤버란 객체를 생성한 후 사용할 수 있는 필드와 메서드를 말하는데, 이들을 각각 인스턴스 필드와 인스턴스 메서드라고 부릅니다. 그리고 이는 생성한 객체를 참조 변수로 사용하여 접근해야 합니다.
필드와 메서드 앞에 static 키워드를 추가적으로 붙이면 이들은 각각 정적 필드와 정적 메서드가 됩니다.
정적(static)은 '고정됨'이란 의미를 가지는데, 이런 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메서드를 말합니다.
Java의 메모리 영역에 대해 간단히 알아보자면, 먼저 스택(stack) 영역은 메서드의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역을 말합니다.
반대로 힙(heap) 영역은 사용자가 직접 관리할 수 있는 메모리 영역을 말합니다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 곳입니다.
Java에서는 new 연산자를 이용해서 메모리를 할당하는 것은 전부 힙(heap) 영역에 할당되게 됩니다.
힙 영역에 보관되는 메모리는 메서드 호출이 끝나도 사라지지 않고 유지됩니다. Java의 메모리 관리는 JVM이 관리합니다.
메서드(method) 영역은 클래스 영역, static 영역이라고도 불리는데, 메서드 영역은 .class 형식지정자 파일들을 읽어 들여 각각의 클래스 별로 필드 데이터, 메서드 코드, 생성자 코드 등을 저장하는 영역입니다.
일반적으로 static으로 선언된 값들 역시 메서드 영역에 저장됩니다. 메서드 영역의 데이터는 JVM이 실행되는 순간에 자동으로 생성됩니다.
프로그래밍 과정에서 static 데이터에 바로 접근할 수 있는 이유도 static으로 선언된 데이터들이 JVM 실행되는 순간에 메모리로 올라가기 때문입니다.
정적(static) 메서드는 객체가 없어도 실행된다는 특징 때문에 내부에서 인스턴스 필드나 인스턴스 메서드를 사용할 수 없습니다. 객체 자신의 참조인 this 키워드도 사용할 수 없습니다.
static 블록에서는 static 필드를 초기화합니다. static 블록은 main() 메서드보다 먼저 실행되는 블록입니다.
인스턴스 블록은 객체 생성 시 호출되어 초기화되는 블록을 말합니다.
불변의 인스턴스 상수라고 불리는 final은 단어 뜻 그대로 최종적이라는 뜻을 가지고 있습니다.
final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없습니다.
final 필드의 초기값을 줄 수 있는 방법에는 필드 선언 시 주거나, 생성자에서 줄 수 있습니다.
정적 불변의 상수라고 불리는 static final은 static 필드의 속성과 final 필드의 속성을 모두 가지고 있다고 볼 수 있습니다.
따라서 static final 필드는 메모리 최상단에 올라가므로 반드시 선언과 동시에 초기화를 해줘야 합니다.
이때 작성되는 상수 이름은 모두 대문자로 작성하는 것이 관례입니다. 하지만 만약 서로 다른 단어가 혼합된 이름이라면 언더바(_)로 단어들을 연결해 줍니다.
지정 예약어에 대해 정리를 해보자면 우선 클래스에 대한 지정 예약어에는 해당 클래스를 상속받지 못하게 만들 때 사용하는 final 예약어와, 클래스 내에 추상 메서드가 선언되어 있음을 말하는 abstract 예약어가 있습니다. 두 예약어는 함께 사용할 수 없습니다.
필드에 대한 지정 예약어에는 하나의 클래스로 발생된 모든 객체가 공유하는 필드를 선언할 때 사용되는 static 예약어, 한 번 값이 정해지면 그 값을 변경하지 못하는 필드를 선언할 때 사용하는 final 예약어, static의 속성과 final의 속성이 혼합된 형태인 static final 예약어, 임시 메모리 필드로 네트워크로의 전송이나 파일로의 전송 시에 그 값 자체가 없는 것과 같은 효과를 나타낼 필드를 선언할 때 사용하는 transient 예약어가 있습니다.
여기서 static 예약어를 사용하면 객체명이 아닌 클래스 명으로도 접근할 수 있습니다.
메서드에 대한 지정 예약어에는 필드에 대한 지정 예약어와 마찬가지로 static, final, static final 예약어가 있습니다.
static 예약어는 static 지정 예약어로 선언된 필드의 값을 처리하고자 할 때 사용하는 예약어로, static 메서드 내부에는 static 필드나 static 메서드만 올 수 있습니다. 또한 이 메서드 역시 클래스 명으로 접근할 수 있습니다.
상속 관계에서 오버라이딩(Overriding)이라는 개념은 메서드 재정의라고 불리는데, final로 지정된 메서드는 오버라이딩을 할 수 없습니다.
또한 메서드에 대한 지정 예약어에는 abstract 예약어가 있는데, abstract 예약어는 내용부 정의가 없는 추상 메서드를 선언할 때 사용합니다. abstract 예약어로 선언된 메서드는 반드시 오버라이딩(Overriding) 되어야 합니다.
예제에는 한 번도 사용되지 않은 synchronized 예약어는 특정 메서드의 실행이 여러 개의 스레드(Thread)로 인하여 중첩되어 수행되는 것을 방지하기 위해서 사용되는 예약어입니다.
synchronized 예약어는 동기화라는 이름으로 많이 사용됩니다.
마지막으로 native 예약어는 순수한 Java의 개념으로 구현할 수 없거나, 이미 만들어진 다른 언어의 코딩을 Java 내부 메서드의 코딩처럼 사용하기 위해 사용되는 예약어입니다. native 예약어를 사용하는 것은 거의 권장하지 않습니다.
'프로그래밍 언어 > 자바 (Java)' 카테고리의 다른 글
[자바(Java) 공부하기] 21. 추상화 - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.21 |
---|---|
[자바(Java) 공부하기] 20. 다형성 - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.20 |
[자바(Java) 공부하기] 19. 상속 - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.19 |
[자바(Java) 공부하기] 18. 중첩 클래스 - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.18 |
[자바(Java) 공부하기] 16. 접근제한자 - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.16 |
[자바(Java) 공부하기] 15. 클래스 배열(객체 배열) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.15 |
[자바(Java) 공부하기] 14. 생성자 - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.14 |
[자바(Java) 공부하기] 13. 필드 - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.13 |