다형성

다훈·2024년 7월 29일

다형성이란

다형성이란 객체지향 프로그래밍의 3대 특징 중 하나로 ‘여러 개의 형태를 갖는다’는 의미이며, 하나의 행동으로 여러 가지 일을 수행하는 개념을 뜻한다.
또한 상속을 이용한 기술로 부모 타입으로부터 파생된 여러 가지 타입의 자식 객체를 부모 클래스 타입 하나로 다룰 수 있는 기술이다.


클래스 형변환

[업 캐스팅]

  • 상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있다.
// Sonata 클래스는 Car 클래스의 후손

Car c = new Sonata();

// Sonata클래스형에서 Car클래스형으로 바뀜

[다운 캐스팅]

  • 자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우, 부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형 변환하는 것.
  • 자동으로 처리되지 않기 때문에 반드시 후손 타입을 명시해서 형 변환 해야한다.
//Sonata 클래스는 Car 클래스의 후손

Car c = new Sonata();

((Sonata)c).moveSonata();

객체배열과 다형성

  • 다형성을 이용하여 상속 관계에 있는 하나의 부모 클래스 타입의 배열 공간에 여러 종류의 자식 클래스 객체 저장 가능하다.
Car[] carArr = new Car[5]; 
carArr[0] = new Sonata();
carArr[1] = new Avante();
carArr[2] = new Grandure();
carArr[3] = new Spark();
carArr[4] = new Morning();

매개변수와 다형성

  • 다형성을 이용하여 메소드 호출 시 부모타입의 변수 하나만 사용해 자식 타입의 객체를 받을 수 있다.
public void execute() {
driveCar(new Sonata()); 
driveCar(new Avante());
driveCar(new Grandure());
}
public void driveCar(Car c) {}

바인딩

실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것. 프로그램이 실행되기 전에 컴파일이 되면서 모든 메소드는 정적 바인딩 된다.

동적 바인딩

  • 컴파일 시 정적 바인딩된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩 되는 것을 의미한다.

동적 바인딩 성립 요건

상속 관계로 이루어져 다형성이 적용된 경우, 메소드 오버라이딩이 되어 있으면 정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행한다.


추상 클래스와 추상 메소드

abstract의 사전적의미는 '추상적인' 이다.
abstract이 붙은 메서드를 추상 메소드 라고 한다.
abstract이 붙은 클래스를 추상 클래스 라고 한다.

추상 메소드(abstract method)

  • 몸체가 없는 메소드. 추상 메소드의 선언부에 abstract 키워드 사용한다. 상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메소드. (오버라이딩을 하지 않을 경우 에러가 발생한다.)
[접근제한자] abstract 반환형 메소드명(자료형 변수명)

추상 클래스(abstract class)

  • 몸체 없는 메소드를 포함한 클래스. 추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용한다.
[접근제한자] abstract class 클래스명 {}

추상 클래스의 특징

  • 추상메소드가 "하나라도" 존재하는 순간 반드시 추상클래스로 정의
  • 미완성 클래스(abstract 키워드 사용)이기 때문에 자체적으로 객체 생성이 불가하다. 그러므로 반드시 상속하여 객체를 생성해야 한다.
  • 추상메소드가 없더라도 해당 클래스를 추상클래스로 둘 수 있다.
  • 클래스 내에 일반 변수, 메소드 포함 가능하다.
  • 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능하다.

인터페이스

상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체. 메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것으로, 상속 시 인터페이스 내에 정의된 모든 추상메소드를 구현해야 한다.

[접근제한자] interface 인터페이스명 {

	//상수도 멤버로 포함할 수 있음
	public static final 자료형 변수명 = 초기값;
    
	//추상 메소드만 선언 가능
	[public abstract] 반환자료형 메소드명([자료형 매개변수]);
    
	//public abstract가 생략되기 때문에
	//오버라이딩 시 반드시 public 표기해야 함
}

인터페이스의 특징

  • 인터페이스는 내부의 모든 필드가 pulbic static fianl로 정의된다.
  • static 메서드와 default 메서드를 제외한 모든 메서드들은 pulblic abstarct으로 정의된다.
  • 객체 생성은 안되나 참조형 변수로는 가능하다.
profile
Devlog

0개의 댓글