본문 바로가기

bitcamp/JAVA

클래스 변수와 메소드

1. static 변수의 다른 용어 3가지를 설명하시오.

· static 변수는 클래스 변수, 공유 변수, 정적 변수라고도 불린다(변수 앞에 static 붙으면 클래스 변수, 안붙으면 인스턴스 변수)

· 클래스 변수라 불리는 이유는 클래스 내부에 존재해서 부르는 명칭이 아닌 static 키워드가 표기되어 있기 때문이다.

  또한, 선언된 클래스의 모든 인스턴스에서 공유가 가능하기 때문에 공유 변수라고도 불린다.

 

 

 

2. JAVA의 메모리 영역을 3가지로 나누고, 해당 영역에 들어가는 정보를 설명하시오.

· JVM을 통해 데이터가 메모리에 저장되며, 메모리는 크게 Method Area, Call Stack, Heap 3가지의 영역으로 나뉜다.

· Method Area 영역에는 JVM이 읽어들인 class와 필드정보, class에 존재하는 Static 정보가 저장되고,

  Static 변수는 모든 단 1회만 저장되어 객체 생성없이 접근이 가능하다.(Staitc 변수 공유)

· Call Stack 영역에는 class의 main함수와 참조변수, 지역변수 데이터의 값이 저장되는 공간이며,

  메소드가 호출될 때 메모리에 할당되고 실행이 종료되면 메모리가 해제되어 소멸된다.

· Heap 영역에는 객체가 저장되는 영역으로 인스턴스는 기본값으로 초기화 된 후 main 함수에 입력된 정보가 저장된다. 

  만약 참조하는 변수, 필드가 존재하지 않는다면 JVM Carbage Collector에 의해 해당 객체를 제거한다.(메모리 정리)

 

 

3. static 변수의 접근 방법은?

· class 내부 접근: static 변수가 선언된 클래스 내에서는 이름만으로 접근 가능하다. (같은 클래스 내에서 사용)

· class 외부 접근: private 선언되지 않은 한 클래스 외부에서 접근 가능하다. (다른 클래스에서 사용 가능)

· ex)

 

 

4. 클래스 변수의 초기화 시점과 활용의 예를 드시오 .

※초기화 시점

 · 클래스 변수는 선언하자마자 초기화 하는 것이 가장 적절하다.

 · ex) InstCnt() 생성자 기반으로 초기화하게 되면 인스턴스 생성 시마다 값이 리셋되므로 변수를 선언하자마자 초기화한다.

 

※활용의 예

· 인스턴스를 생성할 때마다 새로 만들지 않고 한 번만 생성하여 공유되어도 무관한 경우 static 변수를 활용한다.

 : 값의 공유/참조가 목적인 변수일 때 static을 활용하고, 그 값이 외부에서도 참조하는 값이라면 public으로 선언한다.

·  ex)

 

5. 아래와 같이 클래스 함수에 인스턴스 변수가 접근 할 수 없는 이유는?

· 3개의 메모리 영역 중 Method Area영역에 class AAA와 AAA에 존재하는 static addNum함수가 먼저 메모리에 저장된다.

· 인스턴스 변수은 Heap 영역에서 객체 생성할 때 메모리에 저장되기 때문에 static과 동일한 시점에 메모리 공간 할당이 불가하다.

· 즉, static 함수와 메모리의 생성 시기가 다르기 때문에 인스턴스 변수는 접근 할 수 없으머,

  인스턴스 함수도 마찬가지로 static이 먼저 메모리에 저장되기 때문에 당연히 접근이 불가능하다.

· 결론: static 함수에는 변수가 접근이 불가하므로 static 변수만이 접근이 가능하다.

 

※인스턴스 함수에 클래스 변수와 함수가 접근 할 수 있는 이유는?

· 5번 질문과는 반대로 클래스 변수와 함수는 미리 메모리에 저장되어 있는 상태이기 때문에 

 Call Stack 영역에 저장되는 인스턴스 함수에는 접근이 가능하다.(메모리에 static이 먼저 올라가기 때문!)

 

 

6. public static void main()과 System.out.println

public static void main()

· static으로 선언한 이유: 인스턴스 생성과 관계없이 제일 먼저 호출되는 메소드이므로 static으로 선언한다.

 (JVM에서 메인 함수를 가장 먼저 찾기 때문)

· public으로 선언한 이유: main 메소드의 호출 명령은 외부로부터 시작되므로 public 으로 선언한다.

 (외부에서 끌어다 사용하기 위해서, 공공의)

System.out.println()

· System은 java.lang 패키지에 묶여 있는 class 중 하나이다.

· out은 class System의 이름을 통해 접근하므로 static 변수라는 것을 유추할 수 있다.

  ex) Math.PI에서 Math는 static 함수, PI는 static 변수라 유추 가능

· println은 out이 참조하는 인스턴스의 메소드이다.

 

· static으로 접근한 이유? 단순 기능 제공('객체를 생성시킬 필요가 없다' 라는 의미)이 목적인 메소드들

 즉, println을 static으로 선언하지 않으면 사용할 때마다 new 연산자를 사용하여 인스턴스 생성을 해야 사용이

 가능하기 때문에 static으로 접근하여 한 번만 생성해두어 공유하기 위함이다.

 (메모리 절약과 동시에 많이 사용하기 때문에 static으로 접근, 다이렉트로 접근하도록!)

 

'bitcamp > JAVA' 카테고리의 다른 글

기타_연습문제  (0) 2021.01.17
메소드 오버로딩과 String 클래스  (0) 2021.01.17
기타_연습문제  (0) 2021.01.10
접근제한자와 캡슐화  (0) 2021.01.10
클래스패스와 패키지  (0) 2021.01.10