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