스터디/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는 지역변수로 스택 영역에 저장된다.