[Java/복습] 객체지향 프로그래밍 6
1. 추상 클래스
추상 메서드를 선언해 놓고 상속을 통해 자식 클래스에서 메서드를 완성하도록 유도하는 클래스
abstract class 클래스이름 {
...
abstract 반환타입 메소드이름();
...
}
: 미완성 설계도라고 표현하기도 한다.
: 추상 클래스는 동작이 정의되어 있지 않은 추상 메소드를 포함하고 있으므로, 인스턴스를 생성할 수 없다. 추상 클래스는 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식 클래스에서 추상 클래스의 모든 추상 메소드를 오버라이딩하고 나서야 비로소 자식 클래스의 인스턴스를 생성할 수 있게 된다.
: 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다.
ChatGPT 추상 클래스를 사용하여 다형성을 구현할 수 있습니다. 추상 클래스에서 선언된 추상 메소드는 서브 클래스에서 구현될 때, 각각의 서브 클래스에 맞게 다르게 동작할 수 있습니다. 이렇게 동일한 이름의 메소드를 서로 다른 클래스에서 다른 방식으로 구현하는 것이 다형성의 핵심 아이디어입니다. 추상 클래스를 활용하여 다형성을 구현하면, 코드의 재사용성과 유연성이 높아지며, 프로그램의 확장성도 향상될 수 있습니다. 추상 클래스를 정의함으로써 공통적인 동작을 추상화하고, 다양한 구체 클래스에서 이를 구현함으로써 다형성을 실현할 수 있습니다. |
: Class 앞에 "abstract" 예약어를 붙여 해당 클래스가 추상 클래스임을 나타낸다. ( 또한 메서드도 "abstract" 예약어를 붙여 추상 메서드를 선언할 수 있다. )
: 추상 클래스는 추상 메서드를 가지지 않아도 괜찮다. 다만, 추상 메서드를 하나라도 가진다면 그 클래스는 추상 클래스가 된다.
: 또한 JAVA는 다중 상속을 지원하지 않기 때문에 여러 개의 추상 클래스를 상속할 수 없다.
2. 추상 메서드
abstract 반환타입 메소드이름();
// 위와 같이 선언부만 있고 구현부가 없다는 의미로 선언부 끝에 바로 세미콜론(;)을 추가
: 자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다. 즉, 추상 메서드를 선언했다면 자식 클래스는 해당 메서드를 반드시 구현하도록 강제된다.
: 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 받아 사용하는 쪽에서는 자신에게 필요한 부분만을 재정의하여 사용함으로써 생산성이 향상되고 배포 등이 쉬워진다.
: 이러한 추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않다. 바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것.
추상 클래스를 사용해야 하는 이유 및 예제 관련 하기 블로그 참고 :D
https://coding-factory.tistory.com/866
[Java] 자바 추상 클래스(Abstract Class) 사용법 & 예제
추상 클래스(Abstract Class)란? 추상(abstract)이란 무엇일까요? 추상의 사전적 의미는 사물이나 표상(表象)을 어떤 성질·공통성·본질에 착안하여 그것을 추출(抽出)하여 파악하는 것이라고 합니다.
coding-factory.tistory.com
3. 내부 클래스
class Outer { // 외부 클래스
...
class Inner { // 내부 클래스
...
}
...
}
내부 클래스(inner class)란 하나의 클래스 내부에 선언된 또 다른 클래스를 의미한다.
내부 클래스는 외부 클래스(outer class)에 대해 두 개의 클래스가 서로 긴밀한 관계를 맺고 있을 때 선언할 수 있다.
■ 내부 클래스의 장점
1. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있게 된다.
2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킨다.
3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있다.
■ 내부 클래스의 종류
1. 정적 클래스(static class)
: 외부 클래스 영역에 선언된 클래스 중에서 static 키워드를 가지는 클래스이며, 외부 클래스(outer class)의 클래스 메소드에 사용될 목적으로 선언된다.
2. 인스턴스 클래스(instance class)
: 외부 클래스 영역에 선언된 클래스 중에서 static 키워드를 가지지 않는 클래스이며, 외부 클래스(outer class)의 인스턴스 변수나 인스턴스 메소드에 사용될 목적으로 선언된다.
3. 지역 클래스(local class)
: 외부 클래스의 메소드나 초기화 블록에 선언된 클래스이며, 선언된 블록 내에서만 사용할 수 있다.
3-2. 익명 클래스(anonymous class)
// 익명 클래스는 선언과 동시에 생성하여 참조변수에 대입함.
클래스이름 참조변수이름 = new 클래스이름(){
// 메소드의 선언
};
: 익명 클래스(anonymous class)란 다른 내부 클래스와는 달리 이름을 가지지 않는 클래스를 의미한다.
여기서 이름을 가지지 않는다는 것은, 클래스 선언을 별도로 하지 않고 클래스 선언과 동시에 객체를 생성한다는 뜻이다.
: 아래에 명시한 블로그에서 확인할 수 있듯이, 익명 클래스는 전혀 새로운 클래스를 익명으로 사용하는 것이 아니라 이미 정의되어 있는 클래스의 멤버들을 재정의하여 사용할 필요가 있을 때 그리고 그것이 일회성으로 이용될때 사용하는 기법이다. (그렇기 때문에 내부 클래스이지만 클래스를 새로 정의할 필요가 없음 = 내부 클래스 선언 없음 = 내부 클래스 이름이 없음)
: 익명 클래스는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성하는 일회용 클래스 이다. 따라서 생성자를 선언할 수도 없으며, 오로지 단 하나의 클래스나 단 하나의 인터페이스를 상속받거나 구현할 수 있을 뿐이다.
: 이러한 익명 클래스는 매우 제한적인 용도에 사용되며, 구현해야 하는 메소드가 매우 적은 클래스를 구현할 때 사용된다.
익명 클래스 관련, 아래 블로그 추가 참고 :D
☕ 익명 클래스(Anonymous Class) 사용법 총정리
익명 클래스 (Anonymous Class) 익명 클래스는 내부 클래스(Inner class) 일종으로 단어 그대로 이름이 없는 클래스를 말한다. 익명, 이름이 없다는 것은 별로 기억되지 않아도 된다는 것이며, 나중에 다
inpa.tistory.com
4. 익명 내부 클래스를 이용한 추상 클래스의 인스턴스 생성
: 위에서 확인한 바와 같이, 추상 클래스는 자식 클래스가 추상 클래스를 상속받아서 추상 메소드를 오버라이딩 한 후에 '자식 클래스'의 인스턴스 생성이 가능하다. 다만, 익명 내부 클래스를 사용할 경우 추상 클래스의 인스터스 생성이 가능하다.
: 익명 내부 클래스는 추상 클래스나 인터페이스를 확장하거나 구현하는 임시 클래스로, 해당 클래스의 인스턴스를 생성할 수 있다.
참고 😎
1. https://code-lab1.tistory.com/287
2. http://www.tcpschool.com/java/java_polymorphism_abstract
3. http://www.tcpschool.com/java/java_usingClass_innerClass
4. https://coding-factory.tistory.com/866