객체 지향 프로그래밍
(Object-Oriented Programming, OOP)
객체는 데이터와 그 데이터를 처리하는 메서드(Method)로 구성된 하나의 단위로,
현실 세계에서 존재하는 사물이나 개념을 컴퓨터 프로그램에서 표현하는 방법이다.
상속(Inheritance), 캡슐화(Encapsulation), 다형성(Polymorphism) 등의
개념을 활용하여 객체 간의 상호 작용을 효율적으로 구현하고,
코드의 재사용성과 유지보수성을 높일 수 있는 장점이 있다.
Java, C++, Python, Ruby, Swift 등의 언어에서 객체지향 프로그래밍을
지원하고 있으며, 대부분의 소프트웨어가 객체지향적으로 개발되고 있다.
자료 추상화
(Data Abstraction)
데이터를 단순히 저장하는 데 그치지 않고, 데이터를 추상화하여
필요한 부분만 표현하고 다른 부분은 감추는 것을 말한다.
객체의 내부 구현을 감춤으로써 객체를
사용하는 외부 코드와의 결합도를 낮추고, 객체의 재사용성과
유지보수성을 높이는 데에 큰 역할을 한다.
ex)
클래스
자동차
나타난 부분
구성요소 : 브레이크, 라이트, 바퀴, 속도 등
감춰진 부분
브레이크 : 페달을 밟았을 경우 속도가 20씩 줄어든다.
라이트 : 밝기가 8000 루멘 정도이다. 60W의 전력을 사용한다.
바퀴 : 수명은 6개월이다. 휠사이즈는 16인치이다.
속도 : 최고속도는 250km/h이다. 제로백은 7초이다.
(예시 이므로 실제 스펙과는 많이 다를 수 있다.)
즉, 데이터의 특정 부분에 대한 세부 정보를 숨기고
중요한 부분만 공개하여 데이터를 단순화하고 복잡성을 줄이는 것이다.
자료 추상화는 추상클래스(Abstract Class)와 인터페이스(Interface)를 사용하여 구현할 수 있다.
상속
(Inheritance)
객체지향 프로그래밍의 중요한 개념 중 하나로,
기존 클래스의 모든 특성을 그대로 물려받아
새로운 클래스를 생성하는 것이다.
상속을 통해서 기존 클래스의 코드를 재사용하고,
새로운 클래스에서 기존 클래스의 특성을 확장하거나
변경하여 새로운 클래스를 만들 수 있다.
ex)
부모 클래스
동물
특성
숨을 쉰다.
먹는다.
번식한다.
자식 클래스
포유류
특성
체내 수정을 한다.
수유를 한다.
혈액순환으로 체온을 조절한다.
자식 클래스인 포유류 클래스는 부모 클래스인 동물 클래스로부터 모든 포유류의 공통인
숨을 쉰다.
먹는다.
번식한다.
의 특성을 가지고 있다.
상속은 코드의 재사용성을 높이고 유지보수성을 향상할 수 있다.
다중 상속
(Multiple Inheritance)
하나의 클래스가 여러 개의 클래스로부터 상속을 받는 것이다.
하나의 클래스가 두 개 이상의 부모 클래스를 가지고 있는 것이다.
하지만 다중 상속은 여러 개의 부모 클래스로부터 상속을 받기 때문에
코드의 복잡도가 증가하고, 상속 관계가 복잡해질 수 또 있다.
두 개의 부모 클래스에서 같은 이름을 가진 메서드가 있다면 어느 메서드를 사용해야 할지 모호해진다.
이러한 문제 때문에 다중 상속을 지원하지 않는 언어도 있다.
Java에서는 다중상속을 지원하지 않는다.
Java에서는 인터페이스(Interface)를 통해서 다중 상속과 유사한 기능을 구현할 수 있다.
인터페이스는 추상 메서드의 집합으로 이루어진 클래스와 유사한 형태를 가지고 있으며,
클래스가 여러 개의 인터페이스로부터 상속을 받을 수 있다.
다형성 개념
(Polymorphism)
하나의 코드가 여러 가지 형태를 가지고 동작할 수 있도록 하는 개념이다.
즉, 다형성을 통해 같은 코드를 재활용하면서도 다양한 객체를 다룰 수 있다.
다형성은 크게 오버로딩(Overloading)과 오버라이딩(Overrideing)으로 구분된다.
오버로딩
오버로딩은 같은 이름의 메서드를 여러 개 정의하고, 매개변수의 타입과 개수를
다르게 하여 다양한 상황에서 메서드를 호출할 수 있도록 하는 것이다.
오버라이딩
부모 클래스의 메서드를 자식 클래스에서 재정의하여, 부모 클래스의 메서드를 대신하여 호출할 수 있다.
이를 통해 부모 클래스에서 정의된 메서드를 자식 클래스에서 새롭게 구현할 수 있다.
다형성을 통해 코드를 재활용하면서도, 유연하고 확장 가능한 프로그램을 작성할 수 있다.
동적 바인딩
(Dynamic Binding)
런타임 시점에서 어떤 메서드를 호출할지 결정하는 것이다.
동적 바인딩은 다형성과 밀접한 관련이 있다.
ex)
부모 클래스에 정의된 메서드를 자식 클래스에서 재정의 하였을 경우,
해당 메서드를 호출할 때, 실제로 실행될 메서드는 자식 클래스에서 정의된 메서드가 된다.
이때 메서드가 호출될 때 어떤 메서드가 실행될지는 런타임 시점에 결정된다.
동적 바인딩을 사용하면 객체의 타입에 상관없이
동일한 인터페이스를 가지는 객체들을 일관되게 다룰 수 있다.
이를 통해 코드의 재사용성이 증가하고, 유지 보수가 용이해진다.
소프트웨어 공학의 관점에서
강한 응집력(Strong Cohesion)과
약한 결합력(Weak Coupling)을 지향해야 한다.
하나의 문제를 해결 위한 데이터를 클래스에 모아 놓은
데이터형을 사용함으로써 응집력을 강화하고,
클래스 간에 독립적인 디자인을 함으로써 결합력을 약하게 한다.
장점
재사용성
상속을 통해 코드의 재사용을 할 수 있다.
(중복코드를 줄일 수 있다.)
생산성 향상
잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써
개발의 생산성을 향상할 수 있다.
자연적인 모델링
우리 일상생활의 모습과 코드의 구조가 비슷하여
생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.
유지보수의 우수성
프로그램 수정 시 추가, 수정을 하더라도 캡슐화를 통해
주변 영향이 적기 때문에 경제적이다.
단점
개발속도 느림
객체가 처리하려는 것에 대한 정확한 이해가 필요하기 때문에
설계단계부터 많은 시간이 소모된다.
실행속도가 느림
객체지향언어는 동적 메모리 할당, 가비지 컬렉션, 동적 바인딩,
상속과 다형성 등의 이유로 실행속도가 느릴 수도 있다.
내용 참고 - 위키백과 -
내용 참고 - 티스토리 -
내용 참고 - Chat GPT -
'자바 탐구' 카테고리의 다른 글
정규표현식) 메타문자 ^ . [] 써보기 (0) | 2023.04.11 |
---|---|
자바) JVM (0) | 2023.04.09 |
Intellij) 테마 바꾸기 (0) | 2023.04.03 |
인터페이스) Comparator (0) | 2023.03.21 |
인터페이스) Comparable (0) | 2023.03.18 |