[신세계I&C KDT][Java 프로그래밍] #9 클래스 관계, 다형성 (0319)

박현아·2024년 3월 19일
0

신세계아이앤씨 KDT

목록 보기
9/42

1. 클래스 관계 (Class Relationship)

1) has a (use a) 관계

(1) 자바 표현?

public class Truck {
	Engine e; // Truck has a Engine이라고 표현할 수 있다
}
public class Engine {

}

(2) 관계 종류

  • composition : Truck has a Engine. (UML에서 채워진 마름모)
  • aggregation : Truck has a Radio. (UML에서 빈 마름모)

2) is a 관계 (상속 관계 ★)

(1) 자바 표현? -> extends 키워드 이용

// Engineer is a Employee
Class Employee { // 큰 개념 (부모 클래스, super class, parent class)

}
Class Engineer extends Employee { // 작은 개념 (자식 클래스, sub class, child class)

}

(2) 상속 특징

  • Employee : 큰 개념 (부모 클래스, super class, parent class)
    Engineer : 작은 개념 (자식 클래스, sub class, child class)
  • 형식 : extends 부모 클래스
  • 단일 상속(single inheritance) 만 지원
  • 명시적으로 extends가 없는 클래스는 자동으로 extends Object가 지정됨 ( Object 클래스는 최상위 클래스)
  • UML에서 삼각형 + 실선으로 표현
  • 상속의 장점 : 재사용이 가능하다 (부모 클래스의 변수, 메서드)
  • 생성자, private 변수, private 메서드는 상속 불가
  • 부모 클래스가 private 이어도 상속 불가
  • 항상 자신보다 부모를 먼저 생성한다
    : 자식 생성자의 첫라인에 자동적으로 부모 생성자를 호출하는 코드가 삽입이 된다 ( super() )

(3) 오버라이딩(overriding) 메서드

  • 상속 관계에서는 오버라이딩이 가능하다
  • 부모의 메서드를 자식이 재정의 하는 것
  • static, final은 오버라이딩 불가능
  • 규칙
부모 : 접근지정자 리턴타입 메서드명(변수,...){ }
   @Override => 어노테이션 (annotation)이 있으면 재정의한 메서드구나 !
  자식 :         X         리턴타입 메서드명(변수,...)    Y    { }
  • X => 자식의 접근지정자는 부모에서 지정된 접근 지정 레벨 혹은 덜 제한하는, 더 오픈된 레벨이 가능하다
    public > protected > default > private (부모가 public이면 자식은 public만 가능)

  • Y => 부모에서 지정된 예외클래스와 같거나 자식 예외클래스(아래)만 지정할 수 있다

    Object
    Exception
    RuntimeException
    ArrayIndexOutofBoundsException, NullPointerException

(4) super 키워드 vs this 키워드

super

  • heap 메모리에 생성된 부모의 인스턴스를 가리킨다
  • 반드시 super을 명시적으로 사용해야되는 경우
    • 부모의 변수와 자식의 변수 이름이 동일한 경우 (메서드도)
    • 문법 : super.변수, super.메서드()
    • 부모 생성자 호출하는 경우 (부모의 생성자에서 초기화)
      예> super(), super(10); (자식 생성자에 자동 생성됨)

this

  • heap 메모리에 생성된 자신의 인스턴스를 가리킨다
  • 반드시 this를 명시적으로 사용해야되는 경우
    • 인스턴스 변수와 로컬 변수 이름이 동일한 경우
    • 다른 생성자 호출하는 경우 (특정 생성자에게 인자값을 집중화해서 초기화)
    • 예> this(), this(10);

cf) 객체 지향의 3대 특징

  • 상속 inheritance
  • 다형성 polymorphism
  • 은닉화 / 캡슐화 encapsulation

2. 다형성 (Polymorphism)

1) 개념

  • 하나의 참조변수가 타입이 다른 여러 인스턴스를 참조할 수 있는 능력

2) 특징

  • 상속이 전제되어야 함 (is a 관계이고 같은 종류의 의미 내포)
  • 재사용성이 높아짐
  • 하나의 변수로 서로 다른 기능을 가진 메서드/변수를 호출할 수 있다

3) 문법

         Object

           |

        Employee

      |          |

Engineer        Manager
  • 일반적인 방법
Employee emp = new Employee();
Enginner eng = new Engineer();
Manager m = new Manager();
  • 다형성 적용한 방법
Employee emp = new Employee();
         emp  = new Engineer();
         emp  = new Manager();

4) 다형성 활용

(1) 배열

  • 기본적으로 배열은 같은 타입만 저장된다
    다형성을 적용하면 다른 타입도 저장 가능
// Employee 배열 => Employee 또는 그 자식들 저장할 수 있다
Employee[] emp = { new Employee(), new Engineer(), new Manager() };

// 다형성 확장해서 Object 배열을 만들면 모든 데이터 저장 가능
Object[] obj = {"hello", new Employee(), Random(), 10, 3.14};

(2) 메서드 파라미터 타입 ★

  • 다형성이 지원 안 되면 여러 개의 오버로딩 메서드가 필요하다
public void a(Object x) { } // 모든 형태의 값 전달 가능
a("hello");
a(10);
a(true);

예> public String printf(String s, Object ... obj)

0개의 댓글