💡 해당 글은 『스프링 입문을 위한 자바 객체지향의 원리와 이해』 도서를 학습하며 도서의 내용을 참고하여 본인의 언어로 표현한 글입니다.
객체지향에 대해서는 여러번 반복적으로 학습하고 이해하고 있지만, 중요한 개념이기 때문에 간단하게 복습겸 정리하고 넘어가고자 한다.
☁️ 객체 지향은 인간 지향이다.
객체 지향이란 무엇인가? 현실 세계에서의 사물을 프로그램으로 나타낸 것이라고들 많이 표현한다. 이전의 어셈블리어, 기계어와는 다르게 인간에게 초점이 맞추어진 프로그래밍 방법론이다.
객체의 특성은 아래와 같다.
- 각각의 객체는 고유하다.
- 객체는 상태(프로퍼티, 필드, …)와 행위(메서드)를 가진다.
사람은 클래스인가 객체인가? 김연아는? 뽀로로는? 펭귄은?
사람은 실체가 아닌 개념이다. 사람 자체가 고유하지 않기 때문에 클래스이다.
김연아는 고유하다 자신만의 고유한 상태를 가진다. 때문에 객체이다.
뽀로로, 펭귄도 각각 객체, 클래스이다.
☁️ 객체지향의 4대 특성 (캡! 상추다)
객제지향을 대표하는 4가지 특성이다. 이러한 특성 덕분에 변경에 유연하고, 확장에 용이한 개발이 가능하다.
캡슐화
(Encapsulation): 정보 은닉(information hiding)상속
(inheritance): 재사용, 확장(extends)추상화
(Abstraction): 모델링다형성
(Polymophism): 사용 편의
☁️ 추상화: 모델링
해당 도서에서 추상화를 “객체 지향의 추상화는 곧 모델링이다.” 라고 표현한다.
추상화한 구체적인 것을 분해해서 관찰자가 관심있는 특성만 가지고 재조합 하는 것이라고 정리할 수 있다.
- 자바 객체 지향의 원리와 이해 84p.
객체는 세상에 존재하는 유일무이한 사물이다. 클래스는 같은 속성과 기능을 가진 객체를 총칭하는 개념이다. 즉, 객체의 공통적인 특성에 따라 분류해보니 클래스가 나오게 되는 것이다.
객체(구체적인 것)를 분해하고 목적에 맞는 특성을 추출하여 클래스로 정의하는 것을 추상화라고 한다. 추상화는 클래스의 확장, 인터페이스의 구현(다형성)을 통해 코드에 접목시킬 수 있다.
☁️ 상속: 재사용 + 확장
해당 도서에서 상속은 재사용과 확장이라고 표현한다.
객체 지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속하고, 재사용하거나 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미이다.
- 자바 객체 지향의 원리와 이해 107p.
처음 상속에 대해 이해할 때, 단어의 의미 그대로 ‘물려받는 것’이라고 생각하던 때가 있었다. 상속에 대해 공부하면 할 수록 뭔가 긴가민가 해지는 느낌이 있었는데 재사용과 확장이라는 개념을 적용하면 상속의 개념이 뚜렷해진다.
상속의 분류도에서 상위 클래스로 갈수록 추상화(일반화)되어있고, 하위 클래스로 갈수록 구체화되어 있다.
“하위 클래스는 상위 클래스다”라는 문장은 로버트 C. 마틴이 주장하는 객체 지향 설계 5원칙 가운데 LSP(리스코프 치환 원칙)를 나타내는 말이다. (하위 클래스는 상위 클래스로 치환될 수 있다.)
상속은 is-a
라고 많이 표현된다. 펭귄 is a 동물. 펭귄은 하나의 동물이다.
말이 안되는 건 아니지만 다소 부자연스러운 느낌이 있다. 따라서 is a kind of 라고 표현하면 더 자연스럽다.
펭귄 is a kind of 동물, 김연아 is kind of 사람
정리하면
- 객체 지향의 상속은 상위 클래스의 특성을 하위 클래스애서 재사용하는 것이다.
- 객체 지향의 상속은 상위 클래스의 특성을 확장하는 것이다.
- 객체 지향의 상속은 is a kind of 관계를 만족해야 한다.
인터페이스는 어떻게 표현할 수 있을까? 도서에서는 is able to
라고 표현한다.
구현 클래스 is able to 인터페이스. 고래 is able to 헤엄치기.
따라서 인터페이스는 “무엇을 할 수 있는”이라는 표현 형태로 만드는 것이 좋다. (Comparable, Runnable … )
☁️ 다형성: 사용편의성
객체는 다양한 형태를 띈다라는 객체 지향의 특성이다.
객체 지향에서 다형성이라고 하면 오버라이딩과 오버로딩이라고 할 수 있다. 물론 상위 클래스와 하위 클래스 사이에서도 다형성을 이야기할 수 있고, 인터페이스와 그것의 구현 클래스 사이에서도 다형성을 이야기할 수 있지만 가장 기본은 오버라이딩과 오버로딩이라고 할 수 있다.
- 자바 객체 지향의 원리와 이해 128p.
상위 클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩한 메서드가 호출된다. 이는 추상화된 타입으로 선언되어도, 실체의 행위를 수행함으로써 다형성을 만족한다.
다형성의 가장 큰 장점은 클라이언트(요청자)가 추상화된 인터페이스나 클래스 서버(응답자)를 의존함으로써 클라이언트의 변경 없이 서버의 기능을 유연하게 변경할 수 있다는 점이다.
☁️ 캡슐화: 정보 은닉
객체혹은 클래스의 상태와 행위에 접근을 제한함으로써 각 객체간의 의존도를 낮출 수 있다.
이는 곧 클래스의 내부 변경에 따른 사이드이펙트가 적어짐을 의미하고 변경에 유연한 개발을 할 수 있게 한다.
☁️ 왜 멤버 변수만 자동으로 초기화해줄까?
지역 변수는 별도의 초기화를 강제하는데 왜 멤버 변수는 자동으로 초기화를 해주는 것일까?
지역 변수는 한 지역에서만 쓰는 변수인데 반해, 멤버 변수는 공유 변수의 성격을 가지고 있기 때문이라고 도서는 말한다.
지역변수는 지역에서만 사용하기 때문에 사용처가 명확하다. 따라서 사용하는 지역에서 초기화하는 것이 합당하다. 그렇다면 공유 변수는 누가 초기화 해야 할까? 인스턴스 변수는 생성자에서, 클래스 변수는 정적 실행 영역에서 초기화 해주는 경우도 있지만 딱히 공유 변수를 누가 초기화해야 한다고 규정할 수는 없다.
'JAVA > 자바 객체지향의 원리와 이해' 카테고리의 다른 글
06. 스프링이 사랑한 디자인 패턴 (0) | 2024.01.20 |
---|---|
05. 객체 지향 설계 5원칙 - SOLID (0) | 2024.01.18 |
04. 자바가 확장한 객체 지향 (0) | 2024.01.18 |
02. 자바의 절차적/구조적 프로그래밍 - JVM의 메모리 (0) | 2024.01.17 |
01. 사람을 사랑한 기술 - 기술의 발전 (0) | 2024.01.17 |