자바를 배우기 시작했을 때부터 자바로 프로그래밍을 하고 있는 지금까지 가장 많이 들어본 질문 3가지를 뽑아보라면, 단언컨데 OOP에 대해서 설명해보라는 질문이 가장 대표적이라고 생각한다.
그리고 OOP에 대한 정의는 책마다 조금씩 다르고 사람마다 다르게 설명을 하고있다. 그러니 단 하나의 정답은 없지만 자기만의 정리된 생각을 가지고 있을 필요는 있다는 것..!!
그래서 마음을 먹고 이 포스팅을 작성하기로 했다. 시작!
객체지향 프로그래밍(OOP)이란?
컴퓨터 프로그래밍 패러다임 중 하나로, 상태와 행위를 가진 객체를 만들어 그 객체간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 단순히 컴퓨터 프로그램을 명령어의 모음으로 바라보는 시각에서 벗어나 여러 객체의 모임으로 파악하는 것이다.
객체지향 프로그래밍을 비유할 때 나는 컴퓨터 조립, 혹은 자동차 조립 과정을 생각한다. 쓰임에 따라 부품을 나누고 각기 다른 공장에서 만들어져서 최후에 조립됨으로써 하나의 완성체를 만들어내는 것. 프로그램도 동일하게 만들어지는 것이다.
객체지향 프로그래밍의 장점
- 코드 재사용이 용이하다.
모든 코드를 직접 짜지 않아도 남이 만든 클래스를 가져와 이용할 수 있고, 기존 클래스에 상속을 통해 기능을 확장하여 사용할 수도 있다.
- 유지보수가 쉽다.
만약 모든 프로그램이 하나의 파일로 만들어졌다면 일부 기능만 수정해야 할 때 그 기능이 구현되어있는 코드를 찾는 데만 한참 시간이 걸릴 것이다. 객체지향 프로그래밍에서는 수정해야할 클래스를 찾아 해당 부분만 수정하면 되기 때문에 유지보수가 쉽다.
- 대형 프로젝트에 적합하다.
클래스 단위로 모듈화시켜서 개발할 수 있기 때문에 여러 명, 여러 회사에서 업무를 분담하여 개발할 수 있다.
객체지향 프로그래밍의 단점
- 처리 속도가 상대적으로 느리다.
- 객체가 많으면 용량이 커질 수 있다.
- 설계시 많은 시간과 노력이 필요하다.
객체지향 프로그래밍의 특징
추상화 / 캡슐화 / 상속 / 다형성
추상화
추상화는 추상클래스나 추상클래스가 갖는 추상메서드를 의미하기보다는 클래스를 설계하는 것 자체를 의미한다.
공통적인 속성, 기능을 묶어 이름을 붙이는 것 이라고 말할 수 있다.
예를 들어 포메라니안, 말티즈, 비숑 프리제 라는 객체를 만들어낼 때 우리는 공통적으로 들어가야 할 속성과 기능을 추가하여 dog 이라는 클래스를 만들 수 있다.
캡슐화
캡슐화는 기능과 속성을 "클래스"라는 "캡슐"에 분류해서 넣는 것이라고 설명할 수 있다.
캡슐화의 목적에는 2가지가 있는데
1. 코드를 재수정 없이 재활용하는 것
관련 기능과 특성을 한 곳에 모아 분류하기 때문에 재활용이 원활해 진다는 것
2. 접근 제어자를 통한 정보 은닉
접근제어자를 통해 권한이 있는 객체에서만 접근할 수 있도록 하여 객체 내부의 중요한 정보가 외부에 오픈되지 않는다.
상속
부모클래스의 속성과 기능을 이어받아 사용할 수 있게 하고 일부분 변경이 필요할 경우 재정의하여 사용할 수 있다.
다형성
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것.
- 오버로딩 : 같은 이름의 함수이지만 매개변수를 다르게 하여 다른 메서드로 인식하는 것.
- 오버라이딩 : 부모 클래스의 메서드를 가져와 동일 이름으로 재정의 하여 사용하는 것.
객체지향 설계의 5가지 원칙
SOLID
SRP(Single Responsibility Principle) : 단일 책임의 원칙
어떤 클래스를 변경하는 이유는 오직 하나뿐이어야 한다. 클래스가 생성된 목적에 맞춰서 책임을 하나만 부여하는 것을 의미한다.
객체지향 4대 특성 중 추상화와 가장 관계가 깊은 설계원칙이다.
OCP(Open Closed Principle) : 개방 폐쇄 원칙
소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려있어야 하지만 변경에 대해서는 닫혀있어야 한다.
예를들어 데이터베이스가 MySQL에서 오라클로 바뀌더라도 JDBC의 connection 설정부분만 변경하고 자바 어플리케이션의 코드를 변경할 필요는 없다. 즉, 하나의 변화가 다른 곳에서도 연쇄적으로 변화를 일으키는 것을 방지하기 위해 만들어진 원칙이다.
LSP(Listov Substitution Principle) : 리스코프 치환 원칙
부모객체와 이를 상속한 자식 객체가 있을 때 부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체할 수 있다는 원칙이다.
ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
객체는 자신이 호출하지 않는 메소드에 의존하지 않아야한다는 원칙이다. 인터페이스는 다중상속을 지원하면서 객체로 하여금 강제로 기능을 부여시키는 것이다. 만약 A라는 메소드를 지닌 인터페이스 A와 B라는 메소드를 지닌 인터페이스 B가 있을 때, A의 기능만 구현하여 클래스를 만든다하면 A인터페이스만 상속하고 B인터페이스는 상속해선 안된다.
DIP(Dependency Inversion Principle) : 의존 역전 원칙
추상화된 것은 변하기 쉬운 구체적인 것에 의존해선 안된다는 원칙이다. 예를들어 자동차라는 클래스는 기본 타이어가 아닌 스노우타이어 와 같이 구체적인 것에 의존해선 안된다. 타이어는 자주 교체되기 때문에 이로 인해 자동차라는 클래스가 영향을 받게된다. 따라서 상위 클래스일수록, 인터페이스일수록, 추상클래스일수록 변하지 않을 가능성이 높기에 하위 클래스나 구체 클래스가 아닌 상위클래스, 인터페이스, 추상클래스를 통해 의존하라는 것이다.
참조
https://jeong-pro.tistory.com/95
객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)
객체 지향 프로그래밍(Object Oriented Programming) 여러 소프트웨어 관련 IT기업 신입사원 기술면접에서 면접자들 긴장을 풀어줄 겸 워밍업으로 자주 나오는 질문이다. "객체 지향 프로그래밍에 대해
jeong-pro.tistory.com
'CS' 카테고리의 다른 글
동기와 비동기, 블록킹과 논블록킹 (0) | 2024.02.13 |
---|