데이터 은닉
- public으로 선언된 것들을 private접근으로 막자
- 공개되는 메서드를 통한 접근 통로 마련
-setter / getter
데이터 보호
- setter / getter메소드 내부에서 데이터 보호에 대한 로직 작성
디자인패턴
Singleton 디자인패턴
- 객체의 생성을 제한해야하는 경우
1. 여러개의 객체가 필요 없는 경우
- stateless객체 : 객체를 구별할 필요가 없는 경우, 기능만 있는경우
- 객체를 계속 생성/삭제하는데 많은 비용이 들어서 재사용이 유리한 경우
- 만드는 방법
1. 외부에서 생성자 접근 금지 - 생성자의 접근 제한자를 private
- 내부에서는 private에 접근 가능하므로 직접 객체 생성 - 멤버변수 private
- 외부에서 private member에 접근 가능한 getter생성
- 객체 생성없이 접근가능하도록 static추가
메모리에 있더라도 참조하는 변수의 타입에 따라 접근할 수 있는 내용이 제한.
자식을 부모타입으로 받으면 자식의 기능이 메모리에 있지만 사용할 수 없다.
상위 타입을 하위타입으로 형 변환할 시
- 무작정 자손으로 바꿀 수는 없다.
-실행 시 오류 발생. 컴파일시 확인 불가- instanceof연산자를 사용하여 변경가능한 지 확인
class SuperClass {
String x = "super";
public void method() {
System.out.println("super class method");
}
}
class SubClass extends SuperClass {
String x = "sub";
@Override
public void method() {
System.out.println("sub class method");
}
}
public static void main(String[] args) {
SubClass subClass = new SubClass();
System.out.println(subClass.x);
subClass.method();
SuperClass superClass = subClass;
System.out.println(superClass.x);
superClass.method();
}
위 코드의 결과는 ?
sub
sub class method
super
sub class method
정적바인딩
- 컴파일 단계에서 참조 변수의 타입에 따라 연결이 달라짐
- 상속 관계에서 객체의 멤버변수(static/instance)가 중복될 때 또는 static method
동적바인딩
- 다형성을 이용해서 메서드 호출이 발생할 때 runtime에 메모리의 실제 객체의 타입으로 결정
- 상속 관계에서 객체의 instance method가 재정의(오버라이드)되었을 때 마지막에 재정의 된 자식 클래스의 메서드가 호출됨
println()은 toString()이 출력됨. 따라서 자식 클래스에서 재정의해서 사용.
상위 타입으로 올라갈 수록 활용도가 높아지지만 복잡성이 증가 !
따라서 많은 경우 비즈니스 로직 상 최상위 객체를 사용하는 것이 좋다.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}