[Java] 제한자와 데이터 은닉 및 보호
Language/Java

[Java] 제한자와 데이터 은닉 및 보호

1. 제한자

 

제한자 정의

- 여러 상황에 제한을 두기 위해 클래스, 변수, 메서드 선언부에 사용됨

- 접근 제한자 : public, protected, default = package(생략 가능), private

- 그 외 제한자 : static, final, abstract, synchronized

- 접근 제한자는 하나만 사용가능(그 외 제한자는 조합 가능)

- 순서는 무관하나 일반적으로 접근 제한자를 제일 앞에 선언함

 

접근 제한자(Access Modifier)

- 요소를 외부에서 사용할 수 있는지 결정

- 부모의 제한자 범위와 같거나 넓은 범위로만 사용 가능(넓은 범위: public > protected > package(default) > private)

접근 제한자

 

final

- 더 이상 바뀔 수 없다는 의미

- final class : 오버라이드를 방지하기 위해 상속 금지

- final method : 오버라이드 금지

- final variable : 값을 바꿀 수 없는 상수

 

2. 데이터 은닉과 보호(Encapsulation)

- 정보를 보호하기 위해 외부에서 변수에 직접 접근하는 것을 막음

- 변수는 private로 접근을 막을 수 있음

- setter와 getter를 생성하여 오직 setter와 getter만 변수에 접근할 수 있도록 해야 함

- setter와 getter는 단지 생성만 한다고 데이터가 보호되지는 않기 때문에 setter와 getter 메서드 안에 보호할 수 있는 로직을 넣어야 함

- 프로그램을 안정적으로 구현하려면 꼭 필요함

class UserInfo{
    // name에 null 불가
    private String name="홍길동";
    
    // account는 0 보다 커야함
    private int account = 10000;
    
    // getter
    public String getName() {
    	return this.name
    }
    
    // setter
    public void setName() {
    	if (name != null) {
        	this.name=name;
        }else {
            System.out.println("null 금지");
        }
    }
}

public class Test {
    public static void main(String[] args) {
    	UserInfo info = new UserInfo();
        info.setName("장보고");	// 정상적으로 값이 저장
        System.out.println(info.getName());		// 장보고
        
        info.setName(null);	// null 금지
    }
}

 

Singleton 디자인 패턴

- 여러 개의 객체가 필요 없는 경우(=stateless 한 객체일 경우) 사용하는 디자인 패턴

- 생성자를 통해 외부에서 객체를 생성하기 때문에 생성자를 private로 바꿔 외부에서 생성자를 사용하지 못하도록 해야 합니다.

- 내부에선 private에 접근이 가능하므로 내부에서 객체를 private으로 생성

- 외부에서 접근 가능한 static getter를 생성(stateless 한 객체이기에 setter는 불필요)

- 하나의 객체를 계속해서 재사용하는 방식

 

싱글톤 디자인 패턴 미적용

// SayHello.java
class SayHello {
	void hello() {
    	System.out.println("Hello~~");
    }
}

// test.java
SayHello sh1 = new SayHello();		// 단지 출력만하기 때문에	
SayHello sh2 = new SayHello();		// 굳이 객체를 여러개 만들 필요 없음

sh1.hello();
sh2.hello();

 

 

싱글톤 디자인 패턴 적용

// SayHello.java
class SayHello {
    private static SayHello sh = new SayHello();	// 객체를 클래스 '내부'에서 한 개 생성
    
    // 외부에서 생성자에 접근하지 못 하도록 private
    private SayHello() {
    }
    
    public static SayHello getSayHello() {			// 오직 이 메서드를 통해 외부에서 접근
        return sh;
    }

	void hello() {
    	System.out.println("Hello~~");
    }
}

// test.java
SayHello sh1 = SayHello.getSayHello();		// 메서드가 static이어서 클래스를 통해 바로 메서드에 접근 가능
SayHello sh2 = SayHello.getSayHello();

sh1.hello();
sh2.hello();

 

'Language > Java' 카테고리의 다른 글

[Java] 추상 클래스와 인터페이스  (0) 2022.01.25
[Java] 다형성(Polymorphism)  (0) 2022.01.25
[Java] 패키지(Package)와 import  (0) 2022.01.21
[Java] 메서드 오버라이딩(Overriding)  (0) 2022.01.21
[Java] 상속(Inheritance)  (0) 2022.01.21