자바와 객체 지향 1

JunSeong_Park·2022년 12월 24일
0
post-custom-banner

자바의 핵심은 객체 지향

두서는 필요 없다 바로 객체 지향의 4대 특성으로 가보자



1. 추상화 (Abstraction) : 모델링

객체 지향의 추상화는 곧 모델링이다
유일무이한 객체의 특성( 속성 +기능 )에 따라 분류해 보니 객체를 통칭할 수 있는 집합적 개념인 클래스( 분류 )가 나오는 것

Ex) 클래스 : 객체 = 사람 : 마이클 = 사람 : 존슨

사람 마이클 = new 사람();
사람 존슨 = new 사람();

객체를 흔히 object 라고 표현하지만 클래스를 이용해 만들었다는 것을 강조할 때는 instance 라는 표현을 쓴다 ( object 라는 단어의 의미를 보았을 때 instance 가 더 좋은 것 같다 )

이번에는 추상화의 일반적인 뜻을 봐보자

추상화란 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 
재조합하는 것

이제 내가 필요한 영역에 대입을 해보겠다

추상화란 구체적인 것을 분해해서 관심 영역(애플리케이션, Application Boundary)에 있는 특성만 가지고 
재조합하는것 = 모델링

T메모리를 통해 더 자세히 알아보자

위와 같은 쥐 클래스를 만든 후
드라이버 클래스를 통해 객체를 구현하는 과정을 살펴보자

main() 을 시작하기 전의 상태는 위와 같다( 클래스는 static 영역에 생성됨을 인지하자 )

5번째 줄을 실행했을 때의 상태이다

정리가 조금 필요할 것 같다
우선 Mouse 라는 타입을 지정해준 것은 Mouse 의 구조를 가진 객체(instance)만을 가리키는 참조 변수라는 의미라고 보면 되겠다 (참조 변수(reference variable)에 더 자세한 개념을 알고싶으면 C언어의 포인터,노드에 관해 찾아보자)

자바의 클래스 멤버 vs 객체 멤버

아래의 사진을 봐보자
Mouse 라는 클래스를 만들고 그에 따라 instance가 3개 Heap 영역에 생성된 것을 볼 수 있다 countOfTail 이란 변수는 꼬리의 개수를 의미하는데 이 지구상의 쥐 중에 꼬리가 1개가 아닌 쥐를 본 적은 없을 것이다. 그렇지만 꼬리가 1개라는 사실을 변수로서 할당 받고 있어야한다면 어떻게 하면 될까..

이러한 경우 등장하는 개념이 static 멤버(정적 변수, 클래스 멤버)이다

위와 같이 코드를 짜면
이러한 형태가 나오는데 핵심은 heap 메모리에 객체별로 할당되었던 변수가 클래스 멤버로 옮겨진 것을 볼 수 있다.
UML 을 작성할 때 정적 변수는 밑줄을 친다는 것도 알아두면 좋다


2. 상속 : 재사용 + 확장

사실 이 분야는 두말 할 것 없이 구글에 검색해보면 한 눈에 이해할 좋은 자료들이 많다
객체 지향에서 의미하는 상속성은 이것보다 더 설명을 잘 할 수 없다

하위 클래스 is a kind of 상위 클래스
Ex ) 사람은 마이클이다 X
	 마이클은 사람이다 O

명심할 것은 딱 3개이다

  • 객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것
  • 객체 지향의 상속은 상위 클래스의 특성을 확장하는 것
  • 하위 클래스 = 상위 클래스 라는 명제가 성립하는 것


    생각해보면 inheritance 라는 단어 자체에 조금 의문이 드는 것이 이것은 가족 간의 유산 상속을 할 때의 상속과 근접한 개념이라 하위 클래스 = 상위 클래스 라는 개념이 애초에 성립하지 않는다고 생각한다 ( 그래서 상속을 할 때 extends 를 사용하는 것일까 라는 생각이 든다 )

다중 상속

자바나 C# 은 다중 상속(extends)이 불가능하다
이는 다이아몬드 문제를 찾아보면 이해가 편할 것이다
대신 interface 를 통해 구현했다

interface : 구현 클래스 is able to interface
Ex) 고래는 헤엄칠 수 있다

쉽게 정리했는데
실제로 자바에 대표적인 interface 들을 보면
이러한 구조를 가진 것을 알 수 있다.


한눈에 볼 수 있는 관계도




구조에 따른 UML 표기법 정리

정적변수와 그 외 변수의 표기법

정적변수는 밑줄 추가


상속 표기법

상속(재사용, 확장)과 인터페이스(구현 강제)

출처 : 스프링 입문을 위한 자바

profile
안녕하세요 언어에 구애 받지 않는 개발자가 되고 싶은 박준성입니다
post-custom-banner

0개의 댓글