객체지향 언어의 특징

OOP is A P.I.E

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

다형성

다형성(Polymorphism)

  • 하나의 객체가 많은 형(타입)을 가질 수 있는 성질
  • 정의 : 상속관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스 할 수 있다.

다형성의 활용 예1 - 다른 타입의 객체를 다루는 배열

  • 배열의 특징 : 같은 타입의 데이터를 묶음으로 다룬다.
  • 다형성으로 다른 타입의 데이터(Person, SpiderMan)를 하나의 배열로 관리
  • Object는 모든 클래스의 조상으로 Object의 배열은 어떤 타입의 객체라도 다 저장할 수 있음
  • 자바의 자료 구조를 간단하게 처리할 수 있음

다형성의 활용 예2 - 매개변수의 다형성

  • 메소드가 호출되기 위해선 메소드 이름과 파라미터가 맞아야하는데… 조상을 파라미터로 처리한다면 객체의 타입에 따라 메소드를 따로 만들 필요가 없음
  • API에서 파라미터로 Object를 받는다는 것은 모든 객체를 처리한다는 말이다.
  • 필요하다면 하위 클래스에서 오버라이딩 필요

다형성 활용

다형성과 참조형 객체의 형 변환

  • 메모리에 있는 것과 사용할 수 있는 것의 차이
    • 메모리에 있더라도 참조하는 변수의 타입에 따라 접근할 수 있는 내용이 제한됨

참조형 객체의 형 변환

  • 작은 집(child)에서 큰 집(super)으로 -> 묵시적 캐스팅
    • 자손 타입의 객체를 조상 타입으로 참조: 형변환 생략 가능
      Phone phone = new Phone();
      Object obj = phone;
      
  • 큰집(super)에서 작은 집(child)으로 -> 명시적 캐스팅
    • 조상 타입을 자손 타입으로 참조: 형변환 생략 불가
      Phone phone = new SmartPhone();
      SmartPhone sPhone = (SmartPhone)phone;
      
  • 조상을 무조건 자손으로 바꿀 수는 없다
    • instanceof 연산자로 확인 후 형변환!
      • 실제 메모리에 있는 객체가 특정 클래스 타입인지 boolean으로 리턴 ```java Person person = new Person();

    if(person instanceof SpiderMan){ SpiderMan sman = (SpiderMan)person; } ```

참조 변수의 레벨에 따른 객체의 멤버 연결

  • 상속 관계에서 객체의 멤버 변수가 중복될 때
    • 참조 변수의 타입에 따라 연결이 달라짐
  • 상속 관계에서 객체의 메서드가 중복될 때(메서드가 override 되었을 때)
    • 무조건 자식 클래스의 메서드가 호출됨 -> virtual method inovation
    • 최대한 메모리에 생성된 실제 객체에 최적화 된 메서드가 동작한다.
  • 상위로 올라갈 수록 활용도도 높아짐, 하지만 코드의 복잡성도 함께 증가
  • Java API처럼 공통 기능인 경우 Object를 파라미터로 쓰겠지만 많은 경우 비즈니스 로직 상 최상위 객체 사용 권장