soowanlog

OOP 본문

백엔드/Java

OOP

개발자솬
백엔드/Java

OOP

개발자솬 2024. 3. 5. 18:20
728x90
반응형
  • OOP(Object-Oriented Programming)이란?

객체 지향 프로그래밍으로 컴퓨터 프로그램을 명령어의 목록으로 보는 (C언어와 같은 절차 지향 프로그래밍) 시각에서 벗어나 여러 개의 독립된 단위인 객체들의 상호작용으로 프로그램 로직을 구성하는 프로그래밍 패러다임입니다.

※ 프로그래밍 패러다임(Programmin Paradigm)


프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할지 결정하는 역할을 합니다.새로운 프로그래밍 패러다임을 통해서는 새로운 방식으로 생각하는 법을 배우게 되고, 이를 바탕으로 코드를 작성하게 됩니다.

 

Java의 경우 객체의 구성 부분 단위가 클래스입니다. 

 

  • OOP의 특징

1. 캡슐화(Encapsulation)

- 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메서드를 하나로 묶는 것을 의미합니다.

- 캡슐화의 중요한 목적은 정보은닉입니다. 중요한 정보를 public으로 선언한다면 누구든 접근하여 그 정보를 탈취/변조할 수 있기 때문에 private으로 선언하여 데이터를 보호해야 합니다. 이렇게 보호된 데이터는 getter나 setter 등의 메서드를 통해 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 중요한 목적입니다.

- 운전을 하는데 private으로 선언된 자동차 엔진의 작동방식이나 자동차 회사의 고유기술 등을 알 필요 없이 public으로 선언된 시동 거는 법, 엑셀의 위치 등만 알면 된다는 것입니다.

 

2. 추상화(Abstraction)

- 복잡한 시스템이나 개념을 단순화하고 중요한 부분에 초점을 맞추어 표현하는 과정입니다.

- 공통적인 요소나 필수적인 요소는 꼭 들어갔으면 하는 바램에서 만드는 것이 추상클래스입니다.

- 자동차를 만드는 과정에서 모든 자동차에 창문이 있어야 한다든가, 바퀴는 굴러가야 한다는 정보를 개별적으로 만들 필요는 없을 겁니다. 이렇든 필수적인 요소와 기능들은 따로 추출하여 클래스로 만든 것이 추상클래스입니다.

 

3. 다형성(Polymorphism)

- 형태는 같지만 다른 기능을 하는 것을 의미합니다.

- 다형성을 통해 코드의 재사용성이 높아지고 코드의 길이가 감소되어 유지보수가 용이하도록 도와줍니다.

- 탈 것 클래스에는 '이동'이라는 속성이 정의되어 있다고 하면, 유람선은 탈 것 클래스를 상속받고 있어 '이동'이라는 속성이 자동으로 담겨있습니다. 자동차도 마찬가지겠지만 유람선의 '이동'은 물 위에서 동작할 것이고 자동차의 '이동'은 땅 위에서 동작할 것입니다. 이렇듯 같은 '이동' 속성임에도 다른 기능을 하는 것이 다형성이라고 말할 수 있습니다.

 

4. 상속성(Inheritance)

- 상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념입니다.

- 기존 클래스의 기능을 가져와 재사용하면서도 새로운 기능을 추가할 수 도 있게 만들어 줍니다.

- Java의 클래스는 단일 상속밖에 지원을 안하지만 인터페이스는 다중상속을 지원합니다. 그렇다고 인터페이스의 존재이유가 다중상속을 지원하기 위함이다라고 생각해선 안됩니다.

- 상속을 통해 코드의 중복을 없앨 수 있고 이는 유지보수에 있어 많은 이점이 있습니다.

- 유람선과 자동차는 모두 탈 것 클래스를 상속받고 있습니다. 유람선과 자동차는 탈 것의 여러 속성들을 모두 갖고 있지만 각자는 여러 다른 속성들을 갖고 있습니다. 그렇기에 세부적으로 유람선과 자동차라는 클래스로 나눈 것입니다. 즉, 탈 것 클래스는 유람선과 자동차에게 각각 속성을 물려줬고 이를 상속이라 합니다.

 

  • OOP의 설계 원칙(SOLID)

SOLID 원칙을 철저히 지키면 시간이 지나도 변경이 용이하고, 유지보수와 확장이 쉬운 SW를 개발하는데 도움이 됩니다.

 

- SRP(Single Responsibility Principle, 단일 책임의 원칙) :

하나의 모듈은 하나의 책임만을 가져야 한다는 모호한 의미로 해석될 수 있지만 모듈이 변경되는 이유는 한가지여야 함으로 받아들여져야 합니다.

자동차의 각 부품에 대한 설계도가 모두 색상에 대한 내용을 포함하고 있어 색상을 변경하고 싶을 때 모든 설계도를 변경해서는 안됩니다.

단일 책임의 원칙을 제대로 지킨다면 변경이 필요할 때 수정할 대상이 명확해지기 때문에 대형 프로젝트를 수행할 때 그 장점이 극대화됩니다.

 

- OCP(Open-Closed Principle, 개방 폐쇄 원칙) :

확장에 대해 열려있고(요구사항이 변경될 때 애플리케이션의 기능을 확장할 수 있다.)

수정에 대해서는 닫혀있어야 한다(기존의 코드를 수정하지 않고 애플리케이션의 기능을 추가, 변경할 수 있다.)는

원칙입니다.

어떤 Class를 수정해야 한다면 그 Class를 상속(확장)해서 수정해야 합니다.

자동차v1에 새로운 기능을 추가하고 기존의 일부 기능을 변경한 자동차v2를 출시할 때 기존에 있던 자동차 v1의 설계도 자체를 수정한다면 더 이상 자동차v1의 생산은 어려워질 것입니다.

개방 폐쇄 원칙을 지키기 위해서는 추상화에 의존해야 합니다. 즉, 개방 폐쇄 원칙이 본질적으로 얘기하는 것은 추상화입니다.

 

- LSP(Liskov Substitution Principle, 리스코프 치환 원칙) :

상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 합니다.

자식 Class가 부모 Class를 대체하기 위해서는 부모 Class에 대한 Client의 가정을 준수해야 한다는 것을 강조합니다.

새롭게 출시된 자동차가 우리가 흔히 아는 바퀴 4개의 자동차와 외형은 똑같지만 수상에서만 주행이 가능하다면 이는 자동차에 대한 Client의 가정을 준수하지 않아 리스코프 치환 원칙에 위배됩니다.

 

- ISP(Interface Segregation Principle, 인터페이스 분리 원칙) :

각 행위에 대한 Interface는 서로 분리되어야 합니다.

즉, Client의 목적과 용도에 적합한 Interface만을 제공하는 것을 말합니다.

자동차의 문을 제작하는 하청 업체에 설계도를 전달할 때 모든 자동차 부품에 대한 설계도를 전달할 필요는 없을 것입니다.

 

- DIP(Dependency Inversion Principle, 의존 역전 원칙) :

상위 Class가 하위 Class에 의존하면 안 된다는 원칙입니다.

의존 역전 원칙은 개방 폐쇄 원칙과 밀접한 관련이 있습니다.

다이어트가 성행하는 미래에 자동차 회사 중 가장 유명한 회사인 A사에서 출시한 페달을 밟아 주행하는 자동차가 시장점유율을 80% 이상 차지했다고 해서 '엔진에서 만든 동력을 전달받아 움직인다.'는 자동차의 의미가 '사람의 힘으로 이동하는 수단'으로 바뀌어선 안됩니다.

 

 

 

참    고    자    료

- OOP란? | wugawuga

 

- OOP(Object-Oriented Programming, 객체 지향 프로그래밍) 이란? | hk009329.log

 

- OOP(객체 지향 프로그래밍)이란? | 무작정 개발

 

- 객체지향 프로그래밍의 5가지 설계 원칙, 실무 코드로 살펴보는 SOLID | 망나니개발자

728x90
반응형

'백엔드 > Java' 카테고리의 다른 글

Java 버전 별 특징  (2) 2024.03.07
Java  (0) 2024.03.07
JDBC  (0) 2024.03.06
Persistence Framework  (0) 2024.03.06
ORM  (0) 2024.03.05