🟰 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.