티스토리 뷰

Class, Object , Property, method 이러한 단어들 대체 뭔 차이인지 명확히 구분하지 못한다면 프로그래밍이 힘들어질 수 있습니다. 하지만 이것을 안다면 객체지향의 한걸음을 나아간다고 자부합니다.

 

Class vs Object 무슨 차이일까요?

 

예전에 틀과 틀에서 만든 무언가라고 설명하는 책과 교수님들이 많았습니다. 이 말도 어찌보면 틀린 말은 아니오나, 설명의 첨가가 약간 부족하죠.

 

틀이 아니라면 대체 뭘까요?

 

간단히, 설명드리자면 Class는 본질, 개념이며, Object는 본질에서 나온 세상의 무언가를 말합니다. 예를 하나 들자면, 클래스가 인간이라면 객체는 인간인데 세상에서 알고있는 인간. 이름, 체중 등(프로퍼티)을 갖고있고, 활발히 세상을 나아가는 존재인 즉 우리들을 말합니다.

 

본질은 세상이 알지만 추상적이고 객체는 세상도 알고 구체적이다라는 뜻입니다. 

 

 

***

 

객체 지향의 4대 특성은 캡슐화, 추상화, 상속, 다형성입니다. 하나하나 책의 기운을 따서 적겠습니다.

 

1) 추상화

 

추상화 = 모델링.

 

모델링? 즉 본질을 만들되 완벽한 본질을 만드는 과정은 아니다. 이 뜻은 무엇일까요?

 

전산/IT에서 말하는 추상화는 구체적인 것을 분해해서 관심영역에 있는 특성만 가지고 조합한다!!!?

 

예를 들면 병원 앱을 만드는데 여기서 사람이란 존재는 환자이며 그에따른 속성과 메서드또한 환자라는 모델에 맞춰지고, 은행 앱을 만든다면 여기서 사람이란 존재는 고객이 되며 속성과 메서드 역시 달라지는 얘기입니다. 즉 인간이란 완전한 속성과 메서드를 만드는데 할 수도 없지만 그럴필요도 없습니다.

 

그렇다면 객체를 만들면 메모리 관리는 어떻게 될까요?

 

이제 힙 메모리가 두둥등장!!

 

물론 함수에서 객체를 로컬변수로 선언할 때는 그 함수 내에선 스택에 들어갑니다만 일반 변수와는 다르게 주소값을 가집니다. 이 주소값은 해당 객체의 메모리로 찾아가는데 이것이 힙 메모리로 들어가는 출입구입니다.

 

간단히 설명드리자면 주소값은 객체가 생성될 때 같이 생기며, 그 주소값은 힙 메모리에 있는 해당 객체의 내용(변수나 함수)들이 들어갑니다. 물론 포인터 개념을 이해하셨다면 금방 아실 수 있는 문제입니다.

 

포인터를 간단히 설명드리자면, 주소와 메모리.

 

일반적으로 4byte Int형 정수의 포인터를 설명하자면, 주소값이 0x0000일때, 4바이트의 메모리공간은 0x0003까지 차지하게 됩니다. 이것을 객체에 적용시킨다면, 객체 마다 변수들의 데이터가 있을 때 그 변수의 데이터 값들을 합친 것(주소 + 변수의 메모리)이 힙메모리에 저장이됩니다.

 

 

2) 상속 : 재사용과 확장.

 

흔히 상속을 부모 자식관계라고 칭합니다. 하지만 정확한 말은 아니죠.

상속은 상위클래스에 정의된 공통된 무언가를 하위 클래스에 전달하며 코드를 줄이고 재사용성과 확장성을 늘리는 역할을 합니다. 예를 들어 상속을 부모/자식 관계라고 하면 동물의 자식은 포유류다? 말이 조금 이상하게 꼬입니다. 하지만, 동물의 하위 개념에 포유류가 있다라고 말을 하게되면 OK죠!

 

상위클래스의 불변의 진리를 파악해 메서드를 정의한다면 밑에 있는 하위클래스들은 따로 재정의 할 필요없습니다!(재사용성) 

 

상위 클래스 name = new 하위클래스( );

하위 클래스 name = new 하위클래스( );

 

이런 식으로 반응의 정도를 달리 표현할 수 있다. 상속의 개념을 모르시면 이해가 안되실수도....

 

상속은 is A 관계보다는, is a kind of가 표현이 자연스럽다고 합니다.

펭귄 is a 동물 -> 펭귄은 동물이다. /펭귄 is a kind of 동물 -> 펭귄은 동물의 한 분류.  

비슷한 말이지만, 오른쪽이 더 명확합니다.

 

그래서 is a kind of는 다중상속을 하지 않는 자바에 인터페이스 개념으로 연결됩니다.

 

무엇을 할 수 있는(Serializable, Cloneable, Comparable, Runnable) 표현의 인터페이스 형식이 많은데 이러한 인터페이스는 클래스를 상속하는 것이 아니라 기능을 구현하도록 유도하는 것이라고 생각합니다. 그래서 그 기능을 구현받은 클래스는 구현을 통해 맞춤형 재정의를 하여 쓸 수 있도록.

 

그렇다면 힙 메모리는 어떻게 될까요?

 

단 몇 줄로 설명드리겠습니다.

 

상위 클래스 name = new 하위 클래스( );

하위 클래스 name = new 하위 클래스( );

 

가 있을 때

 

상위 클래스에 하위 클래스가 담기는 경우, 하위 클래스의 변수나 재정의 되거나 새로 생긴 메서드는 못씁니다. 이유는 간단합니다. 주소가 상위클래스를 가리키기 때문이며 하위클래스의 이동은 형변환을 통해서만 가능하죠. 그렇다는 것은 힙 메모리에 상위클래스에만 접근 가능하지만 하위 클래스 또한 메모리가 생성된다는 것이 매우 중요합니다.

 

그러면 하위 클래스에 동격 하위 클래스가 담긴경우는 어떻게 될까요? 동격 클래스 객체가 생기면 모든 부분이 접근 가능합니다. 물론 상위클래스 또한 접근이 가능하죠.(물론 public , protected ) 이 말은 즉슨 힙 메모리에 역시 상위클래스와 하위 클래스 더 지식을 얹자면 최상위 클래스 object까지 생성됩니다.

 

 

다형성)

 

오버로딩, 오버라이딩, 제네릭 => 편의성 증대

 

 

캡슐화)

정보은닉, 사실 이게 제일 어려운 내용이라고 생각합니다.

코딩 할 때, 어떤 변수를 어떤 접근제어자로 정할지 고민을 해야하죠. 정답은 존재하지 않고 오로지 선택만으로 취해야 하는 부분입니다.

 

https://github.com/expert0226/oopinspring/tree/master/workspace_springjava/Chap03/src/encapsulation01

 

GitHub - expert0226/oopinspring: 스프링 입문을 위한 (자바) 객체 지향의 원리와 이해

스프링 입문을 위한 (자바) 객체 지향의 원리와 이해. Contribute to expert0226/oopinspring development by creating an account on GitHub.

github.com

 

이 코드를 통해 상속, Static, 접근제어자에 대한 고찰이 가능합니다. 직접 코드를 보시고 판단하시는 것도 좋다고 생각합니다.

 

간단히 설명드리겠습니다.

 

상위 클래스에서 staitc 메서드에서는 static 변수만 접근이 가능하며 만약 static 멤버 함수에 일반 변수를 선언하고 싶다면, 객체를 선언해서 넣어줘야 합니다. 이때 무슨 접근제어자든(private, protected, public, default) 상관없습니다.

 

이 상위클래스를 상속받은 하위 클래스에선 위에 내용과 같으나 private가 붙여진 변수는 접근이 불가합니다.

 

패키지가 다른 곳에서 상위클래스를 상속 받은 하위 클래스는 어떻게 될까요?

두둥! default(아무것도 안쓴...), private 키워드가 있는 경우 일반 변수든 static 변수든 접근이 불가능합니다.

 

 

 

이렇게 간단히 객체지향 4대 특성인 추상화, 상속(재사용성),다형성, 캡슐화를 알아보았습니다!!

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함