사이먼's 코딩노트
[Java] 추상 클래스 / 인터페이스 본문
[추상 클래스]
- 아래 코드를 해석하면서 추상 클래스라는 새로운 개념에 대해 소개하겠다.
public class Main {
public static void main(String[] args) {
칼 a무기1 = new 칼();
활 a무기2 = new 활();
총 a무기3 = new 총();
// 모든 무기 작동();
a무기1.작동();
a무기2.작동();
a무기3.작동();
}
}
abstract class 무기 {
abstract void 작동();
}
class 칼 extends 무기 {
void 작동() {
System.out.println("칼 작동");
}
}
class 활 extends 무기 {
void 작동() {
System.out.println("활 작동");
}
}
class 총 extends 무기 {
void 작동() {
System.out.println("총 작동");
}
}
- 무기의 종류는 칼, 활, 총이 있고 각각 a무기1, a무기2, a무기3 라는 변수와 함께 각각의 무기 객체가 생성되었다.
- 무기 종류별로 객체를 가지려면 칼, 활, 총이라는 설계도가 있어야하기 때문에 class를 생성해준다.
- 상식적으로 칼, 활, 총은 모두 무기에 속하기 때문에 무기라는 class도 생성하여 각 타입의 무기들은 무기 클래스를 상속받도록 extends를 사용한다.
- Main 메서드에서 각 객체 변수별로 작동() 메서드를 호출하는데 오버라이딩을 통해 무기 클래스를 포함한 모든 클래스에 작동() 메서드를 생성하고 각 기능을 부여한다.
- 이 때 사실상 무기 클래스에 생성된 작동() 메서드는 실질적으로 하는 일이 없다.
- 이처럼 상속된 클래스에서 직접적으로 메서드 호출을 해서 부모의 메서드가 할 일이 없을 때 추상 메서드를 사용한다.
- 추상적임을 코드에서 표현할 때는 abstract를 앞에 작성해주고 class에도 반드시 앞에 abstract를 작성해줘야 한다.
- 또한 추상 메서드는 대괄호{ } 를 작성하지 않는다.
- 이 때, 추상 메서드를 하나라도 가지고 있는 클래스를 추상 클래스라고 한다.
- 추상 클래스는 선택적이며, 추상 클래스 안에는 무조건 추상 메서드만을 생성해야되는 것은 절대 아니고 일반 메서드도 작성이 가능하다.
- 만약 추상 클래스에 일반 메서드를 작성하면 해당 클래스는 순도 100% 짜리 추상 클래스가 아니라고 표현한다.
- 추상 메서드가 선언되었다면 자식 역할을 하는 클래스에서 무조건 오버라이딩을 해줘야한다.
- 추상 클래스로는 객체를 생성할 수 없다.
[인터페이스]
- 아래 코드를 해석하면서 추상 클래스에서 조금 더 심화된 인터페이스에 대해 소개하겠다.
public class Main {
public static void main(String[] args) {
칼 a무기1 = new 칼();
활 a무기2 = new 활();
총 a무기3 = new 총();
// 모든 무기 작동();
a무기1.작동();
a무기2.작동();
a무기3.작동();
}
}
interface 무기 {
void 작동();
}
class 칼 implements 무기 {
public void 작동() {
System.out.println("칼 작동");
}
}
class 활 implements 무기 {
public void 작동() {
System.out.println("활 작동");
}
}
class 총 implements 무기 {
public void 작동() {
System.out.println("총 작동");
}
}
- 앞서 추상 클래스를 정의할 때 상속된 클래스에서 직접적으로 부모 클래스가 할 일이 없을 때 abstract를 사용하여 추상클래스를 사용했었다.
- 만약 추상 클래스 안에 모든 메서드가 추상 메서드이면 그 때는 class 대신 interface를 사용한다.
- 말 그대로 인터페이스는 순도 100% 자리 추상 클래스라고 생각하면 된다.
- 클래스 대신 인터페이스를 사용할 때는 메서드에 abstract를 써 줄 필요가 없다.
- 인터페이스로 생성되었다면 클래스끼리 상속을 할 때 extends가 아닌 implements를 사용한다.
- implements로 상속받은 클래스의 메서드는 메스드 앞에 public를 반드시 붙여야 한다.
- 인터페이스의 장점 중 최대 장점은 다중 상속이 가능하다는 것이다.
반응형
'Java > Java' 카테고리의 다른 글
[Java] ArrayList (0) | 2024.02.19 |
---|---|
[Java] 종합 문제풀이 (0) | 2024.02.19 |
[Java] 생성자 문제풀이 (1) | 2024.02.14 |
[Java] 캐스팅 / 생성자 (2) | 2024.02.14 |
[Java] 클래스와 메서드를 활용한 문제풀이 (0) | 2024.02.06 |