객체 지향 프로그램 & SOLID

wjd15sheep·2024년 1월 30일

CS

목록 보기
8/9

객체란

객체(object) :

객체는 관련된 데이터와 함수(일반적으로 여러 데이터와 함수로 이루어지는데, 객체 안에 있을 때는 보통 프로퍼티와 메소드라고 한다)

  • 객체는 변수, 함수, 그리고 관련된 데이터와 메서드를 묶어놓은 것입니다. 객체는 클래스의 인스턴스입니다. 클래스는 객체를 만들기 위한 일종의 설계도로, 객체가 가져야 할 특징(속성)과 기능(메서드)을 정의합니다.
  • 프로그래밍에서는 속성과 기능을 가지는 프로그램 단위를 뜻한다.

클래스란?

멤버 변수와 메서드를 가지는 객체를 만들기 위한 확장이 가능한 코드 양식
객체를 찍어내기 위한 틀, 설계도

인스턴스란?

설계도인 클래스를 바탕으로 실체화되어 메모리에 할당된 실체
객체는 소프트웨어에서 구현할 대상, 설계도에 따라 소프트웨어 세계에 구현된 실체가 인스턴스

예시)

// 클래스 정의
class Dog {
    // 속성(변수)
    String name;
    int age;

    // 메서드(함수)
    void bark() {
        System.out.println("멍멍!");
    }
}

// 클래스의 인스턴스(객체) 생성
Dog myDog = new Dog();

// 객체의 속성 설정
myDog.name = "뽀송이";
myDog.age = 2;

// 객체의 메서드 호출
myDog.bark();  // 출력: 멍멍!

여기서 Dog 클래스는 개를 나타내는 클래스입니다. myDog는 Dog 클래스를 기반으로 만들어진 객체(인스턴스)로, 객체 내에는 name과 age라는 변수가 있고, bark라는 메서드가 있습니다. 이런 식으로 클래스는 객체를 만들기 위한 템플릿 역할을 하며, 객체는 그 템플릿을 기반으로 특정 데이터와 기능을 가집니다. 이런 개념이 객체지향 프로그래밍의 중요한 부분입니다.

객체지향 프로그램 OOP(Object-Oriented Programming)

많은 객체(Object)들이 모여서 상호 협력하면서 데이터를 처리하는 방식의 프로그래밍 설계방법
객체지향 프로그래밍을 지원하는 언어로는 C++, C#, Java, Python, JavaScript, Ruby, Swift 등 있다.
객제치향 프로그램은 크게 네가지 특성이 있다. 추상화, 캡슐화, 상속, 다형성

1 추상화 (Abstraciton)

추상화란 미술에서 사실적으로 그리는 것이 아닌 점, 선, 색채 등의 단순하게 표현하는 것이다.
컴퓨터 과학에서 추상화란 복잡한 자료, 모듈, 시스템 등으로부터 핵심적은 개념 또는 기능을 간추려 내는 것

클래스들의 중요하고 공통된 성질들을 추출하여 부모 클래스를 선정하는 개념과, 이벤트 발생의 정확한 절차나 방법을 정의하지 않고 대표할 수 있는 표현으로 대체하는 것

객체의 관련 속성만 '표시' - 데이터 추상화
불필요한 세부 정보는 '숨긴다' - 제어 추상화

1.1 제어 추상화

메소드의 작동방식과 같은 내부 로직을 숨기는 것

  • 추상화한 코드 main()에서

  • 내부 코드

사용자는 메서드로 값을 주고 받기만 하기 때문에 추상화되었다고 한다.

1.2 데이터 추상화

간단한 개념으로 일반화하는 과정
공통 특징인 도형으로 묶어 이름을 붙이는 것 갤럭시폰=>휴대폰=>통신기기=>전자제품 순으로 추상화를 시킬 수 있다.

상속

  • 클래스의 속성과 함수를 하위 클래스에 물려주거나 하위 클래스가 물려받는것
  • child 클래스가 parent 클래스의 연산을 이용할 수 있게 하는 기능

예시

// 동물 클래스 정의
class Animal {
    void sound() {
        System.out.println("동물 소리를 내다.");
    }
}

// 강아지 클래스 정의, 동물 클래스를 상속받음
class Dog extends Animal {
    // 강아지만의 추가적인 특징이나 기능을 정의할 수 있음
    void bark() {
        System.out.println("멍멍!");
    }
}

// 객체 생성
Dog myDog = new Dog();

// '동물' 클래스의 메서드 사용
myDog.sound();  // 출력: 동물 소리를 내다.

// '강아지' 클래스의 메서드 사용
myDog.bark();   // 출력: 멍멍!

동물 클래스를 저의한 것을 강아지 클래스가 상속을 받아서 강아지가 동물 클래스에서 정의된 sound()를 사용할 수 있다.

캡슐화

  • 데이터 구조와 데이터를 다루느 방법들을 결합 시켜 묶는것
  • 낮은 결합도를 유지할 수 있도록 설계하는 것
    속성과 기능을 정의하는 변수와 메소드를 클래스라는 캡슐에 넣어서 분류하는 것으로 재사용이 원활하다는 장점과 정보은닉을 활용 할 수있다.

다형성

하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석 될 수 있는 것
어떠한 요소에 여러 개념을 넣어 놓는 것

하나의 클래스 내부에 같은 이름의 행위를 여러개 저으이하거나 상의 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 다형성 특징을 갖는다

  • 오버라이딩
    • 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것
  • 오버로딩
    • 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것

SOLID(객체지향 설계 원칙)

객체 지향적 설계를위해 다섯 가지 원칙이 있다. 앞자리만 따서 SOLID라한다.

  • 단일 책임 원칙(SRP, Single Responsibility Principle)

    • 하나의 클래스는 단 하나의 책임만 가져야한다.
    • 단일 책임 원칙을 지키지 않을 경우 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈수 있다.
  • 개방-폐쇄 원칙(OCP, Open/Closed principle)

    • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
    • 기능을 변경하거나 확장할 수 있으면서 기능을 사용하는 코드는 수정하지 않는다.
  • 리스코프 치환 원칙(LSP, Liskov Substitution Principle)

    • 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
    • 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
  • 인터페이스 분리 원칙(ISP, Interface Segregation Principle)

    • 범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
    • 인터페이스는 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
    • 클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야한다.
  • 의존관계 역전 원칙(DIP, Dependency Inversion Principle)

    • 추상화에 의존해야지 구체화에 의존하면 안된다.
    • 고수준 모듈은 저 수준 모듈의 구현에 의존해서는 안되고 저수준 모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.

참조

profile
성장 위해 노력하는 웹 개발자 주니어

0개의 댓글