멘토링

[Java] 지역 전역 변수 접근지정자 생성자 상속 Copilot 문제 풀어보기

TMJeti 2025. 4. 21. 16:28

문제는 북 프로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()를 제거해도 결과는 똑같아.

마지막 문제가 내가 물어봤던 문제와 똑같이 생긴 문제라 해설은 넘어간다. 꽤 그럴듯하게 내주는데 ㅋㅎㅋㅎ...그냥 기출 풀어보는게 나을거 같다. ㅋㅋㅋㅋ 재미 겸 공부 삼아 문제 풀이 해봤다.