
🟰 2021년 3회차 기출 1번과 동일
class Connection { // class Connecton 정의
Ⓐ 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 SingleTon {
public static void main(String[] args) {
❶ Connection conn1 = Connection.get();
❻ conn1.count();
❽ Connection conn2 = Connection.get();
❿ conn2.count();
⓫ Connection conn3 = Connection.get();
⓬ conn3.count();
⓭ conn1.count();
⓮⓰ System.out.print(conn1.getCount());
}
}
🖍 4
🔍 설명:
이 코드는 싱글톤(Singleton) 패턴을 사용하여
Connection객체를 하나만 생성하고, 그 하나의 인스턴스를 계속 재사용한다.
1.Connection.get()동작:static public Connection get() { if (_inst == null) { _inst = new Connection(); // 객체가 아직 없으면 생성 return _inst; } return _inst; // 이미 있으면 그대로 반환 }→
Connection객체는 처음 한 번만 생성되고, 이후에는 같은 객체가 반환됨.
2. 실행 흐름:Connection conn1 = Connection.get(); // 객체 생성 (_inst == null) conn1.count(); // count = 1 Connection conn2 = Connection.get(); // 같은 객체 반환 conn2.count(); // count = 2 Connection conn3 = Connection.get(); // 같은 객체 반환 conn3.count(); // count = 3 conn1.count(); // count = 4 System.out.print(conn1.getCount()); // 출력: 4→ 모든
conn1,conn2,conn3는 같은 객체를 참조하므로count()호출은 누적되어 총 4번 증가.
Ⓐ private static Connection _inst = null; : Connection 클래스의 객체 변수 _inst_를 선언하고 null로 초기화.
✶ 객체 생성 예약어인 new가 생력되었으므로 생성이 아닌 선언만 함. 객체 변수를 선언만 하게 되면 heap이 아닌 stack 영역에 내용 없이 저장되어 사용이 불가능.
✶ 객체 변수를 생성한다는 것은 Connection _inst = new Connection();과 같이 객체 생성 예약어인 new를 통해 heap 영역에 공간을 확보하여 Connection 클래스의 내용을 저장한 후 그 주소를 객체 변수에 저장하는 것.
Ⓑ 
❶ Connection conn1 = Connection.get();에 의해 Connection 클래스의 객체 변수 conn1을 선언하고 get() 메소드를 호출한 결과를 저장.
⁃ Ⓐ에서와 같이 객체 변수를 선언만 하였으므로 객체 변수 conn1은 stack에 생성됨.
✶ Connection 클래스의 get() 메소드는 public static으로 선언되었고, Connection 객체를 만들지 않고도 호출할 수 있는 정적 메소드.
❷ Connetction의 형을 반환하는 get()메소드의 시작점.
❸ _inst가 null이면 ❹,❺번을 수행하고, 아니면 ❾번으로 이동. _inst가 null이므로 ❹번으로 이동.
❹ Connetction 클래스의 내용을 heap 영역에 저장하고 그 주소를 _inst에 저장함.
⁃ Ⓐ에서 객체 변수 _inst는 이미 선언되었으므로, Connection _inst = new Connection();와 같이 작성하지 않고 앞쪽의 클래스명을 생략하여 _inst = new Connection();와 같이 작성함. 생성 예약어인 new를 통해 heap 영역에 공간을 확보하고 Connection 클래스의 내용을 저장한 후 그 주소를 객체 변수 _inst에 저장함. ∴ 객체 변수 _inst는 Connetcion() 클래스의 내용이 저장된 heap 영역을 가리키게 됨.

❺ _inst에 저장된 값을 메소드를 호출했던 ❶으로 이동. ❺에서 돌려받은 _inst의 값을 conn1에 저장.
⁃ _inst에는 Connection() 클래스의 내용이 저장된 heap의 영역의 주소가 저장되어 있으며, conn1에도 동일한 주소가 저정되므로, _inst와 conn1은 같은 heap의 영역의 주소를 가리키게 됨.
❻ conn1의 count() 메소드를 호출. (conn1은 Connection() 클래스의 객체 변수이므로 Connection() 클래스의 count() 메소드를 호출한다는 의미.)
❼ 반환값이 없는 count() 메소드의 시작점. count 값에 1를 더한 후 count() 메소드를 호출했던 ❻으로 돌아가 다음 문장인 ❽번을 수행. ∴ count = 1
【❽ Connection 클래스의 객체 변수 conn2을 선언하고 get() 메소드를 호출한 결과를 저장.
❷번으로가 get() 실행. _inst의 값이 null이 아니므로 ❾으로 이동.
❾ _inst의 저장된 값을 메소드를 호출했던 ❽으로 반환. ❾에서 돌려받은 _inst의 값을 conn2에 저장.
❿ conn2의 count() 메소드를 호출. ❼번으로 가 count 값에 1를 더한 후 count() 메소드를 호출했던 ❿번으로 돌아가 다음 문장 실행.】 ∴ count = 2
⓫~⓬번은 【 ... 】 반복. ∴ count = 3
⓭ conn1의 count() 메소드를 호출. ❻번 문장과 동일하게 실행됨. ∴ count = 4

⓮ conn1의 getCount() 메소드 호출하고 돌려받은 값을 출력.
⓯ 정수를 반환하는 getCount() 메소드의 시작점. count의 값 4을 메소드로 호출했던 ⓰번으로 반환.
✶ 객체 변수 _inst, conn1, conn2, conn3은 모두 같은 heap 영역의 주소를 가리키고 있으므로 해당 heap의 영역에 저장된 내용을 공유하게 됨.
⓰ ⓯번에서 돌려 받은 값 4를 출력.
참고,
기출 문제 : https://newbt.kr/시험/정보처리기사%2520실기
길벗알앤디. 『정보처리기사 실기 단기완성』. 길벗. 2023.