객체 지향 프로그래밍
프로그램 설계방법론의 일종으로, 명령형 프로그래밍에 속한다.
프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라,
프로그램을 수많은 객체(object)라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다.
객체란 '메소드, 변수'를 가지며, 특정 역할을 수행하도록 인간이 정의한, 추상적인 개념이다.
큰 문제를 작게 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤,
이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법이다.
장점
OOP를 사용하면 코드의 중복을 어느 정도 줄일 수 있고 입력 코드, 계산 코드와 결과 출력 코드 등
코드의 역할 분담을 좀 더 확실하게 할 수 있어서 가독성이 높아질 수 있다.
OOP의 네 가지 주요 개념
추상화 (Abstraction)
추상화는 복잡한 시스템을 단순화하여 이해하기 쉽게 만드는 과정이다.
자바에서는 추상 클래스나 인터페이스를 사용해 공통의 속성과 메서드를 정의한다.
이를 통해 객체들의 공통점을 추출하고, 세부 사항은 하위 클래스에서 구현한다.
다형성 (Polymorphism)
다형성은 동일한 메서드나 객체가 다양한 형태로 동작할 수 있게 하는 특성이다.
자바에서는 메서드 오버로딩(Overloading)과 오버라이딩(Overriding), 그리고 인터페이스를 통한 구현으로 다형성을 구현한다.
상속 (Inheritance)
상속은 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)가 물려받는 기능이다.
이를 통해 코드 재사용성과 계층 구조를 형성할 수 있다.
캡슐화 (Encapsulation)
캡슐화는 객체의 내부 상태를 외부에서 직접 접근하지 못하도록 제한하는 것이다.
이를 통해 객체의 상태를 보호하고 유지할 수 있다.
주로 접근 제어자(private, protected, public)를 사용하여 구현한다.
객체 생성과 메모리
자바에서 객체가 생성될 때 JVM(Java Virtual Machine)의 메모리 구조가 중요한 역할을 한다.
JVM은 다음과 같은 메모리 영역으로 구성된다.
메타스페이스 (Meta-space)
클래스 정보(타입, 필드, 메서드 등)가 저장되는 영역이다.
JVM이 클래스를 로드할 때 이 공간에 정보를 저장한다.
스택 (Stack)
각 메서드 호출 시 생성되는 메서드 프레임들이 쌓이는 영역이다.
각 프레임에는 메서드의 로컬 변수, 매개변수 등이 저장된다.
스택은 각 스레드별로 별도 관리된다.
힙 (Heap)
객체가 생성되어 저장되는 영역이다. 힙은 모든 스레드에 의해 공유된다.
객체는 new 키워드를 통해 생성되며, 가비지 컬렉터(Garbage Collector)에 의해
더 이상 필요 없는 객체는 자동으로 메모리에서 해제된다.