코딩일기/자격증

[정보처리기사] [Java] static 변수와 메서드 이해 | 싱글톤 패턴 활용 | 정보처리기사 실기 기출문제(2021년 3회)

jhy_2023 2025. 3. 23. 19:44
728x90
반응형

2021년 3회 정보처리기사 실기 기출문제

문제

다음 Java 코드의 실행 결과를 구하시오.

class Connection {
  private static Connection _inst = null;
  private int count = 0;
    static public Connection get() {
      if(_inst == null) {
      _inst = new Connection();
      return _inst; 
      }
    return _inst;
    }
  public void count() { count ++; }
  public int getCount() { return count; }
}
 
public class testcon {
  public static void main(String[] args) {
    Connection conn1 = Connection.get();
    conn1.count();
    Connection conn2 = Connection.get();
    conn2.count();
    Connection conn3 = Connection.get();
    conn3.count();
    
    System.out.print(conn1.getCount());
  }
}

정답

3

반응형

해설

🔎 참고

2025.01.18 - [코딩일기] - [Java] 객체지향의 핵심 개념: 상속, 오버로딩, 오버라이딩, 하이딩

 

[Java] 객체지향의 핵심 개념: 상속, 오버로딩, 오버라이딩, 하이딩

📌 객체지향 프로그래밍의 주요 특징객체지향 프로그래밍(OOP, Object-Oriented Programming)은 다음과 같은 네 가지 주요 특징을 가집니다:1️⃣ 캡슐화(Encapsulation)데이터를 외부에서 직접 접근하지 못

august-jhy.tistory.com

📌문제 헤설

1️⃣ static 변수와 메서드

static은 클래스 차원에서 공유되는 변수를 정의하거나, 클래스 자체에서 호출할 수 있는 메서드를 정의할 때 사용합니다.

  • static 변수
    • 클래스의 모든 인스턴스가 공유하는 변수입니다. 즉, 하나의 인스턴스가 변경하면 다른 모든 인스턴스에 영향을 미칩니다.
    • 예시: private static Connection _inst = null;
      • 이 변수는 모든 Connection 객체가 동일한 _inst 변수를 공유합니다.
  • static 메서드
    • static 메서드는 클래스 이름을 통해 직접 호출할 수 있으며, 인스턴스를 생성하지 않고도 호출할 수 있습니다.
    • 예시: static public Connection get() {...}
      • 이 메서드는 Connection 클래스의 인스턴스를 생성하지 않고도 호출할 수 있습니다. 

2️⃣ Connection 클래스

class Connection {
  private static Connection _inst = null;  // static 변수, 모든 인스턴스가 공유
  private int count = 0;  // 인스턴스 변수, 인스턴스마다 독립적인 변수

  static public Connection get() {
    if (_inst == null) { //  _inst가 null일 때만 새 인스턴스 생성
      _inst = new Connection();  // 첫 번째 호출 시 새로운 인스턴스를 생성
      return _inst; 
    }
    return _inst;  // 두 번째 이후에는 이미 생성된 인스턴스를 반환
  }

  public void count() { count++; }  // count 변수의 값을 증가시키는 메서드
  public int getCount() { return count; }  // count 값을 반환하는 메서드
}
  • Connection 클래스에는 static 변수 _inst가 있습니다.
    이 변수는 Connection 클래스의 모든 인스턴스가 공유하는 변수입니다.
  • _inst = null은 Connection 객체가 생성되지 않은 상태를 의미합니다.
  • get() 메서드는 _inst가 null일 경우에만 새로운 Connection 객체를 생성하고, 그 이후에는 동일한 인스턴스를 반환합니다. 즉, if (_inst == null) 조건에서 첫 번째 호출 시에만 객체를 생성하고, 그 후에는 이미 생성된 _inst를 계속 반환합니다.
  • count() 메서드는 count라는 인스턴스 변수를 증가시키는 역할을 합니다.

3️⃣ testcon 클래스

public class testcon {
  public static void main(String[] args) {
    Connection conn1 = Connection.get();  // 첫 번째 호출
    conn1.count();  // conn1의 count 증가

    Connection conn2 = Connection.get();  // 두 번째 호출 (이미 인스턴스가 존재)
    conn2.count();  // conn2의 count 증가

    Connection conn3 = Connection.get();  // 세 번째 호출 (이미 인스턴스가 존재)
    conn3.count();  // conn3의 count 증가

    System.out.print(conn1.getCount());  // conn1의 count 출력
  }
}
  • Connection.get() 첫 번째 호출
    • Connection.get()을 통해 conn1 객체를 얻습니다.
      이때 Connection 클래스의 인스턴스가 생성되며 _inst 변수에 할당됩니다.
    • get() 메서드는 static이므로 Connection.get()처럼 "클래스.메소드명" 형식으로 객체를 생성하지 않고 호출할 수 있습니다.
    • conn1.count()를 호출하면 count 값은 0에서 1로 증가합니다.
  • Connection.get() 두 번째 호출
    • Connection.get()을 통해 conn2 객체를 얻습니다.
      하지만 이미 Connection 클래스의 인스턴스가 _inst에 존재하므로, conn2도 동일한 인스턴스를 참조하게 됩니다.
    • 따라서 conn2.count()를 호출하면 count 값이 1에서 2로 증가합니다.
  • Connection.get() 세 번째 호출
    • Connection.get()을 통해 conn3 객체를 얻습니다. 마찬가지로 conn3도 같은 인스턴스를 참조하게 됩니다.
    • 따라서 conn3.count()를 호출하면 count 값은 2에서 3으로 증가합니다.
  • 결과 출력
    • 마지막으로 System.out.print(conn1.getCount());가 호출됩니다.
    • conn1은 conn2, conn3와 동일한 인스턴스를 참조하고 있기 때문에, count 값은 3입니다. 따라서 3이 출력됩니다.

 

728x90
  • [참고] Connection.get() 메서드가 처음 호출될 때, _inst는 null입니다. 그래서 new Connection()을 통해 새로운 객체가 생성되고 _inst에 저장됩니다. 그 후에 Connection.get()을 호출할 때마다, 이미 생성된 객체인 _inst를 반환합니다. 즉, 모든 conn1, conn2, conn3는 같은 인스턴스를 참조하게 되는 것입니다.
  • [참고] count 변수는 static 변수가 아니므로 각 인스턴스마다 따로 존재할 것 같지만, 같은 인스턴스를 참조하고 있기 때문에 count 값도 공유됩니다. conn1, conn2, conn3는 모두 동일한 객체를 참조하기 때문에 count 값을 모두 같이 증가시킵니다. 처음에 count 값은 0이었고, 각 호출마다 count 값이 증가하여 최종적으로 3이 됩니다.
  • [참고] 싱글턴 패턴(Singleton Pattern)은 객체의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴입니다. 쉽게 말해, 클래스에서 하나의 객체만 존재하도록 하고, 그 객체를 전역적으로 접근할 수 있게 만드는 패턴입니다.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형