JAVA에서 가장 중요한 특징인 객체지향 프로그래밍에 대해 알아보자
JAVA 가 인기있는이유
현실세계랑 비슷하다.
객체로서 표현하고 객체는 특징과 행동을 가지고 있다.
객체란?
세상에 존재하는 식별가능한 모든 것!
물리적으론 컴퓨터, 자동차, 핸드폰, 계산기 등등
개념적으론 운동, 배달주문, 강의 등등
자동차로 객체에 대해 좀 더 자세히 보자
JAVA에서 객체는 속성(필드)과 행위(메서드)로 구성되어 있다.
- 자동차의 속성(필드) (변하지 않고 사용되는 것)
- 회사, 모델, 색상, 가격, 속도 등
- 자동차의 행위(메서드) (사용 시 무언가 변하여 동작하는 것)
- 가속, 브레이크, 기어, 변속, 조명, 경적 등
객체 간의 협력은 현실세계와 비슷하게 이루어진다.
이걸글로 표현하자면
'사람이 자동차에게 가속페달을 50만큼 밟는다. 자동차의 속도는 50이 된다.'
코드적으로 해석한다면
사람객체가 자동차객체에게 가속페달(메서드)을 50만큼(매개변수)를 입력
자동차객체는 리턴하여 속도를 50 출력
반환되는 값을 리턴값이라 한다.
객체 간의 관계
현실세계의 관계처럼 이루어진다.
독립관계
사람과 자동차처럼 각각 객체가 구분되어 있는 것
포함관계
자동차 안의 부품들이 포함되는 것 (타이어 문 핸들 같은 부품요소 같은 것)
상속관계(이 부분 중요)
언듯 보면 포함관계랑 비슷한 거 같다.
자동차와 기차는 각각의 다른 객체이다. 하지만 제조공장에서의 색상 페인트는 동일한 색상을 사용할 때 상속된 다한다.
음... 다시 말하자면 아들 둘이 있는데 부모가 가진 재산을 주어 아들 둘이 각각 재산을 물려받아 사용하는 느낌?
객체지향 프로그래밍의 특징
캡슐화
- 속성(필드)과 행위(메서드)를 하나로 묶어 객체로 만든 후 외부에서 볼 수 없게 감추는 것
- 필드라는 아이랑 행위라는 아이를 객체라는 방에 감금 후 외부에서 모르게 방의 창문을 가린다고 생각하자
- 외부객체에서는 캡슐화된 것을 보지 못하기 때문에 필드나 메서드를 통해 접근할 수 있다.
- 안에 있는 아이들(필드, 메서드)이 소리 질러서 외부객체(다른 방)에 알려줄 수 있다.
- 캡슐화된 객체의 필드와 메서드를 노출시킬지 결정하기 위해선 접근제어자를 사용해야 한다.
- 접근제어자는 감금한 사람으로 생각하자 접근제어자(감금한 사람이름) publie, private 등등
상속 (매우 중요)
- 상위 객체와 하위 객체가 있어야 하며 상위객체가 하위객체에게 상속을 준다.
- 부모 (상위) 객체와 자식(하위) 객체에게 상속(재산)
- 상위객체는 필드와 메서드를 하위객체에게 물려주어 하위객체가 사용할 수 있게 하는 것.
- 부모(상위) 객체가 가지고 있는 재산(필드와 메서드)을 자식(하위) 객체에게 물려주어 자식(하위) 객체가 사용할 수 있게 하는 것.
- 여기서 overriding이라는 개념이 나온다. 그냥 쓸 것이냐 다르게 쓸것이냐
- 상속이 필요한 이유
- 각각의 객체들의 구조를 파악하는데 쉽다.
- 부모 유전자를 따라가서 누구 아이 이은 지 확인하기 쉬운 것처럼
- 필드와 메서드를 변경하는 경우 부모 객체에 있는 것만 수정하면 자식객체는 전부 반영되어 일관성을 유지하기 쉽다.
- 부모 유전자가 변하면 당연히 아이 유전자도 변한다는 느낌
- 코드의 중복이 줄어들며 재사용성이 늘어난다.
- 부모한테서 받을 수 있는 것 받아 쓰면 되니 아이들은 조금만 채우면 된다? 물려받아 쓰니 재사용하는 느낌
- 각각의 객체들의 구조를 파악하는데 쉽다.
다형성
- 객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러 가지 형태로 재구성되는 것을 의미합니다.
- 원본을 복사해서 복제품을 만들었는데 뭔가 수정하고 싶어서 원본과 다른 것을 만들 때 사용하는 느낌
추상화
- 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것을 추상화라고 한다.
- 정말 세세하게 구체적인 부분 말고 공통되는 부분을 추려낸 것 (핸드폰 제조사, 핸드폰 무게, 등등 스펙종류 같은 느낌?)
객체와 클래스
- 객체(제품)를 생성하기 위해서는 설계도(클래스)가 필요하다.
- 휴대폰으로 만들려면 설계도(클래스)를 가지고 제품(객체) 휴대폰을 만들듯
- 클래스로 만든 객체를 인스턴스라고 부른다. 만드는 과정은 인스턴스화라고 부른다
- 인스턴스는 곧 객체이다.
- Class 클래스_이름 = 객체를 만들기 위한 설계도
여기까지 객체지향 프로그래밍에 대한 간략한 내용이었다.
내용정리하면서 중간부터는 나의 생각대로 정리해 보았는데 괜찮은 비유 같았다.
이런 글씨가 나의 생각을 적은 내용이다.
앞으로 나의 생각을 적으면서 공부하면 좀 더 머리에 남을 것 같다.
다음은 클래스의 설계에 대해 배워보자
나에게 한마디!
지금처럼만 조금씩 앞으로 나아가자 급하지 않고 확실하게!
'언어(language) > 자바(Java)' 카테고리의 다른 글
| [JAVA] 인스턴스 멤버와 클래스 멤버 (2) | 2023.10.19 |
|---|---|
| [JAVA] 메서드 오버로딩 println( ); , 기본형 참조형 매개변수 (0) | 2023.10.19 |
| [JAVA] 객체의 필드와 메서드 (0) | 2023.10.18 |
| [JAVA] 객체 생성 방법 (2) | 2023.10.18 |
| [JAVA] 클래스 설계 방법 (0) | 2023.10.18 |