일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 프로그래머스 #파이썬 #python #슬라이싱 #코딩
- 알고리즘 #백준 #집합과맵
- GPT #챗봇
- Python
- 문자열
- Anaconda #가상환경
- 라이브러리 #IT지식 #CS지식
- 맵핑
- 스톱워치
- 백준 #알고리즘
- 추상클래스 #인터페이스
- Java #객체지향 # 프로그래밍 # SOLID #OOP
Archives
- Today
- Total
고통은 사라지고 결과는 남는다. Records of Chansolve
추상클래스와 인터페이스 (Java) 본문
추상 클래스와 인터페이스
추상화
- 추상화는 클래스들의 공통적인 요소를 뽑아서 상위 클래스를 만들어내는 것
- 반드시 상위 클래스일 필요는 없어서, 공통적인 속성과 기능을 정의한 하위 클래스를 생성할 수도 있다.
- 한 마디로 추상화는 공통적인 속성과 기능을 정의함으로써 코드의 중복을 줄이고, 클래스 간 관계를 효과적으로 설정하고, 유지·보수를 용이하게 하는 것
- 자바에서는 추상 클래스와 인터페이스라는 문법 요소를 통해 추상화를 구현한다.
abstract 제어자
abstract
는 주로 클래스와 메서드에 붙이는 키워드- 이것을 붙이면 자동으로 '추상 클래스'와 '추상 메서드'가 된다.
abstract
는 '추상적인'이라는 사전적인 의미가 있지만, 핵심은 '미완성'이라는 개념에 있다.abstract class 클래스명 { ... }
와 같이 클래스 선언부가 작성되어 있으면 이것은 미완성된 추상 클래스이므로 상속을 통해 내부의 추상 메서드를 구현해줘야한다는 점을 알 수 있다.- 추상 메서드가 없더라도 키워드를 붙여서 추상 클래스로 지정할 수 있다. 다만 메서드 바디가 완성 되기 전까지는 이를 기반으로 한 인스턴스 생성이 불가
추상 클래스 (abstract class)
- 추상 클래스는 한 마디로 미완성 설계도이다.
- 미완성이기 때문에 이를 기반으로 인스턴스를 생성할 수 없다.
- 오직 상속을 통해 하위 클래스에서만 완성될 수 있다.
- 클래스 역할을 못하는 추상 클래스가 필요한 이유는 이것이 새로운 클래스를 작성하는데 유용한 바탕이 되어주기 때문
- 무에서부터 클래스를 만드는 것보다는, 추상 클래스라는 최소한의 틀에서 확장시키는 것이 편리하기도 하고 설계에 있어 유연함을 가져다 줌
추상 메서드 (abstract method)
- 추상 메서드는 구현부가 없이 선언부만 있는 메서드이다.
- 추상 클래스와 마찬가지로 설계만 하고 구체적인 내용을 작성하지 않아 미완성 메서드이다.
public interface Dog {
public static final int age = 5;
final int weight = 10; // public static 생략
static int registernum = 49; // public & final 생략
public abstract String getDogInfo();
void info()
}
- 추상 클래스 속 추상 메서드의 예시이다.
- 추상 메서드는 구현부가 없으므로 { } 대신 끝을 표시해주는 의미로 ;를 적어준다.
- 추상 메서드의 구현은 하위 클래스로 상속하여 실행할 수 있는데, 이때 사용하게 되는 것이 '오버라이딩'이다.
- 오버라이딩을 통해 메서드를 완성시키고, 이렇게 완성된 클래스로 해당 인스턴스를 생성할 수 있다.
인터페이스 (Interface)
- 인터페이스는 일종의 추상 클래스이다.
- 추상 클래스와 다른 점이 있다면 더 높은 추상화 정도를 가지고 있어서 바디가 있는 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다는 점이다.
- 인터페이스는
interface
키워드를 사용해 만든다. 또한 예시를 보면 알 수 있듯이 구현부가 완성되지 않은 추상 메서드와 상수로만 이루어져있다. - 일반 클래스와 다르게 내부의 필드가 public static final로 정의되어있다.
- 이러한 요소가 인터페이스의 필드와 메서드에 내포되어 있기 때문에 생략해도 괜찮다.
- 상수로 정의하는 경우에는
public static final
- 메서드로 정의할 때는
public abstract
로 정의해야지만 일부 또는 전부 생략할 수 있다.
- 상수로 정의하는 경우에는
- 이러한 요소가 인터페이스의 필드와 메서드에 내포되어 있기 때문에 생략해도 괜찮다.
public interface Dog {
public static final int age = 5;
final int weight = 10; // public static 생략
static int registernum = 49; // public & final 생략
public abstract String getDogInfo();
void info()
}
final 키워드
- '최종'이라는 뜻을 가진
final
키워드는 필드, 지역 변수, 클래스 앞에 위치할 수 있다. - 클래스 앞에 있을 때는 변경∙확장∙상속 불가, 메서드 앞에 있을 때는 오버라이딩 불가, 변수 앞에 있을 때는 값 변경이 불가하다.
final class Final { final int a = 100; final void run() { final int localVar = x; return x; } }
- 코드로 살펴보면 위와 같다.
- Final 클래스는 변경∙확장∙상속이 안 되고, int a는 변경할 수 없고, run() 메서드는 오버라이딩이 불가하다.
interface Dog { ... }
interface Cat { ... }
interface FurryAnimals extends Dog, Cat { ... }
- 다시 인터페이스로 돌아와서, 인터페이스는 인터페이스로부터만 상속 받을 수 있다.
- 자바에서 불가한 다중상속이 인터페이스에서는 가능해서 여러 개의 인터페이스로부터 상속 받는 것도 가능
- 참고로 Object 클래스와 같은 최고 클래스는 없다.
- 클래스 상속처럼 하위 인터페이스는 상속 받은 상위 인터페이스의 멤버를 모두 상속 받는다.
class 클래스명 implements 인터페이스명 { 추상메서드 구현 }
- 인터페이스는 구현시
implements
키워드를 사용한다. - 만약 구현하는 인터페이스 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야 한다.
abstract class 클래스명 implements 인터페이스명 { (메서드) { ... } }
인터페이스 활용 코드
- 인터페이스와 다형성을 활용
public interface Student {
String getHomeWork();
}
class StudentA implements Student {
public String getHomeWork() {
return "two pages of essay";
}
}
class StudentB implements Student {
public String getHomeWork() {
return "ten math questions";
}
}
- 먼저 Student라는 인터페이스를 만들어 임의의 학생 두 명을 위한 클래스를 Student로부터 implements했다.
public class Teacher {
public void giveHomeWork(Student student) {
System.out.println("Assignment of the day : " + student.getHomeWork());
}
}
- 이후 Teacher 클래스를 작성해 매개변수로 Student 타입이 입력될 수 있게끔 만들어주었다.
public class InterfacePractice {
public static void main(String[] args) {
Teacher teacher = new Teacher();
Student studentA = new StudentA();
Student studentB = new StudentB();
teacher.giveHomeWork(studentA);
teacher.giveHomeWork(studentB);
}
}
// 출력:
// Assignment of the day : two pages of essay
//Assignment of the day : ten math questions
- 마지막으로 InterfacePractice 클래스에서 테스트를 해보면 선생님이 두 학생에게 각자 다른 숙제를 내주는 출력값이 나오는 것을 확인할 수 있었다.
인터페이스 vs 추상클래스 비교
정리
추상클래스
- 추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스
- 추상클래스는 다중 상속이 불가능하여 단일 상속만 허용한다
- 추상클래스는 추상 메소드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질수 있다
- 이러한 특징으로, 추상클래스는 추상화(추상 메서드)를 하면서 중복되는 클래스 멤버들을 통합 및 확장을 할 수 있다
- 같은 추상화인 인터페이스와 다른점은, 추상클래스는 클래스간의 연관 관계를 구축하는 것에 초점을 둔다
인터페이스
- 내부의 모든 메서드는
public abstract
로 정의 (default 메소드 제외) - 내부의 모든 필드는
public static final
상수 - 클래스에 다중 구현 지원
- 인터페이스 끼리는 다중 상속 지원
- 인터페이스에도
static
,default
,private
제어자를 붙여 클래스 같이 구체적인 메서드를 가질 수 있음- 따라서 하위 멤버의 중복 메서드 통합을 어느정도 할수는 있겠지만, 필드는 상수이기 때문에 중복 필드 통합은 불가능
- 인터페이스는 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상 메서드를 정의해놓고 구현(implement)하는 식으로 추상클래스보다 자유롭게 붙였다 땟다 사용
- 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점
- 다중 구현이 된다는 점을 이용해, 내부 멤버가 없는 빈 껍데기 인터페이스를 선언하여 마커 인터페이스 로서 이용 가능
- 보통
xxxable
이런 형식으로 인터페이스 네이밍 규칙을 따름
'Computer Science' 카테고리의 다른 글
[SQLD] 식별자 (0) | 2023.03.03 |
---|---|
이진 트리 순회 (0) | 2023.03.03 |
맵핑(Mapping) (0) | 2023.02.24 |
라이브러리(Library) (0) | 2023.02.16 |
객체 지향 프로그래밍(Object Oriented Programming) (0) | 2023.02.16 |
Comments