java 다형성

moonseungha·2022년 12월 18일
0

📌다형성

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

📌다형성의 목적(장점)

  • 부모 타입으로 다양한 자식 객체를 다룰 수 있음
  • 메소드 정의시 다형성 개념을 적용시키면 메소드 개수가 줄어듬 (코드 길이 감소)

📌클래스 형변환

- 업캐스팅

  • 상속 관계에서 부모 타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있음
  • 자식 객체의 주소를 전달받은 부모 타입의 참조변수를 통해서 사용할 수 있는 자식의 정보는
    원래 부모 타입이었던 멤버만 참조 가능
package 선언부
public class Son extends Mom {
	method 작성부
    	Mom m = new Son();

- 다운 캐스팅

  • 자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우
    부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형변환하는 것
  • 자동으로 처리되지 않기때문에 자식 타입을 명시해서 형변환
package 선언부
public class Son extends Mom {
	method 작성부
    	Mom m = new Son();
		
        (Son)m;
}

📌instanceof 연산자

  • 현재 레퍼런스가 실질적으로 어떤 클래스 타입을 참조하고 있는지 확인할 때 사용
  • 클래스 타입이 맞으면 true, 아니면 false 반환
package 선언부
Class 작성부
	method 작성부
    	if(레퍼런스 instanceof 클래스 타입1) {
        	true일 경우 해당 클래스 타입1로 down casting;
        } else if (레퍼런스 instanceof 클래스 타입2) {
        	true일 경우 해당 클래스 타입2로 down casting;
        } else if (레퍼런스 instanceof 클래스 타입3) {
        	true일 경우 해당 클래스 타입3로 down casting;
        }

📌바인딩

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

- 동적 바인딩

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

성립조건

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

📌객체배열과 다형성

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

📌매개변수와 다형성

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

📌추상 클래스

  • 소괄호까지는 머리부, 중괄호부터는 몸통부

- 추상 클래스

  • 미완성된 클래스
  • 추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용
  • 일반 멤버변수 + 일반 메소드 [+추상 메소드]
  • 객체 생성이 불가능하게 하기위해 추상메소드 없이도 추상 클래스 선언하는 경우 있음
package 선언부
접근제한자 abstract class 클래스명 {}

- 추상 메소드

  • 몸통부 없는 메소드
  • 추상 메소드의 선언부에 abstract 키워드 사용
  • 상속시 반드시 구현해야 하는 즉, 오버라이딩이 강제인 메소드
package 선언부
Class 작성부
	접근제한자 abstract 반환형 메소드명(자료형 변수명);

- 특징

  1. 미완성 클래스(abstract 키워드 사용)
    자체적으로 객체 생성 불가 → 반드시 상속하여 객체 생성
  2. abstract 메소드가 포함된 클래스는 반드시 abstract 클래스
    abstract 메소드가 없어도 abstract 클래스 선언 가능
  3. 클래스 내에 일반 변수, 메소드 포함 가능
  4. 객체 생성은 안되지만 참조변수 타입, 다형성으로는 사용 가능

- 장점

  • 일관된 인터페이스 제공
  • 꼭 필요한 기능 강제화 (공통적이나 자식 클래스마다 실행 내용 다른 경우)

📌 인터페이스

  • 상수 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체
  • 메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것
  • 상속시 인터페이스 내에 정의된 모든 추상 메소드 구현해야함
  • 인터페이스 구현 시 implements 키워드 사용
package 선언부
접근제한자 interface 인터페이스명 {
	/*public static final */자료형 변수명 = 초기값;
    /*public abstract */반환자료형 메소드명([자료형 매개변수]);
}

- 인터페이스 구현

  • 클래스에서 인터페이스 구현 (다중상속 가능)
package 선언부
접근제한자 class 클래스명 implements 인터페이스, 인터페이스, ... {}
  • 인터페이스에서 인터페이스 상속 (다중상속 가능)
package 선언부
접근제한자 class 인터페이스 extends 인터페이스, 인터페이스, ... {}

- 클래스 다이어그램

인터페이스의 구현 : 점선 + 빈 세모

  • 클래스(자식) - - ▷ 인터페이스(부모)

인터페이스의 상속 : 실선 + 빈 세모

  • 인터페이스(자식) ─▷ 인터페이스(부모)

- 특징

  1. 모든 인터페이스의 메소드는 묵시적으로 public abstract
  2. 변수는 묵시적으로 public static final 이므로
    인터페이스 변수의 값 변경 컴파일시 에러 발생
  3. 객체 생성은 안되지만 참조변수 타입, 다형성으로는 사용 가능

- 장점

  • 상위 타입 역할로 다형성을 지원하여 연결
  • 해당 객체가 다양한 기능 제공시에도 인터페이스에 해당하는 기능만을 사용하게 제한 가능
  • 공통 기능상의 일관성 제공
  • 공동 작업을 위한 인터페이스 제공

📌추상 클래스와 인터페이스

구분추상 클래스인터페이스
상속단일 상속다중 상속
구현extends 사용implements 사용
추상 메소드abstract 메소드 0개 이상모든 메소드가 abstract
abstract명시적으로 abstract묵시적으로 abstract
일반 메소드사용가능사용불가
필드일반 필드 가질 수 있음상수 필드만 가질 수 있음
묵시적으로 public static final
객체객체 생성 불가객체 생성 불가
용도참조 타입참조 타입

extends 일반클래스 → extends 추상클래스 → implements 인터페이스
───────────────────────────────▷
강제성이 짙어짐 == 규약이 더 세짐 == 오버라이딩해야하는 메소드의 수가 많아짐

0개의 댓글