Backend/Java

[java]상속/은닉/다형성/추상클래스/interface

해로몬 2024. 10. 18. 17:00

[특징]

  • 상속*
  • 은닉(캡슐)
  • 다형성
  • 추상

상속을 위한 문법

키워드 설명 예시
extends 클래스 상속을 위해 사용 class 자식 extends 부모 { }
implements 인터페이스 구현을 위해 사용 class 클래스 implements 인터페이스 { }
super 부모 클래스의 멤버에 접근 super.부모메서드()
super() 부모 클래스의 생성자 호출 super(매개변수)
this 현재 객체의 멤버에 접근 this.멤버변수 = 값;
this() 같은 클래스의 다른생성자 호출 this(매개변수);
final 클래스 상속 불가능 클래스 final class 최종 클래스{ }
final 메서드 오버라이딩 불가능 메서드 fianl void 최종메서드( ) { }
Oberriding 부모의 클래스의 메서드를 재정의 @Overrid void 메서드( ) { }

은닉을 위한 문법

키워드 설명 예시
접근제어자 protected 같은 패키지와 자식 클래스에서 접근 가능 protected int 보호변수;
private 같은 클래스 내에서만 접근 가능 private int 비공개변수;
public 어디서든 접근 가능 public void 공개메서드( ) {  }
default(package - private) 같은 패키지 내에서만 접근 가능 int 기본변수;
접근 메서드

getter private 멤버 변수의 값을 반환하는 메서드 public int getValeu(){
return value;
}
setter private 멤버 변수의 값을 설정하는 메서드 public void setValue(int value){
this.value =value;
}
encapsulation 데이터와 그 데이터를 다루는 메서드를 하나로 묶음  

 

다형성 : 부모 클래스의 참조변수를 통해서 자식 클래스의 메서드 호출

  • 상속
  • 오버라이딩
  • 참조 자료형의 형 변환
    • 상속관계
    • 업캐스팅(큰 자료형)
    • 다운캐스팅(작은 자료형 : 강제형변환)

참조 자료형의 형변환

1. 업캐스팅(Upcasting)

하위 클래스의 객체를 상위 클래스 타입으로 변환하는 것이다. 이는 자바에서 암시적으로 이루어지며 별도의 명시적 형변환이 필요하지 않음.

  • 업캐스팅 자동으로 발생
  • 하위 클래스의 객체는 여전히 해당 클래스의 메서드를 사용할 수 있지만, 상위 클래스의 참조로만 접근 가능

2.다운캐스팅(DownCasting)

상위 클래스의 객체를 하위 클래스 타입으로 변환하는 것. 명시적으로 형변환을 해주어야 하며, 올바르게 캐스팅 되지 않으면 ClassCastException이 발생할 수 있음.

  • 다운캐스팅은 명시적으로 형변환을 해주어야 함.
  • ClassCastException이 발생할 수 있음
  • 다운캐스팅 후 하위 클래스의 메서드난 속성에 접근할 수 있음.

추상 클래스란?

추상 클래스는 구현되지 않은 추상 메서드를 포함할 수 있는 클래스.

일반 클래스와 유사하지만, 추상 메서드가 포함된 클래스는 객체를 직접 생성할 수 없음. 대신, 추상클래스를 상속받은 자식 클래스에서 추상 메서드를 구현하여 객체를 생성할 수 있음.

 

<추상 클래스의 특징>

  • 추상 메서드를 하나 이상 가질 수 있음.
  • 객체를 직접 생성할 수 없음.
  • 상속을 통해서만 사용됨.
  • 추상 클래스는 다른 일반 메서드나 필드도 포함할 수 있음.

인터페이스란?

인터페이스는 메서드의 선언만을 포함하고, 구현은 포함하지 않는 특수한 클래스와 비슷한 구조.

즉, 인터페이스는 메서드의 구체적인 동작을 정의하지 않고, 어떤 클래스가 이 인터페이스를 구현할 때 무조건 해당 메서드들을 구현해야 한다는 규칙을 정해줌.

  • 강제적인 구현 : 인터페이스를 구현하는 클래스는 반드시 인터페이스의 메서드를 모두 구현해야 함.
  • 다중 상속을 지원 :  클래스에서 다중 상속을 허용하지 않지만, 인터페이스는 여러개를 동시에 구현 가능.
  • 코드의 유연성 증가 : 클랫스 간 일관성 유지

<구현>

interface 키워드를 사용하며 선언, 메서드는 구체적인 구현 없이 선언만 함.

interface 이름 {
	//추상 메서드(구현 없는 메서드 선언)
    반환형 메서드 이름();
    
}

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

특징 인터페이스 추상클래스
메서드 구현 여부 모든 메서드는 기본적으로 구현 ❌ 일부 메서드는 구현 ⭕️
다중상속 여부 여러 인터페이스 동시에 ⭕️ 단일 클래스만 상속 ⭕️
필드 상수만 선언 가능 인스턴스 필드와 상수 선언 가능
목적 클래스 간 공통된 행위 규약 정의 클래스 간의 공통된 동작과 상태 정의

 

instanceof

instanceof 연산자는 자바에서 객체가 특정 클래스나 인터페이스의 인스턴스인지 여부를 확인하는데 사용.

즉, 객체의 실제타입을 확인할 수 있는 도구. 주로 형변환 전에 객체가 원하는 타입인지 확인하는 데 사용되어, ClassCastException과 같은 오류를 방지하는 데 유용함.

객체 instanceof 클래스이름

 

인터페이스 메서드 종류

종류 호출 방식 구현 오버라이딩 특징
추상 메서드 인터페이스 구현한 클래스의 객체 구현 클래스에서 반드시 구현  ⭕️ public, 구현클래스에서 필수적으로 구현
디폴트 메서드 구현 클래스의 객체 인터페이스에서 기본 구현 제공  ⭕️ default 키워드 사용, 인터페이스 내에서 기본 구현 제공.
필요에 따라 오버라이딩 가능
정적 메서드 인터페이스 이름을 통해 호출 인터페이스에서 구현   인터페이스 자체에서 호출가능, 클래스가 아닌 인터페이스에 속함
프라이빗 메서드 인터페이스 내에서만 호출  인터페이스에서 구현   인터페이스 내에서 로직을 재사용하기 위해 사용. 외부에서 접근 불가
프라이빗 정적 메서드 인터페이스 내 정적 메서드에서 호출 인터페이스에서 구현   정적 메서드 간에 공통된 로직을 처리 할 때 사용, 외부에서는 접근 불가.

 

패키지

<목적 & 필요성>

  • 클래스 이름 충돌 방지
  • 코드의 구조적 관리 : 논리적이고 계층적인 구조로 조직, 대규모 프로젝트에서도 코드를 쉽게 관리하고 탐색할 수 있음.
  • 접근 제어 : 같은 패키지 안에 잇는 클래스끼리는 package- private 접근 권한을 가지므로, 패키지를 기준으로 접근을 제한할 수 있음.
package 패키지이름;
public class 이름{

}

 

import문

패키지에 있는 클래스를 사용하려면 import문을 사용하여 임포트 해야함.

단일클래스 또는 패키지 내의 모든 클래스를 임포트 할 수 있음.

//단일 클래스 임포트
import com.example.project.MainProject;
//패키지 내 모든 클래스 임포트
import com.example.project.*;