2019. 11. 8. 16:21ㆍJAVA
출처 : _Jbee 님의 https://asfirstalways.tistory.com/160?category=660807
[JAVA] 3. 자바에서 변수와 메소드에 대하여 / 클래스 메소드, 클래스 변수
Chapter 3. 변수와 메소드 자바에서는 변수의 종류가 세 가지로 나뉘어 지고 각각 올라가게 되는 메모리가 다르다. 메소드 또한 클래스 메소드인지 인스턴스 메소드인지에 따라 다르다. JVM 메모리 구조와 함께 각..
asfirstalways.tistory.com
이 블로그의 글이 저작권 문제가 있을 시 바로 삭제하겠습니다.
Chapter 03. 변수와 메소드
자바에서는 변수의 종료가 세 가지로 나뉘어져 있고, 각각의 변수들은 올라가게 되는 메모리가 다르다.
(생성되는 메모리의 위치 혹은 주소가 다르다는 말. 'a'는 1번지에 살고, 'b'는 2번지에 살고...)
메소드 또한 클래스 메소드인지 인스턴스 메소드인지에 따라 그 특징들이 다른데
이번 페이지에서는 JVM 메모리 구조와 함께 각 변수들과 메소드에 대해서 알아보겠다.
1. 클래스 변수(static 변수 = 고정된, 정지상태의 변수)
클래스 변수를 멤버 변수라고도 한다.
(한번 왔다갔다하는 객원이 아니라 말 그대로 소속된 멤버의 개념이랄까)
'모든 인스턴스에서 똑같이 사용되어야 하는 변수가 필요할 때'
이 똑같은 정보를 한 번에 정의해주면 좋지 않을까라는 생각으로 등장하게 되었다.
모든 인스턴스에게 적용될 수 있는 변수이며, 모든 인스턴스가 공유하는 변수이다.
(이 공유라는 것은, 예를 들어 한 변수에 할당 된 데이터가 변경되면 다른 곳에 위치한 그 밖의 모든 (이름이 같은)변수들에도 할당 된 값이 동일하게 일괄적으로 변경된다는 것이다.)
즉, 클래스에 소속되어 있는 변수에 접근하여 사용할 수 있다는 것이다.
인스턴스 변수를 정의할 때 앞에 static을 추가로 정의하면(적어주면)
static으로 선언된 변수는 메모리 공간이 하나에만 존재하며 어디서나 접근이 가능한 변수이다.
*보충설명 달기 이해 못하였음.
단 어디서나 접근이 가능하려면 static 변수도 public으로 선언이 되어야 한다.
어디서나라는 말은, 패키지를 넘어서도 접근을 가능하게 할 것인지,
클래스를 넘어서도 접근을 가능하게 할 것인지에 대한 접근제어자에 관련된 부분이다.
(흠 이것을.. 인천에서 소성주를 만들었는데 이것을 서울에도 팔고, 미국에도 팔고 중국에도 팔까... 이런거랑 비슷한 것일까...?)
static 변수는 인스턴스가 생성되기 전에 메모리 공간에 할당되어 초기화까지 완료가 된다.
(부르지 않아도 지가 가서 벌써 자리를 잡고 있다..?)
int 타입의 변수는 0으로 초기화가 되고 String 변수의 경우 null로 초기화가 된다.
좀더 구체적으로는 JVM에 의해서 클래스가 메모리 공간에 올라가는 순간이다.
인스턴스간에 데이터 공유가 필요한 상황에서는 static 변수를 선언한다.
추가로 참조의 용도로만 선언되는 변수는 static final로 선언하는 것이 적절하다.
cf) 변수 선언 시 static, final, public(접근제어 지시자)가지도 이어서 선언이 가능하며 그 순서는 상관없다.
하지만 static 변수에는 무거운 즉, 용량이 큰 변수를 선언해서는 메모리의 비효율을 발생시킨다.
프로그램이 실행되면서 static area(=method area)에 변수가 생성되기 때문이다.
이 영역에서 생성되는 변수는 프로그램이 종료될 때까지 할당된 메모리를 점유하고 있게된다.
(마치 내가 지방에 출장을 가있는데도, 그동안 월세는 꼬박꼬박 나가는 것과 같이..)
인스턴스 변수(Instance variable)
인스턴스마다 다른 값을 갖는 변수로,
ex) car matiz = new car("2019");
car matiz = new car("2019", 200cc);
클래스 변수와 마찬가지로 클래스 내부에 선언이 된다.
하지만 이 변수는 인스턴스가 new를 통해 생성되어야만 생성된다.
즉, 인스턴스가 생성되었을 때 접근할 수 있다는 것이다.
(그럼 인스턴스가 생성되어 있지 않아도 접근할수 있는 변수가 있다는 말?)
그렇기 때문에 자바 메모리 구조 중 Heap 영역에 생성된다,
따로 삭제를 해주지 않아도, Garbage collector가 내부적인 알고리즘을 통해 삭제해준다.
지역변수(local variable)
메소드 내에서 선언되고, 메소드 내에서만 사용 가능하다(=정중지와, 우물안 개구리).
(가령 통인시장에서 현금을 엽전으로 바꾸면 그 엽전은 통인시장에서는 화폐의 가치를 지니지만
그 엽전을 망원시장에서 쓰면 당신이 파출소로 끌려갈 수 있는 것 처럼...)
메소드가 종료되면 종료즉시 그 자리에서 메모리상에서 차지하고 있던 공간이 소멸되어 더 이상 사용할 수 없게 된다.
지역 변수는 따로 개발자가 초기화 해주어야 한다. 자동으로 해주는거 그딴 거 없음.(그렇다면 자동으로 초기화 해주는 것은 무엇?)
클래스 메소드(클래스 메소드)
static 메소드가 삽입 된 클래스의 모든 인스턴스로부터 접근이(호출이) 가능하다.
(이거... 사람으로 치면 너무 피곤한거 아니냐..?)
인스턴스를 생성하지 않아도 즉, 연산자 없이 메소드에 직접 접근하여 호출할 수 있다.
효율적으로 메모리와 시간을 컨트롤 할 수 있는 것이다.
인스턴수 변수에 저장된 값을 변경하거나 참고하는 일이 없는 경우에는
메소드에 static을 선언하여 별도의 인스턴스 생성을 피하는 방향으로 설계해준다.
main 메소드는 인스턴스 생성과는 관계없이 JVM에 의해 호출된다.
그러므로 아무 클래스에서나 정의되면 된다.
하지만 반드시 static으로 선언을 해야 한다.
"각종 기본서에서는 다른 class들과 동일한 class파일에 main 메소드를 작성하는데(클래스는 여러개인데 이 클래스들을 실행하는 메소드는 단 하나의 class에 만 있다는 소리인 것 같다), 이는 일반적이지 않다.
웹 상에서의 JAVA에는 main 메소드는 존재하지 않는데, 이는 구동되어야 할 것이 서버에서에서 구동되고 자바는 서블릿 클래스만 제공하기 때문이다. 즉, main 메소드는 작성한 클래스들이 작동하는 공간인 것이다."
이러한 특징들로 미루어봤을 때, 별도의 클래스에 main 메소드를 작성하는 것이,
유지 보수에도 좋고 가독성도 좋고 더욱 구조적이다.
클래스 메소드는 인스턴스 멤버에 접근할 수 없다.
클래스는 메소드의 상위? 개념으로(피자 만들 때 도우없이는 치즈를 뿌릴 수 없듯이)
클래스라는 설계도는 컴파일 과정에서 이미 메모리에 올라가게 된다.
그리고 그 클래스를 기반으로 인스턴스를 생성하게 되는데 클래스 메소드는 인스턴스 생성과는 관계없이 접근할 수 있는 메소드이다.(어떤 전제조건이 있어야 생성되는 것이 아니라 컴파일과 동시에 자동으로 생성되니까) 따라서 클래스 메소드가 인스턴스 생성과 관계없이 접근하려면 클래스 메소드에는 인스턴스 멤버에 대한 내용이 존재할 수 없다.
메소드 내에서 인스턴스 변수를 사용하지 않는다면 static을 고려해볼만 하다. 그렇게 되면 메소드 호출시간이 짧아져 성능이 향상되기 때문이다.
'JAVA' 카테고리의 다른 글
[JAVA] 01.객체와 인스턴스 (0) | 2019.11.07 |
---|