1. 싱글톤 패턴(SingleTon Pattern)이란?
특정 클래스의 인스턴스가 오직 하나만 존재하도록 하는 디자인 패턴이다.
이는 전역 변수로써 사용될 수 있고, 인트선스 생성 비용이 높은 클래스의 경우 유용하다.
싱글톤 패턴은 아래와 같은 구조를 지닌다.
public class Singleton {
// private 접근 권한을 갖는 정적 필드 선언 및 초기화
private static Singleton singleton = new Singleton ();
// private 접근 권한을 갖는 생성자 선언
private Singleton() {}
// public 접근 권한을 갖는 정적 메소드 선언
public static Singleton getInstance(){
return singleton;
}
}
패턴 해석: 생성자를 private 접근자로 제한하여, 외부에서 new 연산자로 생성자를 호출(인스턴스화)할 수 없도록 제한하는 것이 싱글톤 패턴의 핵심이다. 싱글톤으로 생성된 인스턴스에는 getInstance() 메소드를 통해서만 접근 가능하다.
2. 싱글톤 패턴의 장점
1) 보안성을 높일 수 있다.
2) 불필요한 객체 생성이 불가하여, 메모리 효율성을 높일 수 있다.
3. 코드로 알아보는 싱글톤 패턴
package Day09.Ex10_게시판.view; // Front 클래스 역할: 사용자로부터 입출력 받기
import java.util.Date;
import java.util.Scanner;
import Day09.Ex10_게시판.controller.BController;
public class Front {
// 필드 영역
// 1. 싱글톤 객체 생성
// 싱글톤으로 생성한 이유: 1개 객체를 생성하여 다른 클래스에서 공유하는 방식으로
// 설계가 가능하기 때문에 불필요한 객체 생성을 방지하여 메모리 효율성을 높이기 위함
private static Front front = new Front();
private Front() {}
public static Front getInstance() {
return front;
}
// 2. 입력 객체 생성 (private 선언 이유: Front 클래스 안에서만 접근가능하게 하여 안전성을 높이기 위함)
private Scanner scanner = new Scanner(System.in);
// 생성자 영역
// 메소드 영역
// 1. index 메소드 생성 (pulic 선언 이유: start 클래스에서 접근 허용하기 위함)
public void index() {
while( true ) {
System.out.println("1. 쓰기: ");
int ch = scanner.nextInt();
if( ch == 1 ) {
writePage();
}
}
}
// 2. 기능별 메소드 생성 (private 선언 이유: Front 클래스 안에서만 접근가능하게 하여 안전성을 높이기 위함)
private void writePage() {
System.err.println("----------------글 쓰기 페이지----------------");
System.out.println("제목: "); String title = scanner.next();
System.out.println("내용: "); String content = scanner.next();
System.out.println("작성자: "); String writer = scanner.next();
System.out.println("비밀번호: "); String pw = scanner.next();
Date date = new Date();
int view = 0;
boolean result = BController.getInstance().write(title, content, writer, pw, date, view);
if(result) {
System.out.println("[알림] 글쓰기 성공");
}
else {
System.out.println("[알림] 글쓰기 실패");
}
}
}
package Day09.Ex10_게시판; // start 클래스 역할: 실행
import Day09.Ex10_게시판.view.Front;
public class start {
public static void main(String[] args) {
Front.getInstance().index();
// 해석: Front.getInstance() = Front 클래스에서 생성한 front 인스턴스
}
}
4. Getter & Setter란?
객체 지향 프로그래밍에서 데이터 캡슐화를 위해 만들어진 메소드이다. Getter는 객체의 속성 값을 반환하고, Setter는 객체의 속성 값을 초기화한다.
Getter & Setter는 아래와 같은 형태로 구성되어 있다.
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
코드 해석: 위 코드에서, Person 클래스는 name과 age라는 두 개의 속성을 가지고 있다. Getter와 Setter는 각 속성에 대한 메소드로써, getName()은 name 속성의 값을 반환하고, setName()은 name 속성의 값을 초기화한다. 마찬가지로, getAge()는 age 속성의 값을 반환하고, setAge()는 age 속성의 값을 설정한다.
5. Getter & Setter의 필요성 및 정리
객체의 필드(데이터)를 외부에서 마음대로 읽고 변경할 경우, 객체의 무결성이 깨질 수 있다.
이러한 문제점을 방지하기 위해 객체 지향 프로그래밍에서는 외부에서의 직접적인 필드 접근을 제한하고, 메소드를 통해 필드에 접근하는 것을 선호한다. 이유는, 메소드를 이용하여 데이터를 검증하여 유효한 값만 필드에 저장할 수 있기 때문이다. 이러한 역할을 하는 메소드를 Setter라고 일컫는다.
또한, 외부에서 객체의 필드를 읽을 때에도 메소드가 필요한 경우가 있다.
필드값이 객체 외부에서 사용하기에 부적절한 경우, 메소드를 이용하여 적절한 값으로 변환하여 사용할 수 있기 때문이다. 이러한 역할을 하는 메소드를 Getter라고 일컫는다.
'자바(Java)' 카테고리의 다른 글
Java Collection - 1 (0) | 2023.07.19 |
---|---|
Java Generic (0) | 2023.07.03 |
Java 클래스(class)란? (0) | 2023.03.01 |
Java JVM(Java Virtual Machine)과 Runtime Data Area (0) | 2023.02.28 |
Java 반복문, 제어문 활용 (console 가위바위보, 예금, 키오스크) (0) | 2023.02.27 |