스터디/JAVA

섹션3. 변수 미션

nnhhmm 2024. 10. 30. 18:12

초급

문제1. 변수를 선언하는 방법에 대해 설명하세요. 예를 들어 정수형 변수를 선언하고 초기화하는 코드와 함께 설명해 보세요.

정수형 변수를 선언하려면, 우선 정수형 변수타입인 int를 적어준 후 변수명을 적는다. 초기화를 하려면 대입연산자(=)를 적고 초기화 값을 적어준다. 

int a = 1; // (변수타입) (변수명) = (초기화값);

 

문제2. 다음 조건에 맞는 코드를 작성하세요.

  • String 타입의 변수 greeting을 선언하고, 초기값으로 "Hello, SungbinClub!"를 할당하세요.
  • 변수 greeting을 출력하세요.
String greeting = "Hello, SungbinClub!";
System.out.print(greeting);

문제3. 변수명을 지을 때 지켜야 하는 세 가지 명명 규칙을 제시하고, 적절한 변수 이름의 예시와 부적절한 변수 이름의 예시 각각 두 가지를 작성하세요.

1. 변수이름은 영문자, 숫자, 밑줄(_), 달러기호($)로 구성된다.

2. 자바의 예약어는 식별자로 사용할수 없다. 

3. 변수이름은 숫자로 시작할 수 없다.

int orderNumber;	 // 옳은 예 
int order_number; 	 // 옳은 예

int order-number; 	// 틀린 예
int for; 		// 틀린 예

중급

문제1. 다음 조건에 맞는 코드를 작성하세요.

  • final 키워드를 사용하여 상수 변수 DEFAULT_LIMIT를 int 타입으로 선언하고 초기값을 50으로 설정하세요.
  • DEFAULT_LIMIT 값을 출력하고, 값을 변경하려 할 때 발생하는 에러 메시지를 확인하세요.
final int DEFAULT_LIMIT = 50;
System.out.println("DEFAULT_LIMIT = " + DEFAULT_LIMIT);

// 값을 바꾸려고 시도 -> 에러발생 
DEFAULT_LIMIT = 60;

// [에러메세지] java: cannot assign a value to final variable DEFAULT_LIMIT

문제2. 다음 코드에서 각 변수(localValue, instanceValue, staticValue)가 JVM 메모리의 어느 영역에 저장되는지 설명하세요.

public class VariableExample {
    public static int staticValue = 10; // Method Area에 저장
    public int instanceValue = 20;	// Heap Area에 저장

    public void method() {
        int localValue = 30;		// Stack Area에 저장
        System.out.println(localValue);
    }
}

static 변수인 staticValue는 클래스가 로딩될때 Method Area에 저장된다.

인스턴스 변수인 instanceValue는 객체가 생성될 때 힙 메모리에 저장된다.

지역 변수인 localValue는 메서드가 호출될때 스택 영역에 저장된다.

문제3. 변수 초기화와 리터럴의 차이점을 설명하고, 다음 코드에서 리터럴과 초기화된 변수를 구분하여 설명하세요.

double price = 99.99; // 초기화된 변수는 price이고, 99.99가 리터럴이다.
int quantity = 5; // 초기화된 변수는 quantity이고, 5가 리터럴이다.
boolean isAvailable = true; // 초기화된 변수는 isAvailable이고, true가 리터럴이다.

 

변수 초기화는 변수를 선언하여 메모리 공간을 할당받아 값으로 초기화하는것이고, 리터럴은 그 자체로 값을 의미하는 것을 말한다. 

 


고급

문제1. 메모리 효율성을 고려하여 static 키워드를 사용한 ItemCounter 클래스를 작성하세요.

  • ItemCounter 클래스에 정적 변수 totalCount를 선언하고, 이를 증가시키는 addItem 메서드를 작성하세요.
  • ItemCounter 클래스의 totalCount 변수가 인스턴스마다 공유되는지 확인하는 코드를 작성하세요.
  • totalCount가 JVM의 어느 메모리 영역에 위치하는지도 설명하세요.
public class ItemCounter {
    public static int totalCount;

    public void addItem(){
       totalCount++;
    }

}

public class ItemCounterTest {

    public static void main(String[] args) {
        ItemCounter counter1 = new ItemCounter();
        ItemCounter counter2 = new ItemCounter();
        ItemCounter counter3 = new ItemCounter();

        counter1.addItem(); // counter1의 totalCount의 값 증가 
        System.out.println("counter1 = " + counter1.totalCount);
        System.out.println("counter2 = " + counter2.totalCount);
        System.out.println("counter3 = " + counter3.totalCount); 

        counter2.addItem(); // counter2의 totalCount의 값 증가 
        System.out.println("counter1 = " + counter1.totalCount);
        System.out.println("counter2 = " + counter2.totalCount);
        System.out.println("counter3 = " + counter3.totalCount);
    }
}

 

- totalCount 변수가 static으로 선언 되었기 때문에,  모든 객체에서 공유하게 된다.  JVM 메모리의 메소드 영역에 할당된다. 

- ItemCounterTest 클래스에서 counter1객체의 totalCount 값을 증가시키면 count1,count2,count3 의 totalCount값이 동일 한것을 확인할 수 있다. totalCountrk static 변수이므로 모든 인스턴스가 같은 값을 공유하는것을 확인 할수있다.  

문제2. 다음 코드의 각 변수들이 JVM 메모리 구조에서 어떻게 저장되고 관리되는지 설명하세요.

  • 지역 변수, 인스턴스 변수, 정적 변수가 각각 어디에 저장되는지 설명하고, 코드의 totalAmount, orderCount, discountRate 변수가 해당하는 JVM 메모리 영역도 설명하세요.
public class Order {
    public static double discountRate = 0.1;
    public int orderCount = 0;

    public void processOrder() {
        double totalAmount = 200.0;
        System.out.println(totalAmount * (1 - discountRate));
    }
}

 

- 변수 discountRate는 static 변수로 메서드 영역에 저장된다.

- 변수 orderCount 는 힙 영역에 저장된다.

- 변수 totalAmount는 지역변수로 스택 영역에 저장된다.