문제는 북 프로5 산 기념으로 키보드에 떡하니 박혀있는 Copilot 한테 부탁해서 문제풀이 해봤다.
1. 지역변수와 전역 변수
다음 코드의 실행 결과는 무엇일까요?
class Test {
int globalVar = 10; // 전역 변수
void method() {
int localVar = 20; // 지역 변수
System.out.println("지역 변수: " + localVar);
System.out.println("전역 변수: " + globalVar);
}
}
public class Main {
public static void main(String[] args) {
Test obj = new Test();
obj.method();
}
}
질문 : 지역변수 localVar와 전역 변수 globalVar는 각각 언제 생성되고, 언제 소멸될까요?
내 답변 :
지역 변수: 20
전역 변수: 10
localVar은 method() 안에서 처음 생성, method() 끝난 후 소멸, globalVar은 프로그램 시작할 때 생성, Main 끝난 후 소멸
거의 맞아요! 👏 다만 몇 가지 더 명확하게 정리해볼게요.
- 지역 변수 (localVar): method() 내부에서 생성되며, 메서드가 실행될 때만 존재하고 메서드가 종료되면 즉시 소멸합니다. 즉, 메서드의 호출이 끝나면 더 이상 사용할 수 없어요.
- 전역 변수 (globalVar): 클래스의 멤버 변수로 선언된 변수(int globalVar = 10;)는 객체가 생성될 때 함께 생성됩니다. 그리고 객체가 살아있는 동안 유지됩니다.
- 하지만 Main이 끝난다고 바로 소멸되는 것은 아닙니다! 객체가 더 이상 참조되지 않거나 null이 되어 **GC(Garbage Collector)**가 실행될 때 제거됩니다.
💡 추가 설명:
전역 변수는 static 여부에 따라 수명이 달라질 수 있습니다. 만약 static 키워드가 붙어 있다면 프로그램이 시작할 때 메모리에 로드되고 프로그램이 종료될 때까지 유지되죠!
2. static 변수와 메서드
다음 코드에서 count 변수가 유지되는 이유를 설명하세요.
class Counter {
static int count = 0; // static 변수
Counter() {
count++;
System.out.println("현재 count 값: " + count);
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
Counter c3 = new Counter();
}
}
질문: count 값은 객체마다 개별적으로 유지되나요, 아니면 공통으로 관리되나요?
내 답변 : 개별적으로 유지된다. 이유는 각 개체가 생성되는 개념이기 때문
아쉽지만 조금 다르게 이해해야 해요! static 키워드는 클래스 단위로 변수를 유지하기 때문에 객체마다 개별적으로 유지되지 않고, 모든 객체가 같은 값을 공유합니다.
💡 다시 코드 분석해볼게요:
class Counter {
static int count = 0; // static 변수
Counter() {
count++; // 모든 객체가 같은 count를 공유
System.out.println("현재 count 값: " + count);
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter(); // count = 1
Counter c2 = new Counter(); // count = 2
Counter c3 = new Counter(); // count = 3
}
}
📌 출력 결과:
현재 count 값: 1
현재 count 값: 2
현재 count 값: 3
📌 핵심 정리:
- 객체마다 개별적으로 유지되지 않음 → static 변수는 모든 객체가 공유!
- 클래스 레벨에서 하나만 존재 → Counter.count는 Counter 클래스 내에서 하나만 존재하고, 모든 인스턴스가 이 변수에 접근.
💡 만약 static이 없었다면 count는 각 객체마다 따로 존재했을 거예요. 즉, c1.count, c2.count, c3.count 각각 1로 초기화되었을 겁니다.
혹시 더 궁금한 점이 있으면 질문 주세요! 😊🚀
3. 생성자 오버로딩
아래 코드에서 각 객체 생성 시 호출되는 생성자를 예측해보세요.
class Person {
String name;
int age;
Person() {
System.out.println("기본 생성자 호출");
}
Person(String name) {
this.name = name;
System.out.println("이름 설정 생성자 호출: " + name);
}
Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("이름과 나이 설정 생성자 호출: " + name + ", " + age);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person("홍길동");
Person p3 = new Person("이순신", 45);
}
}
질문: Person 객체를 만들 때 어떤 생성자가 호출될까요?
내 답변: 기본 이름, 이름과 나이 설정 생성자 호출되겠네
정확해요! 👏
각 객체를 생성할 때 호출되는 생성자는 다음과 같습니다:
Person p1 = new Person(); // 기본 생성자 호출
Person p2 = new Person("홍길동"); // 이름 설정 생성자 호출
Person p3 = new Person("이순신", 45); // 이름과 나이 설정 생성자 호출
📌 출력 결과:
기본 생성자 호출
이름 설정 생성자 호출: 홍길동
이름과 나이 설정 생성자 호출: 이순신, 45
설명
- p1은 아무런 매개변수를 넘기지 않았으므로 기본 생성자가 호출됩니다.
- p2는 String name 하나만 넘겼으므로 이름을 설정하는 생성자가 호출됩니다.
- p3는 String name과 int age 두 개의 매개변수를 넘겼으므로 이름과 나이를 설정하는 생성자가 호출됩니다.
생성자 오버로딩 개념을 잘 이해하고 계신 것 같아요! 💡 다음 문제도 도전해볼까요? 🚀😊
4. super 키워드
다음 코드의 출력 결과를 예측하세요.
class Parent {
Parent() {
System.out.println("부모 클래스 생성자");
}
}
class Child extends Parent {
Child() {
super();
System.out.println("자식 클래스 생성자");
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
}
}
super()를 제거하면 코드가 어떻게 동작할까요?
내 답변:
"부모 클래스 생성자"
"자식 클래스 생성자"
super()를 제거해도 결과는 똑같아.
마지막 문제가 내가 물어봤던 문제와 똑같이 생긴 문제라 해설은 넘어간다. 꽤 그럴듯하게 내주는데 ㅋㅎㅋㅎ...그냥 기출 풀어보는게 나을거 같다. ㅋㅋㅋㅋ 재미 겸 공부 삼아 문제 풀이 해봤다.
'멘토링' 카테고리의 다른 글
[SpringBoot] 날짜 별 폴더생성 및 이미지 정렬 (서버->프론트 UI) (0) | 2025.05.12 |
---|---|
React랑 Spring 연동 후 간단한 예제 실행 (0) | 2025.04.29 |
[Java] super와 this, 상속 개념 스터디 (0) | 2025.04.21 |
[Java] OOP 개념과 특징 (0) | 2025.04.18 |
전역변수 vs 지역변수 vs 정적변수 (0) | 2025.04.14 |