참고
- p.144~150
- OOP2_Basic.java : 기본설명
- ProTest_01.java , ProTest_02.java, ProTest_03.java(z_exam) : 접근제어자
- TimeTest.java : 캡슐화
제어자
- 변수, 메서드 그리고 클래스의 선언부에 사용이 된다.
- 일반적으로 접근제어자를 가장 왼쪽에 써준다.
private static final int a;
접근제어자
public
- 같은 프로젝트 내에서 접근제한이 없다
- 클래스가 public이면 생성자도 public
protected ★
- 같은 패키지 + 다른 패키지에 있는 클래스의 자손클래스에서 사용가능
- 클래스에는 사용불가 ★
- 상속이 먼저 이루어져야 쓸 수 있는데, protected class로 선언이 되면 상속자체가 될 수 없기 때문
- 잘 쓰이지는 않음
default
private
- 같은 클래스 내에서만 사용가능
- 클래스에는 사용 불가 ★
- 클래스는 다른 곳에서 쓰려고 만드는 것이기때문
그 외 제어자
static (클래스의, 공통적인)
- 모든 인스턴스가 공통으로 사용하는 녀석
- 변수, 메서드, 초기화블럭에 사용할 수 있다.
- 변수나 메서드에 사용시
- 1) 모든 인스턴스에서 공통적으로 사용
- 2) 인스턴스의 생성없이 사용할 수 있다.
- 3) 클래스가 Method Area에 로드될때 같이 생성된다.
- 4) 클래스 멤버에서는 인스턴스 멤버를 호출할 수 없다.
final (마지막의, 변경될 수 없는)
- 변수에 사용시, 값을 변경할 수 없는 상수가 된다.
- 메서드에 사용시, 오버라이드할 수 없는 메서드가 된다. (= 수정해서 못 쓴다)
- 클래스에 사용시, 상속할 수 없는 클래스가 된다. (=부모 클래스가 될 수 없다)
abstract (추상의, 미완성의)
추상메서드
- 메서드는 선언부와 구현부로 되어있지만 추상메서드는 선언부만 존재
- 물끓이는 기능은 있는데 끓이는 방법이 적혀있지 않음
추상클래스
- 추상메서드를 한 개라도 가지고 있으면 해당 클래스는 추상클래스가 되어야한다
- 클래스는 뭉텅이, 선언부+구현부 아님
abstract class A{
abstract void method();
}
캡슐화
- p.149~150
- 접근제어자를 사용하는 이유
- 외부로부터 데이터를 보호하기 위해서
- 외부에는 불필요한 부분을 감출 수 있다.
DTO: Data Transfer Object
class MemberDTO{
String mem_id;
String mem_pw;
String mem_name;
}
VO: Variable Object
- 테이블2개조인하면서 필요한컬럼속속속빼서 유동적으로 만든 테이블은 VO
- 우리가 주로 쓰는 것
class MemberCartVO{
}
생성자의 접근제어자
- 인스턴스의 생성을 제한
- 생성자의 접근제어자를 private으로 할 경우
- 외부에서는 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없다.
- 다른 클래스의 조상이 될 수없다. 그러므로 final을 붙여 주어야 한다.
싱글톤패턴
- SingletonTest.java
- 지금까지는 필요할때마다 객체를 만들었지만 이제는 객체 생성에 제한을 둘 것임.
- 기존: default 싱글톤: private -> 객체생성 불가능
- 그럼 객체를 얻어올 수 있는 메소드를 만들어서 써야함
- 특정 클래스의 객체가 오직 한 개만 존재하도록 보장한다. 즉 클래스의 객체를 하나로 제한한다.
- 고급자바부터 100% 적용됨
- 가장 많이 쓰이는 패턴
- 프로그램실행 -> 클래스 전부 로드 -> 객체 전부 생성해서 바로 사용 (실행 속도는 빠르나 처음 로드시 오래걸림)
public class SingletonTest{
public static void main(String[] args){
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
}
}
final class Singleton{
static private Singleton s;
private Singleton(){
}
static Singleton getInstance(){
if( s == null){
s = new Singleton();
}
return s;
}
}