OOP (Object-Oriented Programming)
애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍 하는 것을 말합니다.
- OOP는 객체의 관점에서 프로그래밍 하는 것을 의미한다.
- C언어는 절차 지향 프로그래밍인데, 절차 지향 프로그래밍은 프로세스가 함수 단위로 순서대로 진행되는 것을 말한다.
- OOP는 절차지향에 비해서 사람의 사고방식과 더 가깝다.
- OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다.
- 애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍 하는 것을 말한다.
OOP는 객체지향 원칙에 따라 관심사가 같은 데이터를 한곳에 모아 분리하고 낮은 결합도를 갖게하여 독립적이고 유연한 모듈로 캡슐화를 하는 것을 일컫습니다. 하지만 이러한 과정 중 중복된 코드들이 많아지고 가독성, 확장성, 유지보수성을 떨어 뜨립니다.
이러한 문제를 보완하기 위해 나온 것이 AOP입니다.
OOP 장점
- 작성한 코드에 대한 재사용성이 높다.
- 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수에 용이하다.
- 데이터 모델링을 할 때 객체와 매핑하는 것이 수월하기 때문에 요구사항을 보다 명확하게 파악하여 프로그래밍 할 수 있다.
OOP 단점
- 처리 속도가 느리고 설계하기 어렵다.
- 중복된 코드들이 많아지고 가독성, 확장성, 유지보수성을 떨어 뜨린다
OOP 특징
캡슐화 (Encapsulation)
하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미합니다.
따라서 클래스를 우리가 만들 떄 훗날 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록 사용해야할 변수와 그 변수를 가지고 특정한 액션 즉 메서드를 관련성 있게 클래스에 구성해야합니다.
정보은닉
그리고 캡슐화를 하는 중요한 목적은 바로 정보은닉이다. 유저 정보를 가지고 있는 User라는 객체에서 유저의 정보가 public으로 선언되어 있다면, 누구든 접근해서 유저 정보를 변경할 수 있다. 그렇기 때문에 private로 해서 데이터를 보호해서 접근을 제한해야합니다.
이렇게 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 중요한 목적입니다(setter도 아무생각 없이 만들면 안된다.)
🎇참고로
캡슐화와 정보은닉은 동일한 개념이 아니다.
캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다는 것이다.
예를 들어, 리모콘을 사용하는데 리모콘 내부 회로(private으로 정의된 속성)를 알 필요가 있느냐는 것이다.
사용자의 입장에서는 리모콘의 조작 기능, 즉 public으로 정의된 속성만 알면 된다는 것이다.
추상화 (Abstraction)
추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념 으로 (공통적인 요소나 특징을 파악해 정의해 놓은 설계 기법) 객체를 실제 세계에서 추출하여 해당 객체의 주요 특성과 기능을 분리하는 과정을 의미합니다. 이는 객체의 핵심적인 부분에 집중하여 해당 객체를 단순화하고 이해하기 쉽게 만듭니다.
개념설명
예를들어. 벤츠, 아우디, 티코 등등 우리가 생각하는 여러 종류의 자동차가 있다. 이것을 다 클래스화하고 변수와 메서드 등을 개별적으로 만드는 것은 무모한 짓일수 있습니다. (즉,확장성 때문에 추상화할 필요가 있다.)
따라서 방금 나열한 자동차들의 공통적인 요소나 특징을 추출하는 과정인 추상화를 거쳐 요소를 끄집어 내면 바퀴, 핸들, 차문, 유리창 등 필수적인 부품이 있습니다.
바퀴는 굴러가고, 핸들은 돌아가고 차문은 열려야한다 공통적인 행동 즉 어떤 차든 필수적으로 필요한 메서드가 추출됩니다.
이러한 과정이 추상화하는 과정입니다.
자바에서 추상화는 추상 클래스나 인터페이스를 통해 구현됩니다.
추상 클래스는 실제 클래스의 일부 메서드를 구현하지 않고 선언하는 클래스이며, 인터페이스는 메서드 시그니처만을 가진 추상 클래스입니다. 이렇게 추상 클래스나 인터페이스를 활용하면 해당 객체의 중요한 부분만을 추출하여 단순화된 형태로 사용할 수 있습니다.
다형성(Polymorphism)
다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다.
즉, 다형성은 형태가 같은데 다른 기능을 하는 것을 의미한다 (같은 동작이지만 다른 결과물이 나올때 다형이라고 생각하면 된다)
이를 통해 코드의 재사용, 코드 길이 감소가 되어 유지보수가 용이하도록 도와준다.
개념설명
예를 들면, 고양이 클래스에는 울음 이라는 속성이 정의되어 있고, 사자는 고양이 과이기 때문에 사자 클래스가 고양이 클래스를 상속 받는다고 할때, 사자 클래스에도 "울음"이라는 속성이 자동으로 추가되고 이것을 상속이라고 한다. 그러나 고양이와 사자의 울음소리는 다르기 때문에 같은 "울음" 속성임에도 실제 울음소리는 다르게 표현되어야 하고 이것을 다형성이라고 말할 수 있다.
OOP에서 다형성의 개념을 녹여내는 방법은 두가지인데, 바로 오버라이딩(Overriding)과 오버로딩(Overloading)이다.
- 오버라이딩(Overriding)
부모 클래스에서 상속받은 자식 클래스에서 부모클래스에서 만들어진 메서드를 자식 클래스에서 자신의 입맛대로 다시 재정의해서 사용하는 것을 말한다.- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다
- 로미오와 줄리엣의 역할 → 구현체로 장동건과 원빈, 그리고 김태희와 송혜교 등
- 자동차라는 역할 → 구현체로 K3, 아반떼, 테슬라 모델3 등이 있습니다.
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다
- 오버로딩(Overloading)
같은 이름의 메서드를 사용하지만 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념- 오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터 타입이 다르면 오버로딩이 적용
- 메서드 이름이 같아도 문법 에러 ❌
다형성을 사용하면 같은 이름의 속성을 유지 함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름의 낭비를 방지할수 있습니다. 예를 들면, 고양이와 사자의 울음 소리를 호출하기 위해 각 객체에서 roarCat(), roarLion()를 정의할 필요 없이 roar() 메서드를 호출하면 된다는것입니다. API가 많아질수록 복잡성은 증가하기 때문에 다형성은 매우 유용합니다.
상속성, 재사용(Inheritance)
상속이란 객체지향의 핵심 기능으로 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념입니다.
기존 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 줍니다.
참고
자바에선 상속은 단일 상속밖에 지원이 안되며, C++에선 다중상속이 지원된다. 이 때문에 말이 많아 원래 자바 쪽에서는 다중상속이 객체지향적인 관점에서 크게 유효하지 않다고 생각하지만, 다중 상속이 필요할 순 있다고 인정하여 대비책으로 인터페이스를 다중 상속(구현) 할 수 있게 해서 임시적인 다중 상속에 대한 활로는 뚫어 줬다.
그러나 인터페이스의 존재이유가 다중상속을 지원하기 위함이다 라고 생각하면 안된다.
개념정리
실제 세계에서 부모로부터 여러 가지를 상속을 받는데, OOP에서도 가능하다. OOP에서 이를 부모 클래스, 자식클래스라고 표현한다.
예를들어, 고양이 클래스와 강아지 클래스가 있다고 했을때, 고양이와 강아지는 모두 포유류에 해당한다.
포유류는 여러 속성들이 정의되어 있는데 고양이와 강아지는 포유류의 이런 속성들을 갖고 있다.
하지만 아주 많은 속성이 다르기 때문에 좀 더 디테일하게 고양이, 강아지로 종을 나눈것이다.
즉. 포유류라는 클래스는 고양이와 강아지 클래스에 속성들을 물려준다. 이것을 상속이라고 하고, 포유류와 고양이 포유류와 강아지 클래스는 상속 관계에 있다고 한다.
상속이 필요한 이유는 코드의 중복을 없애기 위함이다.
예를들면 포유류 클래스에 여러 속성들을 정의해 두고 포유류에 해당하는 강아지 클래스가 필요한 경우 포유류 클래스와 상속 관계를 맺는다. 상속 관례를 맺으면 자식 객체를 생성할때 부모 클래스의 속성들은 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.
AOP
AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍을 뜻합니다.
대부분의 시스템에서 비즈니스 로직은 아니지만 보안, 로그, 트랜잭션과 같이 반드시 처리가 필요한 부분을 횡단 관심사라고 합니다. 스프링에서는 이러한 관심사를 비즈니스 로직과 분리하여 중복된 코드를 줄이고 개발자가 비즈니스 로직에 집중하도록 만들어 줍니다.
- 관점지향 프로그래밍(AOP : Aspect-Oriented Programming) : 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
연관된 글:
[CS] 상속이란 (Inheritance, extends, implements)
참고:
chat gpt
OOP(Object-Oriented Programming, 객체 지향 프로그래밍) 이란?
[OOP] 객체지향 프로그래밍(Object Oriented Programming)이란? - 𝝅번째 알파카의 개발 낙서장
'개발 > CS' 카테고리의 다른 글
[CS] 프레임워크(Framework)와 라이브러리(Library)의 차이 (0) | 2023.05.11 |
---|---|
[CS] 상속이란 (Inheritance, extends, implements ) (0) | 2023.03.16 |
[CS] 좋은 객체 지향 설계의 5대 원칙: SOLID (0) | 2023.02.23 |