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()을 통해 conn1 객체를 얻습니다.
- Connection.get() 두 번째 호출
- Connection.get()을 통해 conn2 객체를 얻습니다.
하지만 이미 Connection 클래스의 인스턴스가 _inst에 존재하므로, conn2도 동일한 인스턴스를 참조하게 됩니다. - 따라서 conn2.count()를 호출하면 count 값이 1에서 2로 증가합니다.
- Connection.get()을 통해 conn2 객체를 얻습니다.
- 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
반응형
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] [ C ] 삼항 연산자와 비트 연산자(시프트 연산자) 활용 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.03.25 |
---|---|
[정보처리기사] [Java] static 변수와 메서드 | 싱글톤 패턴 | 정보처리기사 실기 기출문제(2024년 1회) (0) | 2025.03.23 |
[정보처리기사] [Java] 논리 연산자를 활용한 조건문 분석 | 연산자 우선순위 | 정보처리기사 실기 기출문제 (0) | 2025.03.23 |
[정보처리기사] [ C ] 포인터 배열과 주소 참조 | 정보처리기사 실기 기출문제 (0) | 2025.03.20 |
[정보처리기사] [ C ] 구조체 포인터와 배열 | 정보처리기사 실기 기출문제 (0) | 2025.03.10 |