[Must Have Java][2단계] 12 클래스의 상속

yesjuhee·2022년 11월 6일
0

Java 공부

목록 보기
6/6

Must Have 이재환의 자바 프로그래밍 입문 책을 읽고 정리한 글입니다.

상속

  • 상속이란 클래스가 가지고 있는 멤버를 다른 클래스에게 계승시키는 것
  • 상속의 장점
    • 클래스 간의 전체 계층 구조를 파악하기 쉬움
    • 재사용성 증대 : 기존 클래스에 있는 것을 재사용할 수 있음
    • 확장 용이 : 새로운 클래스, 데이터, 메서드를 추가하기 쉬움
    • 유지보수 용이 : 데이터와 메서드를 변경할 때 상위에 있는 것만 수정하여 전체적으로 일관성을 유지할 수 있음
  • 상속 관련 다양한 호칭
    • 상속 대상 클래스 : 상속을 받은 클래스
    • 슈퍼 클래스 : 서브 클래스
    • 부모 클래스 : 자식 클래스
    • 기반 클래스 : 파생 클래스
    • 조상 클래스 : 자손 클래스
    • 상위 클래스 : 하위 클래스
  • **private** 접근 제한자가 쓰인 멤버들은 서브 클래스로 상속되지 않음
  • 자식 클래스를 코드로 구현할 때는 **extends** 예약어 이용
class Marine extends Unit {...}
  • 자바는 클래스 간 다중 상속을 지원하지 않음

오버라이딩

  • 오버라이딩이란 상속된 메서드와 동일한 이름, 동일한 인수를 가지는 메서드를 정의하여 메서드를 덮어쓰는 것
  • 반환값의 형도 같아야만 오버라이딩 됨
  • 오버라이딩의 목적
    • 상속받은 부모 클래스 메서드의 기능 변경
    • 상속받은 부모 클래스 메서드에 기능 추가
  • 오버라이딩을 이용하여 부모 클래스 메서드에 기능을 추가하는 경우, super 예약어를 사용하여 부모 클래스의 메서드와 자식 클래스의 메서드를 구분함

상속이 제한되는 final

  • final은 변수, 메서드, 클래스에 붙이는 예약어임
  • final + 변수 : 상수를 의미, 변경 불가
  • final + 메서드 : 하위 클래스에서 오버라이딩을 할 수 없음
  • final + 클래스 : 상속을 할 수 없음
  • 클래스의 일부 메서드를 상속 제한하려면 접근 제한자 private 이용

추상 클래스

  • 구체적인 처리 내용을 기술하지 않고, 호출하는 방법만을 정의한 메서드를 추상 메서드라고 함
    // 구상 메서드
    public int adder (int n1, n2){
    	return n1 + n2;
    }
    
    // 추상 메서드
    abstract public int addr (int n1, n2);
  • 이런 추상 메서드를 가진 클래스를 추상 클래스라고 함
    • 추상 클래스는 앞에 abstaract를 붙여 표시함

      abstract clss Unit{
      	String name;
      	int hp;
      	abstract void doMove(); // 추상 메서드
      }
    • 추상 클래스로는 객체를 직접 형성할 수 없음!

  • 추상 클래스를 사용하는 이유
    • 추상 클래스를 상속받은 자식 클래스의 기능을 미리 지정하기 위해서 이용
    • “이 클래스를 상속받은 클래스는 반드시 이 기능을 정의해야 한다!” 라고 표시하는 것
    • 특히 상속받은 클래스가 정의해야 하지만 그 구체적인 기능을 미리 만들어놓을 수 없을 때 이용 가능

인터페이스

  • 인터페이스 : 클래스에 기능을 제공해주는 구조

인터페이스의 구성

interface A{
	int a = 2;
	// public static final int a = 2; 를 의미함
	
	void say();
	// public abstract void say(); 를 의미함, 추상 메서드
	
	public default void desc(){...;}
	// 디폴트 메서드, 기능을 미리 정의할 수 있음
}

인터페이스의 상속과 구현

  • 인터페이스의 상속
    • 클래스간의 상속과 마찬가지로 extends 예약어 이용
    • 인터페이스에 한해서 다중 상속 가능
  • 인터페이스의 구현
    • 인터페이스의 사용은 implements 예약어 이용
    • 인터페이스의 메서드는 추상 메서드이므로 반드시 추상 메서드를 구상 메서드로 오버라이딩해서 구현해야함
    • 클래스에서 인터페이스를 이용하도록 하는 것을 인터페이스 구현이라고 함
    • 인터페이스는 다중 구현이 가능
interface A{
	int a = 2;
	void greet();
}

// 인터페이스 상속
interface B extends A{
	void bye();
}

// 인터페이스 다중 상속
interface A extends X, Y, Z { ... }

// 인터페이스 구현
class B implements A {
	public void say(){
		System.out.prinln("Hellow");
	}
}

// 다중 인터페이스 구현
class B implements X, Y, Z { ... }

// 클래스의 상속과 인터페이스의 구현 동시 사용
class B extends A implements X, Y, Z { ... }

인터페이스와 추상 클래스의 차이

  • 인터페이스와 추상 클래스는 둘 다 추상 메서드를 이용한다는 점에서 같음
  • 추상 클래스는 ‘상속’ 기능을 이용
  • 클래스 간의 상속 관계를 이용해 본질을 유지하는 경우 → 추상 클래스
  • 단순히 공통된 기능을 구현하는 경우 → 인터페이스

디폴트 메서드

  • 하위 호환성을 유지하면서 기존 인터페이스에 새로운 기능을 추가할 수 있게 하는 메서드
  • 기존에 인터페이스에서는 추상 메서드만 이용해야 했기 때문에 새로운 기능을 추가할 때 곤란한 점이 있었음
  • 디폴트 메서드를 이용해 새로운 기능을 추가하면, 기존 구현 클래스를 수정할 필요가 없음

다형성

  • 자식 클래스의 객체는 부모 클래스형의 변수에 대입할 수 있음
  • 이렇게 하나의 객체와 메서드가 많은 형태를 가지고 있는 것이 다형성이라고 함
Super obj = new Sub();

instanceof 연산자

  • instanceof는 객체가 지정한 클래스형의 객체인지를 조사하는 연산자
boolean bcheck = obj instanceof Myclass;
  • instanceof는 지정한 인터페이스를 오브젝트가 구현하고 있는지를 조사하는 것도 가능
boolean bcheck = obj instanceof MyInterface;
  • interfaceof 연산자는 결국 다형성을 잘 사용하려고 이용하는 연산자임
profile
반성은 하되 후회하지 않는다😎

0개의 댓글