객체와 객체 지향

박태현·2025년 4월 14일

Java

목록 보기
1/17

객체와 객체 지향에 대해 명확히 알고있지 않는 것 같아 글을 정리하며 다시 학습하려 합니다.

객체란


데이터 ( 상태 )와 기능 ( 행위 )을 하나로 묶인 독립적인 단위

⇒ 현실 세계의 사물을 컴퓨터 세계에 표현한 단위라고 볼 수 있음

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


객체들이 모여서 상호 작용하며 데이터를 처리하는 방식

즉, 프로그램을 묶음 단위로 쪼개서, 이후에 이를 이용하는 프로그램 방식

절차 지향 프로그래밍

함수를 사용하여 정리 정돈하는 프로그래밍 Ex) C언어

함수를 이용하여 작은 단위로 만들고 이를 결합하여 큰 프로그램을 만들어가는 프로그래밍

⇒ 복잡함

장점

  • 클래스를 통한 코드 재사용성이 높음
  • 추상화에 따른 유지보수가 쉬움
  • 클래스 단위로 모듈화가 가능 → 협업 구조에 적합

단점

  • 메모리를 많이 차지함
  • 설계가 어려움

객체 지향의 4가지 특징


  • 다형성 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질 ( 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성 ) 대표적인 예
    **메서드 오버라이딩**
    부모 클래스의 메서드를 자식 클래스에서 재정의해서 사용하는 것을 말하며
    , 자식 클래스는 부모 클래스의 메서드를 재활용하면서, 독자적인 기능을 추가할 수 있음
    
    **메서드 오버로딩**
    같은 이름의 메서드를 다양한 매개변수 타입과 개수로 오버로딩하여 사용하는 것을 말하며,
    메서드 이름을 동일하게 유지하면서도, 다양한 상황에서 유연하게 대응할 수 있는 방법을 제공
    업캐스팅, 다운캐스팅, 인터페이스, 추상 메서드, 추상 클래스 등등
  • 캡슐화 연관된 데이터(변수)와 기능(메소드)을 하나로 묶고, 불필요한 요소를 외부에 노출되지 않도록 설계하는 방식 자바에서는 접근 제어자 & Getter/Setter를 통해 캡슐화를 구현할 수 있음
  • 상속 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미 상속되는 클래스는 super/parent 클래스로 불리고 새로 생성된 클래스는 sub/child 클래스로 불림 ⇒ 중복 제거, 코드의 재사용 증가, 유지보수 용이 등의 장점이 있음
  • 추상화 객체들의 공통적인 특성을 묶어서 표현하는 것 즉 알고는 있지만, 정확하게 표현하기 힘든 것들을 중요한 부분이나 특징을 잡아 설명하는 것 자바에서는 추상 클래스와 인터페이스라는 문법 요소를 통해 추상화를 구현할 수 있음
    • 데이터 추상화 - 객체의 관련 속성만 표시 대상을 간단한 개념으로 일반화하는 과정 (데이터의 내부 표현은 숨기고, 필요한 인터페이스만 제공) ⇒ 클래스 내부의 필드는 private로 숨기고 외부에서 getter/setter 또는 메서드 인터페이스만 제공
    • 제어 추상화 - 불필요한 세부 정보는 숨김 어떤 클래스의 메서드를 사용자에게 메서드의 작동 방식과 같은 내부 로직을 숨기는 것 ⇒ 어떻게 동작하는지는 감추고, 무엇을 하는지만 보이게 하면 됨

⭐ 좋은 객체 지향 설계의 5가지 원칙 ( SOLID ) ⭐


By ROVERT MARTIN

  1. SRP ( Single responsibility principle ) : 단일 책임 원칙

    하나의 클래스는 하나의 책임( 기능 )만 가지며, 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행 하는데 집중되어야 함

    ⇒ 어떤 변화에 의해 클래스를 변경할 때 파급 효과가 적어야 한다는 의미

    Ex ) UI 변경, 객체의 생성과 사용을 분리

  2. OCP ( Open/closed principle ) : 개방 - 폐쇄 원칙 ⭐⭐

    소프트웨어 요소는 확장에는 열려 있으나, 변경에는 닫혀 있어야 한다.

    ⇒ 자신의 확장에는 열려있으나, 주변에 변화에 대해서는 닫혀 있어야 한다는 의미

    [ OCP 적용 방법 ]

    1. 변경 ( 확장 ) 될 것과 변하지 않을 것을 엄격히 구분
    2. 이 두 모듈이 만나는 지점에는 인터페이스를 정의하여 구현
    3. 구현에 의존하기보다 정의한 인터페이스에 의존하도록 코드를 작성

예시 )

JDBC는 DB의 종류와 관계 없이 프로그래머에게 동일한 인터페이스를 제공함으로써

프로그래머에게는 DB 변화에 닫혀 있게 되고, JDBC는 자신의 확장에는 열려 있음

  1. LSP ( Liskov substitution principle ) : 리스코프 치환 원칙

    서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 함

    상속의 원칙을 잘 지키는 것이 LSP를 잘 지키고 있는 것

  1. ISP ( Interface segregation principle ) : 인터페이스 분리 원칙

    클라이언트는 자신이 사용하지 않는 인터페이스에 의존 관계를 맺으면 안됨

    클래스는 자신이 사용하지 않는 인터페이스 ( 메서드 )는 구현하지 않아야 함

    즉, 어떤 클래스가 인터페이스의 특정 기능만을 사용할 경우 범용 인터페이스 하나를 사용하는 것이 아닌 특정 클라이언트를 위한 인터페이스 여러 개를 사용해야 한다

    [ 예시 ]

    public interface Operatable {
        void 기어가기();
        void 달리기();
        void 뛰기();
    }
    
    --- 로봇1은 모든 기능을 다 사용하기에 상관이 없지만
    
    public class 로봇1 implements Operatable {
        @Override
        public void 기어가기(); {
            // 구현
        }
    
        @Override
        public void 달리기(); {
            // 구현
        }
    
        @Override
        public void 뛰기(); {
            // 구현
        }
    }
    
    -- 
    *로봇2가 기어가기() 기능만 필요로 한다면, 모든 동작을 포함한 범용 인터페이스 Operatable에
    의존하는 대신, 기어가기()만을 정의한 명확한 인터페이스를 따로 만들어 그것에 의존해야함*
       
    public interface Operatable2 {
        void 기어가기();
    }
    
    public class 로봇2 implements Operatabl2 {
        @Override
        public void 기어가기(); {
            // 구현
        }
    }

5. DIP ( Dependency inversion principle ) : 의존관계 역전 원칙

구체화에 의존하는 것이 아닌 추상화에 의존해야함

의존성 주입은 이 원칙을 따르는 방법 중 하나임

Ex) 운전자는 자동차에 역할에 대해서만 알면 되지 k3에 대해 알 필요는 없음

쉽게 이야기해서 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻

구현체에 의존하게 되면 변경이 아주 어려워짐
profile
꾸준하게

0개의 댓글