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 |