3장 자바와 객체 지향
카테고리: Oop-for-spring
스프링 입문을 위한 자바 객체 지향의 원리와 이해 3장의 내용을 정리한 글입니다.
클래스와 객체의 관계
보통 클래스와 객체의 관계를 붕어빵틀과 붕어빵의 관계로 비유하고는 합니다. 하지만 이런 비유는 완전히 잘못된 비유입니다. 아래의 코드를 보면서 잠시 생각해봅시다.
클래스 객체명 = new 클래스(); // 이해 가능
붕어빵틀 붕어빵 = new 붕어빵틀(); // 이해 가능???
위의 예시를 코드를 보면 붕어빵틀과 붕어빵틀의 관계
는 클래스와 객체의 관계
가 아니라 팩토리와 객체의 관계
입니다.
클래스는 분류에 대한 개념이고, 객체는 개념이 실체화된 것입니다.
개념 | 실체 |
---|---|
펭귄 | 뽀로로, 황제펭귄, 아델리펭귄 |
사람 | 김연아, 박지성, 강호동 |
펭귄과 사람은 분류를 위한 개념이고, 뽀로로와 김연아는 개념에 의해 분류된 실체입니다.
클래스는 같은 특성
을 지닌 여러 객체를 총칭하는 집합의 개념이고, 객체는 유일무이
한 사물을 뜻합니다.
클래스를 이용하여 object(객체)를 만들었다는 것을 강조할 때는 object라는 표현보다는 클래스의 instance(인스턴스)라는 표현을 사용합니다.
추상화
추상의 사전적 의미는 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용입니다.
객체 지향의 추상화와 사전적 의미로서의 추상화는 같은 의미입니다.
추상화란 구체적인 것을 분해해서 관찰자가 관심 있는 특성
만 가지고 재조합하는 것이라고 정리할 수 있겠습니다.
추상화는 모델링이다.
객체지향에서 추상화란 구체적인 것을 분해해서 관심 영역(Application Boundary)에 있는 특성
만 가지고 재조립 하는 것을 의미합니다.
모델링은 실제 사물을 정확히 복제하는 게 아니라 목적에 맞게 관심 있는 특성
만을 추출해서 표현하는 것입니다. 이런 모델링(추상화)는 객체 지향에서 클래스를 설계할 때 필요한 기법이고 또한 데이터베이스의 테이블을 설계할 때 필요한 기법입니다.
관심있는 특성만 이라는 단어가 핵심입니다.
상속: 재사용 + 확장
객체 지향에서의 상속은 슈퍼 클래스의 특성
을 서브 클래스에서 상속(특성 상속)하고 거기에 더해 필요한 특성을 추가, 즉 확장
해서 사용한다는 의미입니다. 클래스를 상속한다는 말은 슈퍼 클래스의 특성
을 서브 클래스에서 재사용
한다는 의미이기도 합니다.
- 객체 지향의 상속은 슈퍼 클래스의 특성을 재사용하는 것이다.
- 객체 지향의 상속은 슈퍼 클래스의 특성을 확장하는 것이다.
슈퍼 클래스 쪽으로 갈수록 추상화, 일반화 됐다고 말하며, 하위 클래스 쪽으로 갈수록 구체화, 특수화 됐다고 말합니다.
(중요) 서브 클래스의 인스턴스를 생성할 때 서브 클래스의 인스턴스뿐만 아니라, 서브 클래스가 확장한 슈퍼 클래스의 인스턴스도 함께 생성됩니다. 저장은 heap 영역에 함게 저장됩니다. (페이지 126p)
다형성
객체가 메세지
를 받았을 때, 실제로 어떠한 메서드
를 실행할지는 메세지를 받은 객체의 클래스가 무엇이냐에 따라 달라지는 것을 다형성이라고 합니다. 또 다른 말로 동일한 메세지를 수신했을 때 객체의 타입에 따라 다르게 응답할 수 있는 능력을 의미합니다.
객체 지향에서 다형성이라고 하면 오버라이딩과 오버로딩이라고 할 수 있습니다.
다형성은 개발자가 프로그램을 작성할 때, 사용편의성을 줄 수 있습니다.
오버로딩이 다형성인지 아닌지에 대해서는 이견이 있습니다.
오버로딩
같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
오버라이딩
같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의
캡슐화
개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것을 캡슐화
라고 합니다. 캡슐화의 목적은 변경하기 쉬운 객체를 만드는 것으로 정보 은닉을 통해 구현이 가능합니다.
자바에서 정보 은닉이라고 하면 접근제어자(private, [default], protected, public)이 있습니다. 객체 외부에서 알 필요가 없는 정보에 대해 접근 수준을 제어
하여 응집도를 높이고, 낮은 결합도로 유연함과 유지보수성을 높일 수 있습니다.
class ClassA {
private int pri; // 본인만 접근 가능
int def; // 같은 패키지 내의 클래스에서 접근 가능
protected int pro;// 상속/같은 패키지 내의 클래스에서 접근 가능
public int pub; // 모두가 접근 가능
}
서로 다른 jar 파일에 같은 패키지 명 있다면 한쪽의 패키지에 있는 클래스나 객체가 다른 패키지에 있는 클래스의 default 맴버나 protected 맴버에 접근이 가능합니다.
정보 은닉
클래스의 내부 데이터와 메서드를 외부에서 직접 접근하지 못하도록 함으로써, 내부 구현의 변경이 외부 코드에 영향을 미치지 않도록 합니다. 이는 클래스의 사용자에게는 필요한 기능만 제공하고 내부 동작은 숨기는 효과를 가져옵니다. 이로써 시스템의 복잡성을 낮추고 안정성을 높일 수 있습니다.
자바의 Call By Value : 자바의 참조 변수의 복사
자바는 기본 자료형 변수는 값을 값 자체로 판단한다.
참조 자료형 변수는 값을 주소, 즉 포인터로 판단한다.
기본 자료형 변수를 복사할 때, 차조 자료형 변수를 복할 때 일어나느 일은 같다. 즉, 가지고 있는 값을 그대로 복사해서 넘겨 준다.
댓글 남기기