객체지향 언어의 특징

OOP is A P.I.E

  • 추상화(Abstraction) : 현실의 객체를 추상화해서 클래스를 구성한다.
  • 상속(Inheritance) : 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용이 가능하다.
  • 정보은폐(Information Hiding, EnCapsulation) : 데이터를 외부에 직접 노출시키지 않고 메서드를 아용해 보호할 수 있다.
  • 다형성(Polymorphism) : 하나의 객체를 여러 가지 타입(형)으로 참조할 수 있다.

접근제한자와 데이터 은닉과 보호

제한자(modifier)

  • 클래스, 변수, 메서드 선언부에 함께 사용되어 부가적인 의미 부여
  • 종류
    • 접근 제한자: public, protected, (default = package), private
    • 그 외 제한자
      • static: 클래스 레벨의 요소 설정
      • final: 요소를 더 이상 수정할 수 없게 함
      • abstract: 추상 메서드 및 추상 클래스 작성
      • synchronized: 멀티스레드에서의 동기화 처리
  • 하나의 대상에 여러 제한자를 조합 가능하나 접근 제한자는 하나만 사용 가능
  • 순서는 무관하나 일반적으로 접근 제한자를 맨 앞으로

final

  • 마지막, 더 이상 바뀔 수 없음
  • 용도
    • final class - 더 이상 확장 할 수 없음 : 상속 금지 -> 오버라이드 방지, ex) String, Math, …
    • final method - 더 이상 재정의 할 수 없음 : overriding 금지
    • final variable - 더 이상 값을 바꿀 수 없음 : 상수화

접근 제한자(Access modifier)

  • 멤버 등에 사용되며 해당 요소를 외부에서 사용할 수 있는지 설정
  • public : 어디서든 접근 가능
  • protected : 같은 클래스, 같은 패키지, 다른 패키지의 자손 클래스까지 접근 가능
  • package(default) : 같은 클래스, 같은 패키지에서 접근 가능
  • private : 같은 클래스에서만 접근 가능

  • method override 조건의 확인
    부모의 제한자 범위와 같거나 넓은 범위로만 사용 가능

데이터 은닉과 보호(Encapsulation)

  • 누군가 당신의 정보를 마음대로 바꾼다면?
  • 소중한 정보가 보호되지 못하는 이유는?
    • 외부에서 변수에 직접 접근하기 때문
  • 정보를 보호하기 위한 대책은?
    • 변수는 private 접근으로 막기
    • 공개되는 메서드를 통한 접근 통로 마련: setter/ getter
      • 메서드에 정보 보호 로직 작성

객체의 생성 제어와 Singleton 디자인 패턴

  • 객체의 생성을 제한해야 한다면?
    • 여러 개의 객체가 필요 없는 경우
      • 객체를 구별할 필요가 없는 경우 = 수정 가능한 멤버 변수가 없고 기능만 있는 경우
      • 이런 객체를 stateless한 객체라고 한다. 상태를 가지지 않고 기능만 가지는 클래스!!!
    • 객체를 계속 생성/삭제 하는데 많은 비용이 들어서 재사용이 유리한 경우

  • Singleton 디자인 패턴
    • 외부에서 생성자에 접근 금지 -> 생성자의 접근 제한자를 private으로 설정
    • 내부에서는 private에 접근 가능하므로 직접 객체 생성 -> 멤버 변수이므로 private 설정
    • 외부에서 private member에 접근 가능한 getter 생성 -> setter는 불필요
    • 객체 없이 외부에서 접근할 수있도록 getter와 변수에 static 추가

    • 외부에서는 언제나 getter를 통해서 객체를 참조하므로 하나의 객체 재사용