본문 바로가기

자바(Java)

Java 싱글톤 패턴(SingleTon Pattern) / 게터&세터(Getter & Setter)

반응형

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 클래스는 nameage라는 두 개의 속성을 가지고 있다. Getter와 Setter는 각 속성에 대한 메소드로써, getName()name 속성의 값을 반환하고, setName()name 속성의 값을 초기화한다. 마찬가지로, getAge()age 속성의 값을 반환하고, setAge()age 속성의 값을 설정한다.

 

5. Getter & Setter의 필요성 및 정리

객체의 필드(데이터)를 외부에서 마음대로 읽고 변경할 경우, 객체의 무결성이 깨질 수 있다.

이러한 문제점을 방지하기 위해 객체 지향 프로그래밍에서는 외부에서의 직접적인 필드 접근을 제한하고, 메소드를 통해 필드에 접근하는 것을 선호한다. 이유는, 메소드를 이용하여 데이터를 검증하여 유효한 값만 필드에 저장할 수 있기 때문이다. 이러한 역할을 하는 메소드를 Setter라고 일컫는다.

또한, 외부에서 객체의 필드를 읽을 때에도 메소드가 필요한 경우가 있다.
필드값이 객체 외부에서 사용하기에 부적절한 경우, 메소드를 이용하여 적절한 값으로 변환하여 사용할 수 있기 때문이다. 이러한 역할을 하는 메소드를 Getter라고 일컫는다.

 

반응형