객체지향의 특성 중 하나인 추상화는 상속과 관련이 있다.
객체지향의 특성 - 상속
객체지향의 특성 중 상속에 대해 기록해보려한다. 상속은 두 객체 사이에서 정의되는 관계다. 두 객체는 다음과 같다.상속을 해주는 객체: 상위, 부모, 혹은 super 객체상속을 받는 객체: 하위, 자
jtechtalk.tistory.com
상속에서 짚고 넘어갔듯이, 상속 관계에선 상위 객체가 하위 객체보다 추상적이어야 하고 하위 객체는 추상적인 상위 객체의 구체적인 상태여야 상속 관계가 바람직한 상속 관계다. 상속 관계에서 추상 객체와 구체 객체는 다음과도 같다.
- 추상화된 객체: 추상체
- 구체적인 객체: 구상체
상속과 추상화
추상화는 상대적이다. 상속의 관계도 추상화로 이루어진 관계라고 할 수 있다. 상대적으로 추상적인 상위 객체가 추상체, 그보다 더욱 구체적인 하위 객체가 구상체다. 이처럼 상속 관계에서는 상위에 있는 객체가 하위에 있는 객체보다 항상 추상적이어야 한다.
상속은 상위와 하위 두 객체 사이에서 이루어지는 관계다. 추상화의 개념은 더욱 넓게 사용될 수 있다. 부모의 부모 객체는 직접적인 상속은 아닐 수 있지만, 어쨌든 자식 객체의 추상체다. 부모의 부모 객체 또한 자식 객체보다 상대적으로 추상적이기 때문이다.
상속의 글에서 다뤘던 짱구를 다시 가져왔다.

짱구와 남자는 상속 관계에 있다. 남자보다 더 추상적인 객체인 사람과 포유류가 존재한다. 그렇기 때문에 상대적으로 더욱 추상적인 사람과 포유류 또한 짱구의 추상체가 되고, 짱구는 사람과 포유류의 구상체가 된다.
다시 한 번 말하지만, 추상화는 개념적이고 상대적인 요소이다. 남자는 짱구와 비교하면 추상체이지만, 사람과 비교하면 사람의 구상체이다.
의미적 추상체
추상체는 크게 두가지 종류가 있다. 의미적 추상체와 추상적인 기능을 가진 추상체다. 의미적 추상체부터 살펴보겠다.
class Login {
void login() {
log.info("login process");
}
}
class KakaoLogin extends Login {
@Override
void login() {
log.info("kakao login process");
}
}
위는 일반적인 로그인이 독립적으로 수행가능 할 때, 카카오 로그인 또한 독립적으로 수행가능한 예시이다.
카카오 로그인은 일반 로그인에 비해 더욱 구체적이다. 하지만 카카오 로그인의 수행과는 별개로, 일반 로그인 또한 독립적으로 수행가능하다. 일반 로그인과 카카오 로그인의 관계는 상속 관계이면서, 비교적 추상적인 Login 클래스는 독립적으로 기능을 수행할 수 있기 때문에 카카오 로그인에 비해 의미적으로만 추상적이다. Login은 의미적 추상체이다.
추상 클래스와 인터페이스
이렇게 독립적인 클래스 자체를 추상적으로 만들려면 비교가 되는 객체가 있어야만 추상적인 의미가 내포된다. 추상화는 클래스의 일부분만 명시적으로 추상시켜 이뤄질 수 있다. 객체가 전체적으로 구상이 필요한 것은 아니지만, 추상기능을 가진 것을 명시할 수 있다. 구상이 필요한 추상체의 기능을 나타내는 것을 abstract 키워드로 한다.
abstract class Login {
abstract void login();
}
class KakaoLogin extends Login {
@Override
void login() {
log.info("kakao login process");
}
}
이제 일반 로그인은 독립적인 기능을 할 수 없다. 상대적이고 의미적인 추상체가 아니라, 명시적으로 추상체임을 선언했기 때문이다. abstract가 붙은 메서드가 있다면, 그 하위의 구상체는 추상적인 메서드를 반드시 구현해야한다. abstract가 붙은 메서드가 하나라도 존재한다면 클래스 앞에도 abstract를 붙여 추상적인 기능이 존재함을 명시적으로 표시해주어야 한다. abstract class, 이것이 추상 클래스다.
위의 로그인처럼 상태도 없고 모든 기능들도 추상적이다. 즉, 객체의 모든 것이 추상적이니 객체 자체가 추상적이라고 할 수 있다. 이처럼 관리하는 상태가 없고 추상기능들로만 이루어진 클래스를 인터페이스라고 정의할 수 있다.
interface Login {
void login();
}
class KakaoLogin implements Login {
@Override
void login() {
log.info("kakao login process");
}
}
객체 안의 모든 것이 추상적임을 나타내기 때문에 interface 키워드로 정의만 해주면 내부의 메서드들은 abstract를 명시해주지 않아도 되고, 이러한 추상체를 구상하는 구상체는 extends가 아닌 implements 키워드를 사용한다.

인터페이스의 정의를 살펴보면, 두 시스템 등이 서로 만나고(face) 상호작용하는(interact) 지점이다. 두 객체가 바라보고 소통 등의 상호작용을 할 수 있게 만들어주는 지점 같은 존재가 바로 인터페이스이다. 소통을 위해선 의사전달만 하면된다. 의사는 구체적일 수도 있겠지만, 약속된 언어가 있다면 구체적이지 않아도 의미가 일맥상통한다. 그러한 약속된 언어가 인터페이스의 메서드이다. 인터페이스의 메서드로 두 시스템, 혹은 객체가 의사전달을 하며 소통을 할 수 있다.
References
프로그래머스 백엔드 데브코스 - 프레임워크를 위한 Java
'객체지향 프로그래밍' 카테고리의 다른 글
UML - Class Diagram (0) | 2024.05.25 |
---|---|
객체지향의 특성 - 다형성 (0) | 2024.05.24 |
객체지향의 특성 - 상속 (0) | 2024.05.21 |
객체지향의 특성 - 캡슐화 (정보은닉) (0) | 2024.05.21 |
객체지향 프로그래밍(OOP) 이야기 (1) | 2024.05.20 |
객체지향의 특성 중 하나인 추상화는 상속과 관련이 있다.
객체지향의 특성 - 상속
객체지향의 특성 중 상속에 대해 기록해보려한다. 상속은 두 객체 사이에서 정의되는 관계다. 두 객체는 다음과 같다.상속을 해주는 객체: 상위, 부모, 혹은 super 객체상속을 받는 객체: 하위, 자
jtechtalk.tistory.com
상속에서 짚고 넘어갔듯이, 상속 관계에선 상위 객체가 하위 객체보다 추상적이어야 하고 하위 객체는 추상적인 상위 객체의 구체적인 상태여야 상속 관계가 바람직한 상속 관계다. 상속 관계에서 추상 객체와 구체 객체는 다음과도 같다.
- 추상화된 객체: 추상체
- 구체적인 객체: 구상체
상속과 추상화
추상화는 상대적이다. 상속의 관계도 추상화로 이루어진 관계라고 할 수 있다. 상대적으로 추상적인 상위 객체가 추상체, 그보다 더욱 구체적인 하위 객체가 구상체다. 이처럼 상속 관계에서는 상위에 있는 객체가 하위에 있는 객체보다 항상 추상적이어야 한다.
상속은 상위와 하위 두 객체 사이에서 이루어지는 관계다. 추상화의 개념은 더욱 넓게 사용될 수 있다. 부모의 부모 객체는 직접적인 상속은 아닐 수 있지만, 어쨌든 자식 객체의 추상체다. 부모의 부모 객체 또한 자식 객체보다 상대적으로 추상적이기 때문이다.
상속의 글에서 다뤘던 짱구를 다시 가져왔다.

짱구와 남자는 상속 관계에 있다. 남자보다 더 추상적인 객체인 사람과 포유류가 존재한다. 그렇기 때문에 상대적으로 더욱 추상적인 사람과 포유류 또한 짱구의 추상체가 되고, 짱구는 사람과 포유류의 구상체가 된다.
다시 한 번 말하지만, 추상화는 개념적이고 상대적인 요소이다. 남자는 짱구와 비교하면 추상체이지만, 사람과 비교하면 사람의 구상체이다.
의미적 추상체
추상체는 크게 두가지 종류가 있다. 의미적 추상체와 추상적인 기능을 가진 추상체다. 의미적 추상체부터 살펴보겠다.
class Login {
void login() {
log.info("login process");
}
}
class KakaoLogin extends Login {
@Override
void login() {
log.info("kakao login process");
}
}
위는 일반적인 로그인이 독립적으로 수행가능 할 때, 카카오 로그인 또한 독립적으로 수행가능한 예시이다.
카카오 로그인은 일반 로그인에 비해 더욱 구체적이다. 하지만 카카오 로그인의 수행과는 별개로, 일반 로그인 또한 독립적으로 수행가능하다. 일반 로그인과 카카오 로그인의 관계는 상속 관계이면서, 비교적 추상적인 Login 클래스는 독립적으로 기능을 수행할 수 있기 때문에 카카오 로그인에 비해 의미적으로만 추상적이다. Login은 의미적 추상체이다.
추상 클래스와 인터페이스
이렇게 독립적인 클래스 자체를 추상적으로 만들려면 비교가 되는 객체가 있어야만 추상적인 의미가 내포된다. 추상화는 클래스의 일부분만 명시적으로 추상시켜 이뤄질 수 있다. 객체가 전체적으로 구상이 필요한 것은 아니지만, 추상기능을 가진 것을 명시할 수 있다. 구상이 필요한 추상체의 기능을 나타내는 것을 abstract 키워드로 한다.
abstract class Login {
abstract void login();
}
class KakaoLogin extends Login {
@Override
void login() {
log.info("kakao login process");
}
}
이제 일반 로그인은 독립적인 기능을 할 수 없다. 상대적이고 의미적인 추상체가 아니라, 명시적으로 추상체임을 선언했기 때문이다. abstract가 붙은 메서드가 있다면, 그 하위의 구상체는 추상적인 메서드를 반드시 구현해야한다. abstract가 붙은 메서드가 하나라도 존재한다면 클래스 앞에도 abstract를 붙여 추상적인 기능이 존재함을 명시적으로 표시해주어야 한다. abstract class, 이것이 추상 클래스다.
위의 로그인처럼 상태도 없고 모든 기능들도 추상적이다. 즉, 객체의 모든 것이 추상적이니 객체 자체가 추상적이라고 할 수 있다. 이처럼 관리하는 상태가 없고 추상기능들로만 이루어진 클래스를 인터페이스라고 정의할 수 있다.
interface Login {
void login();
}
class KakaoLogin implements Login {
@Override
void login() {
log.info("kakao login process");
}
}
객체 안의 모든 것이 추상적임을 나타내기 때문에 interface 키워드로 정의만 해주면 내부의 메서드들은 abstract를 명시해주지 않아도 되고, 이러한 추상체를 구상하는 구상체는 extends가 아닌 implements 키워드를 사용한다.

인터페이스의 정의를 살펴보면, 두 시스템 등이 서로 만나고(face) 상호작용하는(interact) 지점이다. 두 객체가 바라보고 소통 등의 상호작용을 할 수 있게 만들어주는 지점 같은 존재가 바로 인터페이스이다. 소통을 위해선 의사전달만 하면된다. 의사는 구체적일 수도 있겠지만, 약속된 언어가 있다면 구체적이지 않아도 의미가 일맥상통한다. 그러한 약속된 언어가 인터페이스의 메서드이다. 인터페이스의 메서드로 두 시스템, 혹은 객체가 의사전달을 하며 소통을 할 수 있다.
References
프로그래머스 백엔드 데브코스 - 프레임워크를 위한 Java
'객체지향 프로그래밍' 카테고리의 다른 글
UML - Class Diagram (0) | 2024.05.25 |
---|---|
객체지향의 특성 - 다형성 (0) | 2024.05.24 |
객체지향의 특성 - 상속 (0) | 2024.05.21 |
객체지향의 특성 - 캡슐화 (정보은닉) (0) | 2024.05.21 |
객체지향 프로그래밍(OOP) 이야기 (1) | 2024.05.20 |