본문 바로가기

STUDY/JAVA

JAVA-객체 지향 프로그래밍이란

728x90

객체 지향 프로그래밍( Object-Oriented Programming, OOP)

프로그래밍 패러다임 중 하나로, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

OOP의 기본 구성 요소

  • 클래스
    • 같은 종류의 집단에 속하는 속성과 행위를 정의한 틀 같은 것.
    • 다른 클래스와 독립적으로 디자인 해야한다.
  • 객체
    • 클래스의 인스턴스이다.
    • 자신 고유의 속성을 가지며, 클래스에서 정의한 행위를 수행할 수 있다.
  • 메서드
    • 객체끼리 소통을 하는 방법
    • 클래스로부터 생성된 객체를 사용하는 방법, 객체의 속성을 조작할 때 사용
인스턴스 : 소프트웨어 세계에서 구현된 실체
객체 : 소프트웨어 세계에서 구현해야 할 대상

장·단점

  •  장점
    1. 재사용성이 높다.
      • 다른 곳의 클래스를 가져와 사용하거나, 상속을 통해 추가,확장해서 사용할 수 있기때문
    2. 유지보수가 쉽다.
      • 객체 단위로 코드가 분리되어 있기때문
    3. 대형 프로젝트에 적합하다
      • 모듈화시켜 개발할 수 있으므로 여러 사람이 개발가능.
  • 단점
    1. 실행 속도가 상대적으로 느리다.
      • 절차지향 언어는 컴퓨터의 처리구조와 실행순서가 비슷하기 때문에 속도가 빠르다.
      • 객체간에 메시지를 통해 실행하기 때문
    2. 설계 비용이 크다
      • 객체간의 상호작용이 필수기 때문에 초기 설계에 많은 시간,비용이 필요하기 때문

4가지 특징

  1. 캡슐화
    • 한 객체가 특정한 하나의 목적을 위해 필요한 변수,메서드를 하나로 묶는 것을 의미.
    • 외부에서의 접근을 제한하고, 내부를 보호한다.
    • 유지보수 효율, 재사용성을 높일 수 있다.
  2. 상속
    • 상위 클래스의 기능을 물려받아 하위클래스의 기능을 정의하는 것
  3. 다형성
    • 각기 다른 객체가 동일한 동작을 명령 받았을 때 각 객체의 특성에 맞게 동작하는 것
    • 상속을 통해 기능 확장 및 변경을 가능하게 해준다. 이를 통해 코드의 재사용을 가능하게 하며, 유지보수가 용이하도록 도와줌
  4. 추상화
    • 객체들이 공통적으로 필요로 하는 속성, 동작을 하나로 추출
    • 객체의 복잡한 내부를 숨기고, 필요한 부분만 간추려 표현하는 것

객체 지향 프로그래밍 5원칙

  1. SRP (Single Responsibility) 단일 책임 원칙
    • 클래스는 단 한개의 책임을 가져야 함
    • 클래스를 변경하는 이유는 단 하나여야 함
    • 이를 지키지 않으면, 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미칠 수 있음
      → 이렇게 되면 유지보수가 매우 비효율적
  2. OCP (Open-Closed) 개방-폐쇄 원칙
    • 확장에는 열려있어야 하고, 변경에는 닫혀 있어야 함
    • 즉, 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 함
    • 이를 지키지 않으면 instanceof 와 같은 연산자를 사용하거나, 다운 캐스팅 발생
  3. LSP (Liskov Substitution) 리스코프 치환 원칙
    • 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 함
      → 즉, 상위 타입 객체를 하위 타입 객체로 치환해도 정상적으로 동작해야 함
    • 상속관계에서는 꼭 일반화 관계 (IS-A) 가 성립해야 한다는 의미 (일관성 있는 관계인지)
    • 상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙이 위배됨 (재사용 목적으로 사용하는 경우)
  4. ISP (Interface Segregation) 인터페이스 분리 원칙
    • 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
    • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
      → 하나의 통상적인 인터페이스보다는 차라리 여러 개의 세부적인 (구체적인) 인터페이스가 나음
    • 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 함
  5. DIP (Dependency Inversion) 의존 역전 원칙
    • 의존 관계를 맺을 때, 변하기 쉬운 것 (구체적인 것) 보다는 변하기 어려운 것 (추상적인 것)에 의존해야 함
      → 구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다는 뜻
    • 즉, 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 됨
    • 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 함
    • 저수준 모듈이 변경되어도 고수준 모듈은 변경이 필요없는 형태가 이상적
728x90

'STUDY > JAVA' 카테고리의 다른 글

JAVA-동작 원리  (0) 2023.12.28