생각기록

2023-03-07 java / 추상 클래스와 추상 메소드 본문

SeSAC 풀스택/JAVA &Spring boot

2023-03-07 java / 추상 클래스와 추상 메소드

끼록관 2023. 3. 7. 18:26

추상 클래스와 추상 메소드

 

추상 클래스

추상 메소드가 하나 이상 있으면, 추상 클래스

선언은 되어 있으나 구현되어 있지 않은 메소드

 


ㅡ> function 함수명() { 구현부 } /

public class ClassName {

이 부분이 메소드

 pubic void test()   선언부

{ } 구현부  => 선언o / 구현 x 

}

구현 방법
선언부와 class 선언 부에도 abstract를 넣는다.

public abstract class ClassName {
 public abstract void test(); 
}


추상 메소드만 있어도 가능
public abstract class ClassName {
// public abstract void test(); 
}

추상 클래스의 구현

abstract 키워드 사용

자식클래스에서 오버라이딩 / 일반클래스가 될 수 있다.

 

 

  • 추상 메소드를 갖는 클래스가 추상 클래스가 됨
  • 추상 메소드 없이도 추상 클래스를 만들 수 있음.
  • 추상 클래스를 상속받는 서브 클래스에서 추상 메소드를 오버라이딩 해줘야 함! 

 

추상클래스로는 객체를 만들 수 없다.

왜 지정할 수 없냐? 클레스네임이 추상클래스이기 떄문

 

추상 클래스의 용도

설계와 구현 분리

클레스 네임이란건 설계입니다

이런 기능이 있어야

하위 클래스에서 객체를 만든다?

 

package java_first_project;


  public abstract class ClassName {
	
	  // 추상클래스
	  public abstract void test(); 
	  
	  public void test1() { 
	  }
	}
package java_first_project;

// 얘로 객체를 만들고싶음
// 부모클래스가 오버라이딩 > 오버라이딩: 부모것의 내용만 바꾸는 것
public class SubClass extends ClassName {
	// 추상클래스를 구현하기 전까지는 자식클래스도 추상클래스가 되어야 한다
	// 자식클래스가 부모클래스가 가진 모든 추상클래스를 구현해야 한다 그렇지 않으면, 자식클래스도 추상클래스가 되어야 한다.
	  public  void test() {}; 
	  	
}

만약 부모에 추상 메소드가 하나 더 추가해서 자식에 모두 구현 안됬다면 이렇게 오류가 뜸

방법 1 > 자식에서 test2() {} ; 중괄호  오버라이딩 하거나

방법 2 > abstract 를 클래스 선언부에 해준다 => 하지만 추상클래스가 되어 객체를 만들 수 없다는 점

그냥 부모에 있는 모든 메소드를 구현하도록 하자

 

 

슈퍼 클래스에서는 개념 정의

 

 

추상클래스 개념 정리

1. 추상 메소드를 하나라도 가지고 있으면, 그 클래스는 추상클래스가 된다.

2. 추상 클래스로는 객체를 만들 수 없다. ㅡ> 붕어빵 틀만 있음 

3. 추상 클래스를 상속받는 서브 클래스도 기본적으로 추상클래스가 될거임 

왜냐? 부모에 있는 추상 메소드를 자신이 가지고 있을 거기 때문에 (= 상속받기 때문에)

4. 서브 클래스로 객체를 만들고 싶다면, 부모클래스에 있는 모든 추상메소드를 "구현" 해야함.

어떻게? 부모클래스의 추상 메소드를 오버라이딩 해서!

 

 


실습 추상클래스 실습

 

 

 

 

 

 

 

 

 

 

 

 


인터페이스

  • 추상 메소드의 모음
  • 여러 구현체에서 공통적인 부분을 추상화 하는 역할
  • 서브 클래스가 같은 동작을 한다는 것을 보장하기 위해 사용

=> 인터페이스를 상속받는 클래스는 무조건 추상메소드를 구현해야만 한다.

 

추상클래스와 다른점

  • 추상 클래스는 추상 메소드가 없어도 상관 없다.
  • 하지만 인터페이스는 무조건 있어야 함!!
  • 메소드를 구현하지 못 함. 추상 메소드만 존재

 

인터페이스 문법

클래스가 아님.

package java_first_project;

// 인터페이스
// 추상메소드의 모음
public interface InterfaceTest {
	// 인터페이스는 일반 변수를 선언할 수 없다. !단, 상수는 변할수없는 값들은 가능
//	public int num;
	public final int num = 1; // 상수 선언은 final 과 초기화
	
	//interface는 어차피 추상메소드여서 abstract 생략 가능 
	public  void test();
	public  void test1(int num);
	
	// 추상메소드는 구현부가 있으면 오류가 생김
//	public int aaaa() {
//		
//	};
	
}

 

  • class 대신 interface를 쓰고
  • 상속시에 extends가 아닌, implements를 씁니다.
  • 기본적으로 public 키워드를 가지고있어, 생략 가능
  • 기본적으로 추상메소드여서 abstract 생략 가능

상수 => public final 생략가능 / 초기화를 안하면 오류 있다

 

위의 사진을 상속 받는 삼성 클래스

기능은 같은데 phone / 세세한 구현은 상속받는 클래스 삼성에서 한다.

 

@Overide => 코드가 헷갈릴때 표기하면 좋습니다. 명시적인것 

 

sendCall() 

if(무음)...

 

자바는 클래스를 상속받을때 다중상속이 불가능 합니다.

다중상속이란 두 개 이상의 클래스, 추상클래스는 ㄴㄴ

 

근데 인터페이스는 가능

 

인터페이스는 강제