To-do list

객체상속 ~ 추상화, 인터페이스

상속(Inheritance)

자바에서 상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소이다.
상속은 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 것을 의미한다.

부모와 자식으로 생각하면, 자식은 어머니와 아버지의 능력들을 물려받듯이 하위 클래스는 상위 클래스의 모든 멤버를 상속받게 된다.

하지만, 모든 멤버를 상속받더라도 항상 직접적으로 접근할 수 있는 것은 아니다.
상위 클래스의 필드나 메서드의 접근 제한자가 private이면, 같은 패키지일 지라도 하위 클래스는 해당 필드나 메서드에 직접적으로 접근하지 못한다.
상위 클래스의 필드나 메서드의 접근 제한자가 default이면, 상위 클래스와 하위 클래스가 다른 패키지일 때 하위 클래스는 해당 필드나 메서드에 직접적으로 접근하지 못한다.
이럴 경우, getter와 setter를 이용해 간접적으로 접근해야 한다.

자바에서의 상속은 상위 클래스는 여러 하위 클래스를 가질 수 있지만, 하위 클래스는 여러 상위 클래스를 가질 수 없다. 즉, 단일 상속만을 허용한다.

상속을 받기 위해서는 extends 키워드를 사용한다.

추상화

추상화는 클래스들의 공통적인 요소를 뽑아서 상위 클래스를 만들어내는 것이다. 반드시 상위 클래스일 필요는 없어서, 공통적인 속성과 기능을 정의한 하위 클래스를 생성할 수도 있다. 한 마디로 추상화는 공통적인 속성과 기능을 정의함으로써 코드의 중복을 줄이고, 클래스 간 관계를 효과적으로 설정하고, 유지/보수를 용이하게 하는 것이다. 자바에서는 추상 클래스와 인터페이스라는 문법 요소를 통해 추상화를 구현한다.

💁‍♀️ abstract 제어자
abstract는 주로 클래스와 메서드에 붙이는 키워드인데, 이것을 붙이면 자동으로 '추상 클래스'와 '추상 메서드'가 된다. abstract는 '추상적인'이라는 사전적인 의미가 있지만, 핵심은 '미완성'이라는 개념에 있다. abstract class 클래스명 { ... }와 같이 클래스 선언부가 작성되어 있으면 이것은 미완성된 추상 클래스이므로 상속을 통해 내부의 추상 메서드를 구현해줘야한다는 점을 알 수 있다.
(추상 메서드가 없더라도 키워드를 붙여서 추상 클래스로 지정할 수 있다. 다만 메서드 바디가 완성 되기 전까지는 이를 기반으로 한 인스턴스 생성이 불가하다.)

추상 클래스

추상 클래스는 한 마디로 미완성 설계도이다. 미완성이기 때문에 이를 기반으로 인스턴스를 생성할 수 없다. 오직 상속을 통해 하위 클래스에서만 완성될 수 있다. 클래스 역할을 못하는 추상 클래스가 필요한 이유는 이것이 새로운 클래스를 작성하는데 유용한 바탕이 되어주기 때문이다. 무에서부터 클래스를 만드는 것보다는, 추상 클래스라는 최소한의 틀에서 확장시키는 것이 편리하기도 하고 설계에 있어 유연함을 가져다준다.

추상 메서드

추상 메서드는 구현부가 없이 선언부만 있는 메서드이다. 추상 클래스와 마찬가지로 설계만 하고 구체적인 내용을 작성하지 않아 미완성 메서드이다.

추상 클래스 속 추상 메서드의 예시이다. 추상 메서드는 구현부가 없으므로 {} 대신 끝을 표시해주는 의미로 ;를 적어준다. 추상 메서드의 구현은 하위 클래스로 상속하여 실행할 수 있는데, 이때 사용하게 되는 것이 '오버라이딩'이다. 오버라이딩을 통해 메서드를 완성시키고, 이렇게 완성된 클래스로 해당 인스턴스를 생성할 수 있다.

인터페이스

터페이스는 일종의 추상 클래스이다. 추상 클래스와 다른 점이 있다면 더 높은 추상화 정도를 가지고 있어서 바디가 있는 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다는 점이다.

인터페이스는 interface 키워드를 사용해 만든다. 또한 예시를 보면 알 수 있듯이 구현부가 완성되지 않은 추상 메서드와 상수로만 이루어져있다. 일반 클래스와 다르게 내부의 필드가 public static final로 정의되어있다. 이러한 요소가 인터페이스의 필드와 메서드에 내포되어 있기 때문에 생략해도 괜찮다. 다만 상수로 정의하는 경우네는 public static final로, 메서드로 정의할 때는 public abstract로 정의해야지만 일부 또는 전부 생략할 수 있다.

회고

객체지향의 핵심 개념인 다형성,캡슐화,추상화,상속 등 의 개념을 활용하여 간단한 프로그램을
작성해 보았다 이를 통해 각각의 특성 들이 왜 필요한 것인지 어떻게 사용하는 것인지에 대해
학습 하게 되었고 객체지향 코드를 작성할 때에는 관점에 따라 더 어려울 수 있으나 작성한 후
유지보수 시에는 확실한 강점이 있다고 느껴졌다.

profile
코린이 개발공부

0개의 댓글