객체지향

jm·2022년 7월 18일
0

2022-07-18, 추가 22-09-15
Object Oriented Programming
객체(Object)란? 주체가 아닌, 주체가 활용하는 것이다.
객체는 언제든 교체해도 상관 없고, 기본 프로세스가 변경되지 않는다.

블록 형태의 모듈화된 프로그래밍의 특징
  • 신뢰성 높은 프로그래밍이 가능하고, 생산성 향상된다.
  • 추가/수정/삭제가 용이 = 유지보수가 우수하다.
  • 재 사용성이 높다.
  • 하지만 반드시 사용해야하는 것은 아니다.
현실 세계 객체, 클래스, 프로그램의 객체(instance, object)의 관계

현실의 객체가 갖는 속성과 기능은 추상화(abstraction) 되어 클래스에 정의된다!
클래스는 구체화 되어 프로그램의 객체(instace, object)가 된다.

  • 상태, 속성 - 변수, 필드
  • 기능, 행위 - 메소드, 함수

클래스(data type): 객체를 정의해 놓은 것. 객체의 설계도, 틀
객체(메모리에 생성된 데이터): 클래스를 데이터 타입으로 메모리에 생성된 것

OOP

oop is A PIE

Abstraction(추상화)

  • simplification(간략화) <class, data> 클래스 껍질 만들기, 데이터와 메서드를 생성한다.
  • abstraction (method) = 누가 어떤 식으로 만들었는 지는 몰라도 활용가능하면 사용할 수 있다. API 사용!
  • 모든 자손 클래스에서 사용 하는 메서드는 공통 모듈로 만들자!
  • 부모클래스에서는 필요가 없는 메서드임. 하지만 자손클래스의 메서드를 가져오기 위해서는 부모클래스에서 선언 되어있어야함.
    → 추상클래스(abstract)를 만들어서 구현부 없이 선언부만 남김!

    모든 자식들이 사용하고, 자식 들이 다른 기능이 필요할 때 필요!

Polymorphism(다형성)

다형성의 정의 : 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스(참조)할 수 있다. 자식이 생성되면 부모는 자식의 객체를 참조할 수 있다.

다형성의 활용 1

  • 다른 타입의 객체를 하나의 배열로 관리 가능하다.(상속 관계일 때)

다형성의 활용 2

1. Overriding : 자식클래스에서 같은 메소드를 재정의

  • 부모 타입으로 자식 생성 V v1 = new A();
  • 부모 타입으로 자식 참조
    A a2 = new A(); V v1 = a2;
  • 부모 메소드에 없어도 자식에 있으면 자식것을 호출해서 사용
//Overriding은 static X
//부모 타입으로 자식으로 쓸 수 있음 (Polymorphism)
//자식의 종류에 따라 다양한 형태로 변환.
//부모의 method가 자식의 형태에 따라 다양한 형태로 변함
V v1 = new A();
V v2 = new B();
V v3 = new C();

개발자의 실수를 방지하기위해 @override 표시

  • 오버라이딩의 조건
    • 메서드 이름이 같아야 한다.
    • 매개 변수의 개수, 타입, 순서가 같아야한다.
    • 리턴 타입이 같아야 한다.
    • 접근 제한자는 부모 보다 범위가 넓거나 같아야 한다.
    • 조상보다 더 큰 예외처리는 불가능 하다.

2. Overloading : 같은 이름의 메서드의 인자의 수나 자료형이 다른 경우

  • ex) System.out.println()을 통해 여러개의 데이터 타입을 전부 출력해볼 수 있다. -> 시간 단축에 필수

참조형 객체의 형변환

하위 데이터타입에서 상위 데이터타입으로 변환은 묵시적 캐스팅 이라한다.
반대로 상위에서 하위로의 변환은 명시적캐스팅 이라고하고 변환되는 형태를 붙여줘야한다.

	Vehicle vehicle = new Car();
    Car car = (car)vehicle; //상위 데이터 타입인 Vehicle에서 Car로 변환

@오버라이드 되어있는 상황이면 부모에서 method를 불러도 자식 메서드를 호출한다.

  • 상속 관계에서 객체의 멤버 변수가 중복 될 때
    • 참조 변수의 타입에 따라 연결이 달라짐
  • 상속 관계에서 객체의 메서드가 중복 될 때 (메서드가 override 일 때)!!!!
    • 무조건 자식 클래스의 메서드가 호출됨 - > virtual method invocation
    • 최대한 메모리에 생성된 실제 객체에 최적화 된 메서드가 동작한다.

Inheritance(상속)

  • 부모의 것 사용 extends
  • 아버지의 생성자를 먼저!! 초기화
  • 생성자는 안만들면 default로 설정됨.
  • 기존 클래스의 자산 (멤버)을 자식 클래스에서 재사용하기 위한 것
    • 부모의 생성자와 초기화 블록은 상속하지 않는다.
  • 기존 클래스의 멤버를 물려 받기 때문에 코드의 절감
    • 부모의 코드를 변경하면 모든 자식들에게도 적용 → 유지보수성 향상
  • 상속의 적용
    • extends 키워드 사용
  • 상속의 관계는 is a 관계
    • Person is a Object, SpierMan is a Person
  • java는 단일 상속만 가능

Encapsulation(캡슐화)

데이터 보안, 데이터를 한번에 담아서 줌

  • member를 숨김. (private으로 숨기고 public으로 보여주기만 함)
  • package(java.lang을 빼고는 전부 import 해야함)
  • 동시에 같은 이름이 있으면 최종 위치(자식)에서 멤버 찾는다.
    → 자식쪽의 데이터를 사용하려면 null, 0일 수 있다. 자식에서 부모와 같은 멤버 변수를 쓰지 말자!

접근 제한자 : public, protected, (default = package), private

  • 그 외 제한자.
    • static : 클래스 레벨의 요소 결정
    • final : 요소를 더이상 수정할 수 없게 함
    • abstract : 추상 메서드 및 추상 클래스 작성
    • synchronized : 멀티스레드에서의 동기화 처리
  • 일반적으로 접근 제한자를 맨 앞으로

final

  • 용도
    • final class : 확장 불가, 상속 금지 → 오버라이드 방지 (이미 완벽해서 수정필요X)
      • 이미 완벽한 클래스들 (String, Math, ~)
    • final method : 더 이상 재정의 할 수 없음. overriding 금지! (자식이 재정의 불가!)
    • final variable : 더 이상 값을 바꿀 수 없음. 상수화
  • 실수를 안하게 도와주는 것! (확장을 막는 개념이 아님)

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

  • 여러 개의 객체가 필요 없는 경우
    • 객체를 구별할 필요가 없는 경우 = 수정 가능한 멤버 변수가 없고 기능만 있는 경우
    • 이런 객체를 stateless라고 한다.
  • Singleton 디자인 패턴
    • 외부에서 생성자에 접근 금지 → 생성자의 접근 제한자를 private으로 설정
    • 내부에서는 private에 접근 가능하므로 직접 객체 생성 → 멤버 변수이므로 private설정
    • 외부에서 private method에 접근 가능한 getter 새성 → setter는 불필요
    • 객체 없이 외부에서 접근할 수 있도록 getter와 변수에 static 추가
    • 외부에서는 언제나 getter를 통해서 객체를 참조하므로 하나의 객체 재사용

Interface

  • 오브젝트에 어떤 역할이 있는 지 설계 (기능)
  • 최상의 추상화 단계: 일반 메서드는 모두 abstract 형태이다.
  • extends를 이용해 상속
  • 다중상속 가능, implements 사용, 인스턴스화 불가능

필요성!

  • 구현의 강제로 표준화 처리 (abstract메서드 사용) → 손쉬운 모듈 교체 지원
  • 인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
    • ex) JDBC(인터페이스)라는 드라이버를 사용해 db에서 쉽게 가져올 수 있음.
  • 서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
  • 모듈 간 독립적 프로그래밍 가능 → 개발기간 단축
profile
ㅎㅎ

0개의 댓글