hayu's 개발 일지

[TIL]240712 추상 클래스(Abstract) 본문

기술/java

[TIL]240712 추상 클래스(Abstract)

hayu00 2024. 7. 12. 21:09

공부한 내용

추상 클래스(Abstract)

  • 일반적인 클래스는 구체적으로 데이터를 담아 인스턴스화 하여 직접 다루는 클래스이다. 그 반대로 구체적이지 않은 추상적인 데이터를 담고 있는 클래스가 추상 클래스이다.
  • 추상 클래스는 일반 클래스와 다르게 인스턴스화가 불가능한 클래스이며, 추상 클래스를 선언할 때는 abstract 키워드를 사용한다는 차이점이 있다.

추상화

  • 객체 지향 프로그래밍 특징 중 하나이다.
  • 추상화는 객체 지향(oop)의 핵심이며 객체 프로그래밍의 시작이 되기도 한다.
    • 예) 문자를 대문자로 변환해주는 String.toUpperCase() 라는 메서드일 경우, 우리는 이 메서드가 내부에서 어떤식으로 동작하여 소문자를 대문자로 변환 해주는 로직에 대해 자세히 알지도 못한다. 그저 대문자로 모두 변환된 문자열을 결과값으로 받아서 사용할 뿐이다.
    • 즉, 우리는 구체적으로 알지도 못하는 String.toUpperCase() 라는 클래스와 그 안에 있는 메서드를 그냥 생각없이 사용해왔던 것이고, 생각이 없다는 것은 곧 추상적이라고 말할 수 있는 것이다.
String text = "Hello world";
String textUpper = text.toUpperCase(); 
// 우리는 메서드 내부가 어떤식으로 돌아가는지 생각 없이 결과값만 받을 뿐이다. 
// 그냥 메서드 내부에서 대충 알아서 잘 대문자로 마술같이 변환해주겠지 하고 막연하게 추상적으로 생각할 뿐이다.

System.out.println(textUpper); // "HELLO WORLD";

⇒ 추상 클래스는 추상화를 클래스에 결합시킨 것이다.

추상 클래스의 용도

  • 클래스는 인스턴스를 생성해주는 틀이나 설계도와 같은 개념이다.
  • 인스턴스 객체 자료형을 사용하여 우리는 구조적으로 프로그램을 설계할 수 있다.

→ 이것이 객체 지향적 프로그래밍이라고 불리는 이유다.

⇒ 추상 클래스는 클래스에 추상화를 결합시켜 보다 구조적이게 객체 설계를 하고, 프로그램의 유지보수성을 올리며, 어떠한 기능을 수정 / 추가 를 유연하게 만들어준다.

추상 클래스 기본 문법

  • 자바에서는 abstract 키워드를 클래스명과 메서드명 옆에 붙임으로서 컴파일러에게 추상 클래스와 추상 메서드임을 알린다.
  • 추상 메서드는 작동 로직은 없고 이름만 남아았는 메서드이다.

→ 메서드의 선언부만 작성하고 구현부는 미완인 채로 남기는 것이다.(메서드의 구현부인 중괄호가 없는 상태이다.)

  • 보통 문법적인 측면으로는 하나 이상의 추상 메서드를 포함하는 클래스를 가리켜 추상 클래스라고 정의한다.
  • 추상 클래스 안의 메서드를 미완으로 남겨 놓는 이유는 추상 클래스를 상속받는 자식 클래스의 주제에 따라서 상속 받는 메서드의 내용이 달라질 수 있기 때문이다.
  • 부모(추상) 클래스에서 메서드를 선언부만을 작성하고, 실제 내용은 상속받는 클래스에서 구현하도록 하기 위해 일부로 비워두는 개념이다.

→ 추상 클래스를 상속받는 자식 클래스는 부모의 추상 메서드를 상황에 맞게 재정의하여 구현해야 사용이 가능하다.

⇒ 클래스의 선언부에 abstract 키워드가 있다는 말은 안에 추상 메서드(abstract mathod)가 있어, 상속을 통해 구현해주라는 지침이기도 하다.

// 추상 클래스
abstract class Pet {
    abstract public void walk(); // 추상 메소드
    abstract public void eat(); // 추상 메소드
    
    public int health; // 인스턴스 필드
    public void run() {  // 인스턴스 메소드
    	System.out.println("run run");
    }
}

class Dog extends Pet {
	// 상속 받은 부모(추상) 메소드를 직접 구현
    public void walk() {
        System.out.println("Dog walk");
    }
    public void eat() {
    	System.out.println("Dog eat");
    }
}

public class main {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.eat(); // 부모(추상) 클래스로 부터 상속받은 추상 메소드를 직접 구현한 메소드를 실행
        d.walk();
        d.run(); // 부모(추상) 클래스의 인스턴스 메소드 실행
    }
}
  • 추상 클래스에서 추상 메서드를 포함하는 것을 제외하면 일반 클래스와 다를 게 없다.
  • 추상 클래스도 생성자가 존재하며, 독립적인 인스턴스 멤버 변수와 메서드를 가질 수 있다.

 

 

회고

- 추상 클래스를 공부하는데 이해하기가 너무 어려웠다.. 

- 다시 돌아가서 공부해보기로 했다. 

 

'기술 > java' 카테고리의 다른 글

[TIL]240711 자바 코드 구조 이해  (0) 2024.07.11
[TIL]240710 상속  (0) 2024.07.10
[TIL]240706 final  (0) 2024.07.06
[TIL]240705 static  (0) 2024.07.05
[TIL]240704 자바 메모리 구조  (0) 2024.07.04