Java의 상속과 인터페이스

Single Ko·2023년 4월 5일
0

java

목록 보기
13/28

상속

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것. ( 객지향의 특징 상속)

  • 적은 양의 코드로 새로운 클래스 작성 가능
  • 코드를 공통적으로 관리해 코드의 추가/변경이 용이
  • 코드의 재사용성을 높이고 중복을 제거하여 프로그램의 생산성과 유지보수에 기여
  • extends를 통하여 상속가능. 자바는 클래스 다중 상속이 불가능하며, 단일 상속만이 가능하다. ( 인터페이스는 다중 상속이 가능하다)

상속의 특징

• 부모 클래스가 변경되면 자식 클래스는 자동적으로 영향을 받음.
• 자식 클래스는 변경되어도 부모 클래스에 영향이 없다.
• 생성자와 초기화 블럭은 상속되지 않는다.
• 자식클래스의 맴버 계수는 부모 클래스보다 항상 같거나 많다. (extends (확장) )

Obejct 클래스 - 모든 클래스 상속 계층도의 최상위에 있는 조상 클래스. 모든 클래스는 Object 클래스의 자손이다.

super 와 super()

  • super : this를 붙여 멤버변수와 지역변수를 구분했듯이, 상속받은 멤버와 자신의 멤버가 이름이 같을 때 쓴다.
  • super()는 this()와 마찬가지로 생성자. 조상 클래스의 생성자호출에 사용. why? 자식 클래스는 조상클래스의 생성자를 호출해야 한다.(항상 조상 클래스가 먼저 생성되어야 됨)
    -> 조상 클래스의 생성자를 호출해야 하는 이유 : 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수 있으므로 조상의 멤버들이 먼저 초기화 되어 있어야 하기 대문이다. 때문에 무조건!!! (Object 클래스를 제외) 모든 클래스의 생성자는 첫줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다.

Method @Overriding (오버라이딩)

  • 상속 받은 메서드의 내용을 변경하는 것.
    • 메서드 이름이 같아야 한다.
    • 매개 변수가 같아야 한다.
    • 반환 타입이 같아야 한다.
    • 메서드의 기능을 다르게 정의 가능. 상속받은 메서드에서 다른 기능을 추가하거나, 변경할때 사용.
  • 접근 제어자(pubilc, protected, default, private)는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 조상 클래스의 메서드 보다 많은 수의 예외를 선언 할 수 없다. -> 조상클래스에 정의된 메서드보다 적은 개수를 선언해도 Exception 같은 모든 예외의 최고 조상을 선언하는 것도 할 수 없다. 조상이 가지고 있는 예외 범위보다 좁아야 한다.
  • 인스턴스 메서드를 static 메서드로 또는 그 반대(static method -> instance method)로 변경 할 수 없다.

Mthod @Overloading (오버로딩)

  • 같은 이름의 메서드에대해 매개변수의 타입, 개수를 다르게 한 것을 말한다.
  • 같은 메서드에 대해 받는 다른 매개변수. 기능은 같지만 받는 매개변수가 다르다.

제어자

  1. 클래스 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
  2. 접근 제어자 - public, protected, default, private
  3. 그 외 - static, final, abstract, native, synchronized, strictfp, volatile, transient

접근 제어자 - 클래스, 메소드 및 변수의 가시성과 다른 곳에서의 액세스 가능성을 제어합니다

제어자	 같은 클래스	같은 패키지	자손 클래스	전체
public	     ⭕	       ⭕	        ⭕	     ⭕
protected	 ⭕	       ⭕	        ⭕	 
(default)	 ⭕	       ⭕	 	 
private	     ⭕	 	 	

기타 한정자 키워드

  1. static - static 키워드는 변수나 메서드가 클래스의 특정 인스턴스가 아닌 클래스 자체에 속함을 나타내는 데 사용됩니다. 클래스의 인스턴스를 만들지 않고 정적 메서드를 호출할 수 있습니다.

  2. final - final은 변수가 초기화 후 변경 될 수 없음, 메서드에 사용되면 오버라이딩을 할 수 없고, 클래스에 사용되면 자식 클래스를 정의하지 못한다는 뜻.

    • 생성자를 이용한 final 맴버 변수의 초기화 : final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 하지만 인스턴스 변수의 경우 생성자에서 초기화 되도록 할 수 있다. 이 기능을 이용하면 인스턴스마다 final이 붙은 멤버변수가 다른 값을 같도록 할 수 있다.
  3. abstract - 클래스 또는 메서드에 사용된다. 추상 클래스는 인스턴스화할 수 없고 다른 클래스에 의해 상속해 구현되는 클래스입니다. 추상 메서드는 추상 클래스에 구현이 없고 구체적인 하위 클래스에 의해 구현됩니다.

  4. native: native는 메서드가 Java 이외의 언어(일반적으로 C 또는 C++)로 구현됨을 나타내는 데 사용됩니다. native 메서드는 시스템 라이브러리와의 인터페이스 또는 성능이 중요한 작업에 사용됩니다.(아직 난 웹 관련에서 사용하는걸 본적은 없음)

  5. synchronized: synchronized는 메서드 또는 코드 블록이 한 번에 하나의 스레드에서만 실행될 수 있음을 나타내는 데 사용됩니다. 이는 다중 스레드 응용 프로그램에서 Thread safe함을 보장합니다.

  6. strictfp: strictfp는 부동 소수점 연산이 IEEE 754 표준을 준수하는 모든 플랫폼에서 동일한 결과를 생성하도록 하는 데 사용됩니다. 클래스, 인터페이스 또는 메서드에 적용할 수 있습니다.

  7. volatile: volatile는 변수와 함께 사용되어 변수 값이 여러 스레드에서 동시에 변경될 수 있음을 나타냅니다. 변수에 대한 변경 사항을 다른 스레드에서 즉시 볼 수 있도록 하여 일종의 동기화를 제공합니다.

  8. transient: transient 키워드는 객체가 직렬화될 때 변수가 직렬화되지 않아야 함을 나타내기 위해 변수와 함께 사용됩니다. 지속되어서는 안 되는 임시 또는 민감한 데이터를 보유하는 변수에 유용합니다.

추상 클래스

  • 추상클래스는 추상메서드를 포함하고 있는 클래스를 말한다. 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않다.
  • 클래스 선언줄에 abstract를 추가하면 추상 클래스가 된다.
  • Method 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상클래스에서는 선언부만 작성하고, 실제 내용은 상속받는 클래스에서 구현. -> Interface와 비슷한 면이 있다(모바일쪽, android에서는 extends를 이용한 추상클래스를 많이 사용하고 웹쪽에서는 interface를 통한 상속과 다형성을 구현한다.)

추상 클래스의 특징

  • 추상 클래스는 new 연산자를 사용하여 객체를 생성할 수 없다.
  • 추상 클래스(부모)와 일반 클래스(자식)는 상속의 관계에 놓여있다.
  • 추상 클래스는 새로운 일반 클래스를 위한 부모 클래스의 용도로만 사용된다.
  • 공통된 필드와 메소드를 통일하여 일반 클래스 작성 시 시간을 절약할 수 있다.
  • 추상 클래스는 단일 상속만 가능하며 일반 변수를 가질 수 있다.
  • 추상 클래스는 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아서 기능을 확장시키는 것이 목적이다

인터페이스

인터페이스에 대한 정의

  • 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있다.

  • 인터페이스에 적는 모든 메소드들은 추상 메소드로 간주되기 때문에 abstract를 적지 않는다.

  • 기존에는 인터페이스에 일반 메소드를 구현할 수 없었지만, 자바 8버전부터 default 예약어를 통해 일반 메소드구현이 가능하다.( 이후 private까지 구현 가능)

  • 인터페이스의 필드는 static final field만 가질 수 있다. field를 선언할 때 public static final이 생략되어 있다고 생각하자.

  • public static final을 사용하는 이유는 다음과 같다

    • 구현 객체의 같은 동작을 보장하기 위한 목적
    • 인터페이스의 변수는 스스로 초기화 될 권한이 없음
    • 아무 인스턴스도 존재하지 않는 시점이기 때문
  • 인터페이스도 추상 클래스와 마찬가지로 new 연산자를 사용하여 객체를 생성할 수 없다.

  • 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하는 것이 목적이다.

  • 인터페이스는 추상 클래스와 반대로 다중 상속이 가능하다
    추상 클래스와 인터페이스의 공통점

  • 추상 메서드와 인터페이스는 선언부만 있고 구현은 없는 클래스이다.(자바 8부터 인터페이스에서 default method로 구현이 가능하지만 일반적으로 구현은 없다.)

  • 인스턴스화(객체 생성 X)를 할 수 없다.

  • 추상 클래스를 extends로 상속받은 자식들과 인터페이스를 implements로 구현한 자식들만 객체 생성 가능 (결국 자식 클래스가 무언가 반드시 구현하도록 위임해야할 때 사용한다.)

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

  • 추상 클래스(단일 상속) / 인터페이스(다중 상속)

  • 추상 클래스의 목적은 상속을 받아서 기능을 확장시키는 것(부모의 유전자를 물려받는다.). subclass-superclass relationship.

  • 인터페이스의 목적은 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제하는 역할 (부모로부터 유전자를 물려받는 것이 아니라(상하의 관계가 아님) 필요에 따라 관계를 맺는것) 즉, 구현 객체가 같은 동작을 한다는 것을 보장하기 위함

    추상 클래스와 인터페이스는 모두 미완성 메소드를 포함하는 클래스를 정의하지만, 추상 클래스는 '공통의 기능'을 상위 클래스에 묶어 상속을 통해 공유하는 데 사용되고, 인터페이스는 '객체의 행동'을 정의하는 데 사용된다는 차이점이 있습니다. 또한, 추상 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 구현이 가능하다는 차이점도 있습니다.

profile
공부 정리 블로그

0개의 댓글