💡 해당 글은 『자바의 신 3판』을 복습하며 도서의 내용과 본인의 주관적인 생각을 정리한 글입니다.
☁️ 내용정리
객체지향
자바는 객체지향
언어(Object Oriented Language)이다.
객체지향이 뭘까?
객체지향은 자바가 지향하는 프로그래밍 방법론으로 객체 간의 협력을 통해 프로그램이 동작하는 것이 특징이다.
객체란 뭘까?
객체는 상태
(state)와 행위
(behavior)를 가진다.
상태는 객체가 스스로 관리하는 변수를 의미한다.
행위는 상태를 변경하거나, 다른 객체의 질문에 메시지를 던지는 것을 의미한다.
정리하면
자바는 객체지향 언어이며 객체는 상태와 행위를 가진다. 행위를 통해 상태를 관리하거나 다른 객체와 협력한다.
클래스와 객체
클래스와 객체는 구분되어 사용된다.
클래스는 객체를 생성하기 위한 설계도라고 생각하면 편한다. 클래스의 생성자를 new
키워드를 통해 호출하여 객체(이하 인스턴스)를 생성할 수 있다. 인스턴스는 JVM
의 런타임 데이터 영역 중 힙 영역에 저장된다.
클래스를 통해 생성된 인스턴스는 static을 제외한 각자의 고유한 상태와 행위를 가진다.
각 인스턴스의 상태에 따라 행위의 결과가 달라질 수도 있다. 상태에 따라 결과가 달라지지 않는 유틸성 기능은 보통 static으로 선언하는 것이 메모리 측면에서 효율적이다.
☁️ 내 생각
객체지향의 특성
추상화
, 상속
, 다형성
, 캡슐화
이렇게 4가지가 객체지향의 특성이다.
추상화
란 각 객체의 공통적인 부분을 추출하여 클래스 혹은 인터페이스로 구현할 수 있는 개념이다.상속
이란 추상화된 클래스 혹은 인터페이스를 상속받아 구현할 수 있는 개념이다.- 상속은 클래스를 확장하는 extends, 인터페이스를 구현하는 implements로 이루어진다.
다형성
이란 상속을 통해 하나의 객체가 여러 타입으로 다양한 형태를 띌 수 있다는 개념이다.- 컴파일 타임 다형성으로 오버로딩이 존재한다.
- 런 타임 다형성으로 오버라이딩이 존재한다.
캡슐화
(정보은닉)란 외부로부터 자신의 상태로의 접근을 최대한 막고, 행위를 통해 대화 함으로써 유지보수의 이점을 챙길 수 있는 개념을 의미한다.
객체지향적으로 설계하면 어떤 이점이 있을까?
내가 객체지향적으로 코드를 설계했을 때, 가장 놀랐던 점은 변경에 아주 유연하다는 것이다.
인터페이스 타입으로 선언하여 기존의 객체를 다른 객체로 바꿔치거나, 객체 내부의 동작과정을 수정해도 사이드이펙트가 거의 발생하지 않았다.
이유는 의존성을 최대한 낮추어 결합도를 낮추는 것에 있다고 생각한다.
추상화와 상속을 통해 다형성을 구축하고, 캡슐화를 통해 내부의 데이터를 외부로부터 보호한다. 라는 규칙을 잘 지키면서 코드를 설계하고 작성하면 결합도는 자연스럽게 낮아질 것이라고 생각한다.
반대로 객체와 객체간 강한 의존성을 가지고 있는 코드를 작성하거나, 객체 내부의 상태를 외부에서 가져다 쓰는 코드를 작성한다면, 코드를 수정할 일이 생겼을 때 엄청난 사이드 이펙트가 발생할 것이다.
Static은 객체지향적 인가?
객체지향 프로그래밍의 객체에 대한 설명은 보통 객체는 상태를 가지며 스스로 관리한다. 또한 행위를 통해 다른 객체와 협력한다고 표현된다.
staic 클래스(모든 메서드와 변수가 static인 클래스)는 애초에 상태를 가질 수 없다. static 클래스의 변수는 stack, heap이 아닌 static영역에 저장되기 때문이다.
static 클래스는 정적 내부 클래스를 생성하려고 하는 등의 특별한 상황이 아니면 생성되지 않는다.
static 클래스의 생성자를 호출하여 인스턴스로 생성했다고 하더라도 static 변수, 메서드에 접근할 수 없다.
객체는 인스턴스라고 생각한다. 따라서 객체라고 부를 수 없다는 게 내 생각이다.
☁️ 질문
- 클래스와 객체의 차이는 무엇인가요?
더보기클래스는 객체를 생성하기 위해 필요한 설계도이다. 클래스의 코드를 바탕으로 인스턴스가 생성되어 메모리에 할당된다.
'JAVA > 자바의 신' 카테고리의 다른 글
6장. 내가 조건을 좀 따져요 (0) | 2024.01.04 |
---|---|
5장. 계산을 하고 싶어요 (1) | 2024.01.04 |
4장. 정보를 어디에 넣고 싶은데 (1) | 2024.01.04 |
2장. Hello God Of Java (1) | 2024.01.03 |
1장. 프로그래밍이란 무엇인가? (2) | 2024.01.03 |