객체 지향의 4대 특성
캡 - 캡슐화: 정보 은닉
상 - 상속: 재사용
추 - 추상화: 모델링
다 - 다형성: 사용 편의
클래스와 객체
클래스는 분류에 대한 개념이지 실체가 아니다. 객체는 실체다.
추상화: 모델링
객체: 세상에 존재하는 유일무이한 사물
클래스: 분류, 집합, 같은 속성과 기능을 가진 객체를 총칭하는 개념
객체는 유일무이한(unique)한 사물이다.
클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이다.
속성: 명사로 표현되는 특성, 값을 가질 수 있음.
메서드: 기능/행위
추상화란 구체적인 것을 분해해서 관심 영역(Application Boundary)에 있는 특성만 가지고 재조합 하는 것
자바는 객체 지향의 추상화를 어떻게 지원하고 있을까? 바로 class 키워드를 통해 지원하고 있음.
추상화와 T 메모리
논리적 설계: 개발 환경에 영향을 받지 않는 설계
물리적 설계: 개발 환경에 맞춰진 설계
스태틱은 "고정된"이라는 뜻을 가지고 있음. 스태틱 영역에 올라간 정보는 main() 메서드가 시작되기 전에
올라가서 main() 메서드가 종료된 후에 내려올 정도로 스태틱 영역에 단단히 고정됨.
static 키워드가 붙은 속성을 클래스 멤버 속성이라고 한다.
static이 안 붙은 속성은 객체 멤버 속성이라고 한다.
클래스 멤버들은 static 키워드와 함께 사용되고, T 메모리의 static 영역에 상주하게 되므로, static(정적) 멤버라고도 한다.
객체 멤버들은 인스턴스 멤버라고 함.
클래스 멤버 = static 멤버 = 정적 멤버
객체 멤버 = 인스턴스 멤버
정적 메서드는 객체들의 존재 여부에 관계없이 쓸 수 있는 메서드
클래스 멤버 = 정적 멤버 = 스태틱 멤버
객체 멤버 = 오브젝트 멤버 = 인스턴스 멤버
지역 변수는 별도로 초기화하지 않으면 쓰레기 값을 갖게 됨.
클래스 속성, 객체 속성은 별도의 초기화를 해주지 않아도 알아서 초기화
지역 변수는 별도로 초기화해야 하는데 멤버 변수는 왜 자동으로 초기화해줄까?
-> 객체 멤버인 경우에는 생성자를 통해, 정적 멤버는 정적 실행 영역을 통해 초기화하는 경우가 있지만,
공유 변수를 딱히 누가 초기화해야 한다고 규정할 수는 없음.
상속: 재사용 + 확장
객체 지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속(특성 상속)하고 거기에 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미다.
상위 클래스쪽으로 갈수록 추상화, 일반화 됐다고 말함. 하위 클래스 쪽으로 갈수록 구체화, 특수화 됐다고 함.
하위 클래스는 상위 클래스다라는 문장은 LSP(리스코프 치환 원칙)을 나타내는 말이다.
자바 언어에서 inheritance(상속)라는 키워드는 존재하지 않는 것, 대신 extends(확장)이 존재한다. 자바 언어 개발팀, 특히 자바 언어의 객체 지향의 상속을 정확히 이해 한 것 -> inheritance가 아닌 extends라는 것
상속의 강력함
객체 참조 변수의 이름은 편의를 위해 막 지었는데, 클래스 명은 분류스럽게, 객체 참조 변수명은 사물처럼 작명해야 한다.
하위 클래스 is a kind of 상위 클래스
펭귄 is a kind of 조류 -> 펭귄은 조류의 한 분류다.
객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.
객체 지향의 상속은 상위 클래스의 특성을 확장하는 것이다.
객체 지향의 상속은 is a kind of 관계를 만족해야 한다.
다중 상속과 자바
상속: 하위 클래스는 상위 클래스의 한 분류다.
인터페이스: 구현 클래스는 인터페이스할 수 있다.
상위 클래스는 물려줄 특성이 풍성할수록 좋고, 인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다.
정적 멤버에 접근할 때는 객체참조변수명.정적멤버 형식으로 접근하기보다는 클래스명.정적멤버 형식으로 접근하는 것이 좋다.
'📗 BOOK > 스프링 입문을 위한 자바 객체 지향의 원리와 이해' 카테고리의 다른 글
06 스프링이 사랑한 디자인 패턴 (0) | 2022.04.08 |
---|---|
05 객체 지향 설계 원칙 - SOLID (0) | 2022.04.08 |
04 자바가 확장한 객체 지향 (0) | 2022.03.25 |
02. 자바와 절차적/구조적 프로그래밍 (0) | 2022.03.18 |
01. 사람을 사랑한 기술 (0) | 2022.03.18 |