추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해놓은 추상적인 클래스로, 실체 클래스의 멤버(필드, 메소드)를 통일하는데 목적이 있다.
모든 실체들이 가지고 있는 메소드의 실행 내용이 동일하다면 추상 클래스에 메소드를 작성하는 것이 좋다.
하지만 메소드의 선언만 통일하고, 실행 내용은 실체 클래스마다 달라야하는 경우가 있다.
이런 경우를 위해서 추상 클래스는 추상 메소드를 선언할 수 있다.
추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를 말한다
추상메소드
-어떤 클래스가 자식 클래스만을 위해 존재하는 경우 추상 클래스로 정의해 사용가능
-부모 클래스에 메소드 이름은 존재하지만 메소드 내용은 필요하지 않은 경우 추상메소드로 선언 가능
-추상 메소드가 하나라도 있다면 그 클래스는 반드시 추상 클래스가 되어야 함.
-추상 메소드가 없어도 추상클래스로 선언할 수 있다. 하지만 추상 클래스로 선언했기 때문에 객체를 생성할 수 없다.
-따라서 추상 메소드를 상속받는 자식 메소드는 오버라이딩해서 메소드 내용을 만들어 넣거나 자식 클래스도 추상 클래스로 만들어야 한다. 그렇지 않으면 에러가 발생한다.
추상 클래스의 특징
일반 클래스처럼 멤버변수, 생성자, 일반 메소드 모두 가질수 있음
추상 클래스는 객체를 만들수 없는 클래스
추상 클래스의 메소드는 일반 메소드일 수도 있고 추상 메소드일 수도 있음
추상 클래스 내의 메소드는 추상 메소드로 구현하는 것이 바람직함
추상 메소드는 선언만 있고 구현 내용은 없음
추상 메소드를 갖는 클래스는 반드시 추상 클래스가 되어야함.
추상 메소드는 반드시 자식 클래스에서 오버라이딩해야함. 그렇지 않으면 자식 클래스도 추상 클래스가 되어야함.
추상 클래스는 자식 클래스를 만들어 다형성을 이용
추상 메소드에는 private 접근 제어자를 붙이면 자식 클래스에서 접근할 수 없으므로 private 접근 제어자를 사용하지 않음.
추상 메소드를 갖지 않아도 추상 클래스로 정의 가능
추상 메소드는 abstract라는 키워드를 넣고 실행구문인 {}부분이 없다! 메소드의 선언만 통일하고 실행 내용은 실체 클래스마다 달라야 하는 경우 추상 메소드를 선언한다.
추상 메소드가 없어도 추상 클래스로 선언할 수 있지만 추상 메소드가 하나라도 있다면 그 클래스는 반드시 추상 클래스로 선언해야한다!!
추상 메소드를 상속받는 자식 메소드는 오버라이딩해서 메소드 내용을 만들어 넣거나 자식 클래스도 추상 클래스로 만들어야 한다. 그렇지 않으면 에러가 난다.
추상 클래스는 자식만을 위해 존재하는 클래스이므로 자기 자신의 객체를 생성할 수는 없고 자식이 상속받아 객체를 생성해야 한다
인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.
그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.
인터페이스 선언은 class 키워드 대신에 interface 키워드를 사용한다.
인터페이스 이름은 클래스 이름을 작성하는 방법과 동일하다. 영어 대소문자를 구분하며, 첫 글자를 대문자로 하고 나머지는 소문자로 작성하는 것이 관례이다.
클래스는 필드, 생성자, 메소드를 구성 멤버로 가지는데 비해, 인터페이스는 상수 필드와 추상 메소드만을 구성 멤버로 가진다. 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없
인터페이스는 객체 사용 방법을 정의한 것이므로 실행 시 데이터를 저장할 수 있는 인스턴스 또는 정적 필드를 선언할 수 없다. 그러나 상수 필드는 선언이 가능하다. 단, 상수는 인터페이스에 고정된 값으로 실행 시에 데이터를 바꿀 수 없다.
상수는 public static fimal로 선언한다. 따라서 인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다. 키워드를 싱략하더라도 컴파일 과정에서 자동으로 붙는다.
인터페이스로 호출된 메소드는 객체에서 실행되므로 추상 메소드로 선언해야 한다.
인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에 public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.
인터페이스 구현
개발 코드가 인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다.
객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야 한다.
이러한 객체를 인터페이스의 구현객체라고 하고, 구현 객체를 생성하는 클래스를 구현 클래스라고 한다.
구현 클래스는 보통의 클래스와 동일한데, 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해야 한다.
그리고 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야 한다.
*구현 클래스에서 인터페이스의 추상 메소드에 대한 실체 메소드를 작성할 때 주의할 점은 인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 때문에 public보다 더 낮은 접근 제한으로 작성할 수 없다.
인터페이스는 추상 메소드만 가지고 있어야한다.
인터페이스를 통해 호출된 메소드는 최종적으로 실체 클래스로 만들어진 객체에서 실행이 되므로 메소드는 주로(무조건이 아님) 실행 블록이 없는 추상메소드로 선언한다.
인터페이스에 선언된 추상 메소드는 모두 public abstract의 특징을 갖기 때문에 생략하더라도 컴파일 과정에서 자동으로 public abstract 키워드가 붙는다.
인터페이스로 선언시에는 인터페이스명 앞에 interface 키워드를 class 대신에 사용한다.
인터페이스는 객체의 사용 방법을 정의한 것이다.
때문에 실행시에 데이터를 저장할 수 있는 인스턴스나 정적 필드는 선언할 수 없고 상수 필드만 선언할 수 있다 (추상 클래스와의 차이점 1)
인터페이스의 상수는 public static final을 생략하더라도 컴파일 과정에서 자동으로 붙게된다.
인터페이스 상수는 반드시 선언과 동시에 초기값을 지정해야한다!
'Java > information' 카테고리의 다른 글
[자바/JAVA] 중첩클래스 (0) | 2023.05.11 |
---|---|
[자바/JAVA] interface (0) | 2023.05.09 |
[자바/JAVA] 추상 클래스 (0) | 2023.05.02 |
[자바/JAVA] 다형성 (0) | 2023.04.28 |
[자바/JAVA] 상속 (0) | 2023.04.26 |