1. 상속

상속 : 부모 클래스의 필드와 메서드를 자식 클래스에게 물려주는 것

  • 적은 양의 코드로 새로운 클래스를 작성 할 수 있음
  • 코드 중복이 제거되고 재사용성이 증가하여 생산성과 유지보수성에 유리
  • extends 키워드로 정의

  • 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모 클래스에 어떠한 영향도 주지 않음
  • 자식 클래스의 멤버 개수는 항상 부모 클래스보다 같거나 많음

클래스 간의 관계

상속 관계 : is-a
포함 관계 : has-a

⚠️ JAVA는 다중 상속을 허용하지 않음

  • 다중 상속의 경우 클래스간의 관계가 복잡해짐
  • 자식 클래스에서 상속 받는 서로 다른 부모 클래스들이 같은 이름의 멤버를 가지고 있다면 자식 클래스에서 이 멤버를 구별할 수 없게 되는 문제 발생

final
final 클래스 : 최종 클래스가 되므로 상속 불가
final 메서드 : 최종 메서드가 되므로 오버라이딩 불가

Object Class

JAVA 내 모든 클래스들의 최상위 부모 클래스
모든 클래스는 Object의 메서드 사용 가능
부모 클래스가 없는 자식 클래스는 자동으로 Object Class를 상속받음

// Object Class 메서드
- Object clone() : 해당 객체의 복제본을 생성하여 반환
- boolean equals(Object object) : 해당 객체와 전달받은 객체가 같은지 여부를 반환
- Class getClass() : 해당 객체의 클래스 타입을 반환
- int hashCode() : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환
- String toString() : 해당 객체의 정보를 문자열로 반환

2. 오버라이딩

부모 클래스로부터 상속 받은 메서드의 내용을 재정의 하는 것

조건
1. 선언부가 부모 클래스의 메서드와 일치해야함
2. 접근 제어자를 부모 클래스의 메서드보다 좁은 범위로 변경 불가
3. 부모 클래스 메서드보다 많은 예외 선언 불가

// horn 메서드 오버라이딩 예시
public class Car {
	public void horn() {
        System.out.println("빵빵");
    }
}

public class SportsCar extends Car{
	@Override
    public void horn() {
         System.out.println("엔진 " + engine + " 부앙~\n");
    }
}    

super

부모 클래스의 멤버를 참조할 수 있는 키워드
객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용
자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버 이름이 같은 경우 구분하기 위해 사용

public void setCarInfo(String model, double price) {	// 자식 클래스 메서드
    super.model = model; 	// model은 부모 필드에 set
    this.price = price; 	// price는 자식 필드에 set
}

super()
부모 클래스이 생성자를 호출할 수 있는 키워드

자식 클래스 객체 생성시 부모 클래스들까지 합쳐서 하나의 인스턴스 생성
이 때, 부모 클래스 멤버들의 초기화 작업이 먼저 이루어져어야 하므로 자식 클래스 생성자에서 부모 클래스 생성자를 첫 줄에 호출

// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
    super(model, color, price);		// 부모 클래스 생성자 호출
    this.engine = engine;
}

3. 다형성

참조 변수의 타입 변환

자동 타입 변환

  • 부모타입 변수 = 자식타입 객체 : 자동으로 부모타입으로 변환
  • 자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일 취급 가능

강제 타입 변환

  • 자식타입 변수 = (자식타입) 부모타입 객체 : 타입 변환 연산자를 사용해 강제로 자식 타입으로 변환
  • 자식타입 객체가 부모타입으로 자동 변환된 후, 다시 자식타입으로 변환될 때만 강제 타입 변환 가능
  • 부모타입 변수로는 자식타입 객체의 고유 멤버를 사용할 수 없으므로 사용이 필요한 경우에 강제로 타입을 변환하여 사용

다형성
여러 가지 형태를 가질 수 있는 능력
구성 하고 있는 객체를 변경하면 소프트웨어의 실행 성능 및 결과물이 달라짐

  1. 참조 변수 타입 변환을 통한 다형성 구현
Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
  • EX) 부모타이어 변수 = 자식타이어 객체 를 선언하여 자동 타입변환된 변수를 사용 ➡️ 각각의 자식 타이어 객체에 재정의된 메서드를 통해 다양한 자동차 생성
  1. 매개변수에 다형성 적용
public Car(Tire tire) {
    this.tire = tire;
}

Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));
  • EX) Car 생성자에서 매개변수의 타입이 부모 타이어이기 때문에 자식 타이어 객체를 매개변수로 전달 가능
  1. 반환타입에 다형성 적용
Tire getHankookTire() {
    return new HankookTire("HANKOOK");			// 자동 타입 변환
}

Tire getKiaTire() {
    return new KiaTire("KIA");
}

Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();	// 강제 타입 변환
  • EX) 반환타입이 부모 타이어이기 때문에 자식 타이어 객체를 반환값으로 지정 가능, 또한 자동 타입변환된 반환값인 자식 타이어 객체를 강제 타입변환할 수도 있음

instance of
해당 클래스 객체의 원래 클래스명을 체크할 때 사용하는 명령어
사용 : {대상 객체} instance of {클래스 이름} ➡️ boolean 타입으로 응답

4. 추상 클래스

추상 클래스 : 구현되지 않은 미완성 설계도
자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있음
여러개의 자식 클래스들에서 공통적인 필드나 메서드를 추출해서 만들 수 있음
선언 : abstract 키워드 사용

추상 메서드 : 구현되지 않은 미완성 메서드, 정의만 할 뿐 실행 내용이 없음
상속 받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야함

public abstract class 추상클래스 {
		abstract 리턴타입 메서드이름(매개변수);	// 구현 부분 X
}

public class 클래스명 extends 추상클래스명 {
	@Override
    public 리턴타입 메서드이름(매개변수) { 		// 추상 메서드 오버라이딩
		 // 실행문
    }
}
profile
Server Developer

0개의 댓글

Powered by GraphCDN, the GraphQL CDN