반응형
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Bbaktaeho

[Programming] 객체 지향 프로그래밍 (Object-Oriented Programming, 캡슐화, 상속, 다형성) 본문

프로그래밍 (Programming)/프로그래밍 상식 (Common Sense)

[Programming] 객체 지향 프로그래밍 (Object-Oriented Programming, 캡슐화, 상속, 다형성)

Bbaktaeho 2020. 9. 13. 15:29
반응형

[2021-04-23] 내용 추가

프로그래밍 패러다임


패러다임은 프로그래머에게서 권한을 박탈한다.
어느 패러다임도 새로운 권한을 부여하지 않고, 일종의 추가적인 규칙을 부과한다.
즉, 패러다임은 무엇을 해야 할지를 말하기보다는 무엇을 해서는 안 되는지를 말해준다. 
- 클린 아키텍처 로버트 C. 마틴 -

객체 지향


좋은 아키텍처를 만드는 일은 객체 지향 설계 원칙을 이해하고 응용하는 데서 출발합니다.

객체 지향 설계 원칙을 쉽게 말하면 "데이터와 함수의 조합"이라고 답하는 것은 만족스러운 대답이 아닙니다.

또는 실세계를 모델링하는 방법이라고 하는데 이 또한 만족스럽지 못합니다. 대부분의 서적이 실세계의 모든 객체는 어떤 유형을 가지고 있으므로 각 객체는 같은 유형을 갖는 객체들로 분류할 수 있다고 합니다.(집에 있는 책 2권 모두..) 이 답변이 전하는 의도는 객체 지향이 현실 세계와 의미적으로 가깝기 때문에 객체 지향을 사용하면 소프트웨어를 좀 더 쉽게 이해할 수 있다는 데 있는 것 같습니다.

 

그래서 객체지향이 뭔데?

다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 회득할 수 있는 능력이다..!!

객체지향을 사용하면 고수준의 정책을 포함하는 모듈은 저수준의 시부사항을 포함하는 모듈에 대해 독립성을 보장할 수 있다.

객체 지향 프로그래밍


객체 지향 프로그래밍은 널리 사용되고 있으며 강력한 기능들을 보유하고 있습니다.

객체 지향 프로그래밍의 주요 특성으로 캡슐화, 상속, 다형성을 들 수 있습니다. 

캡슐화는 정보 은닉, 추상화 개념으로 해석될 수 있으며 상속은 코드 재사용과 연관이 있습니다.

다형성은 상속의 개념 속에서 하나의 이름을 여러 가지로 해석되는 것을 의미합니다.

클래스

객체 지향 프로그래밍 기법에서 가장 중심적인 것은 클래스입니다.

하나의 설계도라고 해석할 수 있습니다.

클래스는 데이터 역할을 하는 필드, 행동의 역할을 하는 메서드로 구성됩니다.

생성자도 하나의 행동으로서 클래스를 통해 새로운 객체를 만들어낼 때 행동하는 메서드입니다. 이것을 인스턴스화라고 합니다.

class Car {
    String engine;
    String name;
    String tire;
    int price;

    Car() {
        this("no", "no", "no", 0);
    }
    Car(String engine, String name, String tire, int price) {
        this.engine = engine;
        this.name = name;
        this.tire = tire;
        this.price = price;
    }
    void start() {};
    void shutDown() {};
    void go() {};
    void stop() {};
}
public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car.engine);
    }
}

캡슐화

데이터와 함수를 쉽고 효과적으로 캡슐화하는 방법은 객체 지향 언어가 제공합니다.

캡슐화 정보 은닉을 위함으로 사용되며 접근 제어자로 그 권한을 조절할 수 있습니다. 즉, 클래스를 이용하는 프로그래머에게 클래스의 세부 구현이 감춰져야 함을 의미합니다.

class Car {
    private String engine;
    private String name;
    private String tire;
    private int price;

    Car() {
        this("no", "no", "no", 0);
    }
    Car(String engine, String name, String tire, int price) {
        this.engine = engine;
        this.name = name;
        this.tire = tire;
        this.price = price;
    }
    void start() {};
    void shutDown() {};
    void go() {};
    void stop() {};
    public String getEngine() {
        return this.engine;
    }
}
public class Main {
    public static void main(String[] args) {
        Car car = new Car();
//        System.out.println(car.engine);
        System.out.println(car.getEngine());
    }
}

 실제로 많은 객체 지향 언어가 캡슐화를 거의 강제하지 않습니다. 접근 제어자를 느슨하게 주게 되면 캡슐화의 개념은 없는 거나 마찬가지입니다.

상속

상속은 부모 클래스 혹은 기반 클래스(base class)라 불리는 클래스로부터 자식 클래스 혹은 파생 클래스(derived class)라 불리는 새로운 클래스를 생성하는 과정입니다.

파생 클래스는 기반 클래스가 가진 모든 멤버 변수와 메서드를 자동적으로 가지게 되고 추가적으로 새로운 메서드와 멤버 변수를 가질 수 있습니다.

자바 언어에서 상속은 extends 키워드를 사용합니다.

public class MyCar extends Car{
    private String owner;

    MyCar() {
        this("no");
    }
    MyCar(String owner) {
        super();
        this.owner = owner;
    }
    String getOwner() {
        return this.owner;
    }
}
public class Main {
    public static void main(String[] args) {
        MyCar myCar = new MyCar("taeho");

        System.out.println(myCar.getEngine());
        System.out.println(myCar.getOwner());
    }
}

상속을 통해 기반 클래스로 업 캐스팅도 가능합니다.

다형성

다형성은 하나의 메서드에 여러 의미를 연관시키는 능력을 나타냅니다.

일반적으로 자바에서 추상 메서드(C++ 에선 가상 함수)를 가지는 클래스를 상속받을 때 파생 클래스에서 추상 메서드를 오버라이딩하는 것을 말합니다.

abstract class Printer {
    abstract void printPaper();
}
class ColorPrinter extends Printer {
    @Override
    void printPaper() {
        System.out.println("Color");
    }
}
class GrayScalePrinter extends Printer {
    @Override
    void printPaper() {
        System.out.println("Gray Scale");
    }
}
public class Main {
    public static void main(String[] args) {
        Printer colorPrinter = new ColorPrinter();
        Printer grayScalePrinter = new GrayScalePrinter();
        colorPrinter.printPaper();
        grayScalePrinter.printPaper();
    }
}

소프트웨어 아키텍트 관점에서 객체 지향이란 다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 제어 권한을 획득할 수 있는 능력입니다.

참고 자료


bbaktaeho-95.tistory.com/54

 

[Programming] Method Overloading & Overriding (객체지향, 메서드 중복, 메서드 재정의)

Method 메서드란 객체의 행동을 기술하는 함수입니다. 객체의 상태를 조회하거나 수정하는 작업, 또는 특정 로직을 포함하는 함수입니다. Signature 모든 메소드는 Signature를 가지고 있습니다. 모든 �

bbaktaeho-95.tistory.com

ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

객체 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목�

ko.wikipedia.org

https://g.co/kgs/msR2sY

 

클린 아키텍처: 소프트웨어 구조와 설계의 원칙

로버트 C. 마틴의 책

www.google.com

 

반응형