[Beyond SW] 20251027

이경민·2025년 10월 28일

한화시스템 Beyond SW

목록 보기
17/40

다형성

하나의 인스턴스가 여러가지 타입을 가질 수 있는 것을 의미한다.
하나의 타입으로 여러 타입의 인스턴스를 처리할 수 있기도 하고, 하나의 메소드 호출로 객체별로 각기 다른 방법으로 동작하게 할 수 도 있다
객체지향프로그래밍의 3대 특징(캡슐화, 상속, 추상화, 다형성 = 캡상추다) 중 하나

  1. 여러 타입의 객체를 하나의 타입으로 관리할 수 있기 때문에 유지보수성과 생산성이 증가
  2. 상속을 기반으로 한 기술이기 때문에 상속 관계에 있는 모든 객체는 동일한 메세지를 수신할 수 있다. 이런 동일한 메세지를 수신 받아 처리하는 내용을 객체 별로 다르게 할 수 있다는 장점을 가지고 있다. (다양한 기능을 사용하는데 있어서 관리해야 하는 메세지 종류가 줄어들게 된다.) (메세지 = 메소드)
  3. 확장성이 좋은 코드를 작성할 수 있다.
  4. 결합도를 낮춰서 유지보수성을 증가시킬 수 있다.

동적 바인딩

: 컴파일 당시에는 해당 타입의 메소드와 연결되어 있다가 런타임 시 실제 해당 인스턴스가 메소드(오버라이딩한 메소드)로 바인딩이 바뀌어 동작하는 것을 의미
성립 조건: 상속관계를 가지는 부모자식 클래스에 오버라이딩된 메소드를 호출해야한다.

시점결정 기준결과
컴파일 시점a1, a2의 타입은 Animal이므로 sound() 메서드 호출이 가능하다고 판단 (형식적 검사만 함)OK
실행 시점a1Dog 객체, a2Cat 객체이므로, 각 객체의 sound() 실행실제 동작 결정됨

업캐스팅 : 상위타입으로 형변환 (묵시적으로 일어남)
다운캐스팅 : 하위타입으로 형변환(명시적으로 작성해야함)

  • 상속관계에 있지만 오버라이딩한 것이 아닌 후손객체가 고유하게 가지는 확장된 기능을 사용하기 위해서는 실제 인스턴스의 타입으로 다운캐스팅 해주어야함

클래스 형변환의 경우 런타임시 존재하는 타입과 형변환하려는 타입이 일치하지 않는 경우 ClassCastException이 발생함

Instanceof

: instanceof 연산자는 레퍼런스 변수가 실제로 어떤 클래스 타입의 인스턴스인지 확인하여 true or false를 반환한다.

구분오버로딩 (Overloading)오버라이딩 (Overriding)
같은 이름의 메서드를 여러 개 정의부모 클래스의 메서드를 자식이 재정의
발생 위치같은 클래스 안 또는 상속 관계에서 상위/하위 클래스 모두 가능상속 관계에서만 가능
조건메서드 이름 같고, 매개변수 다름 (개수·타입·순서)메서드 이름, 매개변수, 리턴타입 모두 같아야 함
접근 제한자상관없음부모보다 좁게는 불가능
static 여부가능 (static 메서드도 오버로딩 가능)static 메서드는 오버라이딩 불가능 (가려짐, shadowing)
목적편의성 — 같은 기능을 다양한 형태로 제공다형성 구현 — 부모 타입으로 자식 객체 제어

🔸 오버로딩 = 같은 이름, 다른 매개변수 → "한 클래스 안에서 다양하게 쓴다"
ex) add() 이름은 같지만, 매개변수 타입/개수가 다르므로 여러 버전을 정의 가능
→ 호출 시 넘기는 인자에 따라 자동으로 알맞은 메서드가 선택됨

🔸 오버라이딩 = 같은 이름, 같은 매개변수 → "상속받은 기능을 새롭게 바꾼다"
ex) 부모의 sound()를 자식이 재정의(override) 했기 때문에,
실제 실행 시점(runtime)에 자식 메서드가 호출돼요. (다형성)

추상 클래스

추상 메소드 (메소드의 기능이 없고 메소드의 헤더부만 존재하는 불완전한 메소드)를 0개 이상 포함하는 클래스
스스로 자신의 생성자를 활용한 인스턴스 생성이 불가능.
=> 불완전한 클래스

추상클래스를 상속받는 자식 클래스는 오버라이딩을 할수밖에 없음 => 오버라이딩에 대한 강제성 부여
==> 일관된 인터페이스(동일 기능)를 제공

인터페이스

: 추상 메소드와 상수 필드만 가질 수 있는 클래스의 변형체
implements라는 키워드를 사용하며 자식 클래스 입장에서 '상속 받았다'고 말하지 않고 '구현한다'라는 표현을 쓴다.

interface TestInter {
		// 모든 필드는 public static final만 가능하다.
		public static final PI1 = 3.1415;
		// public static final을 생략해도 자동으로 작성된다.(생략 가능)
    PI2 = 3.14;
    // 기본적으로 메소드는 public abstract여야 한다.
		public abstract void method1();
    // public abstract를 생략해도 자동으로 작성된다.(생략 가능)
    void method2();
}

인터페이스는 공유를 목적으로 하는 상수(public static final 필드)를 기반으로 모든 기능을 공통화(public abstract 메소드)해서 강제성을 부여할 목적으로 만들어짐(공통된 인터페이스)
자바의 단점인 단일상속 극복
모든 클래스는 하나의 부모 클래스 외에도 여러개의 인터페이스를 구현할 수 있음

0개의 댓글