멋쟁이v의 개발일지

[JAVA] 상속, 인터페이스 본문

0년차/JAVA

[JAVA] 상속, 인터페이스

멋쟁이v 2023. 5. 7. 15:32
728x90
320x100

[목차]


01. 상속

  • 1) 상속 개념
    💡
    부모 클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있습니다.
    • 이미 개발된 클래스를 재사용하므로 중복 코드를 줄인다.
    • 클래스 수정을 최소화 한다.
  • 2) 클래스 상속
    • 자식 클래스를 선언할 때 어떤 부모로부터 상속받을 것인지를 결정하고, 부모 클래스를 다음과 같이 extends 뒤에 기술한다. ex) public class 자식클래스 extends 부모클래스 { … }
    • 다중 상속을 허용하지 않음. extends 뒤에 하나의 부모 클래스만 상속한다.
  • 3) 부모 생성자 호출
    • 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다.
    • 부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출된다.
  • 4) 메소드 재정의
    💡
    메소드 오버라이딩 ➡️ 상속된 메소드를 자식 클래스에서 재정의하는 것
    • 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다.
    • 접근 제한을 더 강하게 오버라이딩 할 수 없음

    💡
    부모 메소드 호출 ➡️ 자식 메소드 내에서 super 키워드와 도트연산자를 사용하면 숨겨진 부모 메소드를 호출
    • 부모 메소드를 재사용함으로써 자식 메소드의 중복 작업 내용을 없애는 효과
  • 5) final 클래스와 final 메소드
    • final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다.
    • 메소드를 선언할 때 final 키워드를 붙이면 오버라이딩 할 수 없다.
    • 부모 클래스를 상속해서 자식 클래스를 선언할 때, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 할 수 없다.

      ex ) public final void method( ) { … }

  • 6) protected 접근 제한자
    • 같은 패키지에서는 default처럼 접근이 가능하나, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
  • 7) 타입 변환
    • 자동 타입 변환
    • 강제 타입 변환
  • 8) 다형성
    💡
    다형성 ➡️ 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
    • 구현하기 위해서는 자동 타입 변환과 메소드 재정의가 필요하다.
    💡
    필드 다형성 ➡️ 필드 타입은 동일하지만 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있는 것

    💡
    매개변수 다형성 ➡️ 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 자식 객체를 제공할 수 있습니다.
  • 9) 객체 타입 확인
    💡
    instanceof 연산자 ➡️ 객체 instanceof 타입;
    • 매개변수가 아니더라도 변수가 참조하는 객체의 타입을 확인할 때 사용한다.
    • 좌항의 객체가 우항의 타입이면 true를 산출하고 그렇지 않으면 false를 산출한다.
  • 10) 추상 클래스
    💡
    추상 클래스 ➡️ 객체를 생성할 수 있는 실체 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스
    • 실체 클래스의 부모 역할. 공통적인 필드나 메소드를 물려받을 수 있다.

    💡
    추상 클래스 선언 ➡️ abstract class 클래스명
    • new 연산자를 이용해서 객체를 직접 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있다.

    💡
    추상 메소드와 재정의 ➡️ 자식 클래스들이 가지고 있는 공통 메소드를 뽑아내어 추상 클래스로 작성할 때, 메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우 추상 메소드를 선언할 수 있다.
    • 일반 메소드 선언과의 차이점은 abstract 키워드가 붙고, 메소드 실행 내용인 줄괄호 { }가 없다.
  • 11) 봉인된 클래스
    💡
    sealed 클래스
    • Java 15부터 무분별한 자식 클래스 생성을 방지하기 위해 봉인된 클래스가 도입
    • sealed 키워드를 사용하면 permits 키워드 뒤에 상속 가능한 자식 클래스를 지정
    • final은 더이상 상속할 수 없다는 뜻이고, non-sealed는 봉인을 해제한다는 뜻

02. 인터페이스

  • 1) 인터페이스 역할
    💡
    1. 두 객체를 연결하는 역할 2. 다형성 구현에 주된 기술
  • 2) 인터페이스와 구현 클래스 선언
    💡
    인터페이스 선언 ➡️ class 키워드 대신 interface 키워드를 사용합니다.
    • 접근 제한자로는 클래스와 마찬가지로 같은 패키지 내에서만 사용 가능한 default, 패키지와 상관없이 사용하는 public을 붙일 수 있다.

    💡
    구현 클래스 선언 ➡️ 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현됩니다.
    • implements 키워드는 해당 클래스가 인터페이스를 통해 사용할 수 있다는 표시이며, 인터페이스의 추상 메소드를 재정의한 메소드가 있다는 뜻

    • 인터페이스는 참조 타입에 속하므로 인터페이스 변수에는 객체를 참조하고 있지 않다는 뜻으로 null을 대입할 수 있다. (MyCar mc = null;)
    • 인터페이스를 통해 구현 객체를 사용하려면 인터페이스 변수에 구현 객체의 번지를 대입해야 한다. ( mc = new Car(); )
  • 3) 상수 필드
    💡
    인터페이스는 public static final 특성을 갖는 불변의 상수 필드를 멤버로 가질 수 있습니다. ➡️ public static final 타입 상수명 = 값;
    • 인터페이스에 선언된 필드는 모두 public static final 특성을 갖기 때문에 public static final을 생략해도 자동으로 컴파일 과정에서 붙는다.
    • 상수명은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우에는 언더바(_)로 연결한다.
  • 4) 추상 메소드
    💡
    리턴 타입, 메소드명, 매개변수만 기술되고 중괄호 {}를 붙이지 않는 메소드입니다.
    • public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙는다.
    • 추상 메소드는 객체A가 인터페이스를 통해 어떻게 메소드를 호출할 수 있는지 방법을 알려주는 역할이다.
  • 5) 디폴트 메소드
    💡
    인터페이스에는 완전한 실행 코드를 가진 디폴트 메소드를 선언할 수 있습니다.
    • 추상 메소드는 실행부(중괄호)가 없지만 디폴트 메소드는 실행부가 있다. (default 키워드가 리턴 타입 앞에 붙음)
    • 실행부에는 상수 필드를 읽거나 추상 메소드를 호출하는 코드를 작성할 수 있다.
  • 6) 정적 메소드
    💡
    구현 객체가 없어도 인터페이스만으로 호출할 수 있습니다.
    • 선언 시 public을 생략하더라도 자동으로 컴파일 과정에서 붙는다.
    • 정적 실행부를 작성할 때 상수 필드를 제외한 추상 메소드, 디폴트 메소드, private 메소드 등을 호출할 수 없다.
  • 7) private 메소드
    💡
    인터페이스의 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드는 모두 public 접근 제한을 가지며 이를 생략하더라도 외부에서 접근이 가능합니다.
    • private 메소드는 디폴트 메소드 안에서만 호출이 가능하다.
    • private 정적 메소드는 정적 메소드 안에서도 호출이 가능하다.
  • 8) 다중 인터페이스 구현
    💡
    구현 객체는 여러 개의 인터페이스를 통해 구현 객체를 사용할 수 있습니다.
  • 9) 인터페이스 상속
    💡
    인터페이스도 다른 인터페이스를 상속할 수 있습니다. 다중상속!
    • extends 키워드 뒤에 상속할 인터페이스들을 나열한다.
    • 자식 인터페이스의 구현 클래스는 자식 인터페이스의 메소드뿐만 아니라 부모 인터페이스의 모든 추상 메소드를 재정의.
  • 10) 타입 변환
    💡
    자동 타입 변환 ➡️ 자동으로 타입 변환이 일어나는 것
    • 부모 클래스가 인터페이스를 구현하고 있다면 자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있다.

    💡
    강제 타입 변환 ➡️ 캐스팅 기호를 사용해서 인터페이스 타입을 구현 클래스 타입으로 변환시키는 것
    • 구현 객체가 인터페이스 타입으로 자동 변환되면 인터페이스에 선언된 메소드만 사용 가능하다.

  • 11) 다형성
    💡
    사용 방법은 동일하지만 다양한 결과가 나오는 성질입니다.
    • 인터페이스 역시 다형성을 구현하기 위해 재정의와 자동 타입 변환 기능을 이용한다.
    • 매개변수 타입을 인터페이스로 선언하면 메소드 호출 시 다양한 구현 객체를 대입할 수 있다.


tag : #상속 #인터페이스


Uploaded by N2T

728x90
320x100
Comments