c++

객체 지향 프로그래밍 OOP

시코. 2024. 2. 28. 14:34
728x90

https://namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D#s-3.1

 

객체 지향 프로그래밍

object-oriented programming(OOP) 프로그램 설계방법론의 일종으로, 명령형 프로그래밍

namu.wiki

나무위키 정리및 약간의 생각

객체지향프로그래밍

프로그램 설계방법론의 일종이다. 

객체라는 단위로 프로그램을 나누고

이들의 상호작용으로 서술한다

객체는 메소드와 변수를 가진다

 

 

캡슐화(encapsulation)

 변수와 함수를 하나의 단위로 묶는다.

정보은닉(information hiding)

클래스를 사용하는 입장에서 필요한것만 접근 가능하게한다.

내부동작을 위해서만 접근하는 멤버들은 접근을 제한한다.

사용할 때 접근이 용이해진다.

접근제한(access modifier)

private 는 클래스 내부에서만

protected는 상속받은 자식클래스에서만

public은 클래스 외부도 

접근이 가능해진다.

상속(inheritance)

상속은 자식 클래스가 부모 클래스의 기능과 특성을 그대로 물려받는것이다.

그리고 자식 클래스에서 부모의 기능을 수정하기도 하는데 이를 오버라이딩이라고한다.

다형성(polymorphism)

다형성은 하나의 변수 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는것을 말한다.

서브타입 다형성(subtype polymorphism / inclusion polymorphism/ subtyping)

 상위 클래스를 만들고 그것을 상속받는 하위 클래스들을 생성한다.

오버라이딩으로 하위 클래스에서 상위 클래스에서 상속받은 기능을 수정한다. 

상속받은 클래스들은 상위 클래스의 자료형에도 대입이 가능하다.

매개변수 다형성 (parametric polymorphism)

타입을 매개변수로 받아 새로운 타입을 되돌려준다.

템플릿(template)

c++에서 사용하는 개념. 매개변수를 입력받아 코드가 치환된다

컴파일시에 해석된다 

코드에 자료형에대한 유연함이 높아진다.

타입이아닌 변수도 넣을 수 있고 연산이나 함수가 정의되지 않은 타입을 매개변수로 넣으면 컴파일이 느려지고 에러가 발생, 파일 크기가 커진다.

제네릭(generic)

JAVA와 C#등에 도입된 개념

지정한 타입 매개변수에 해당하는 타입만을 사용하겠다고 약속하는 방식

특정 객체를 상속하는 경우 상속하는 객체의 함수는 호출할 수 있지만 그렇지 않은 경우 타입 매개변수로 지정된 객체의 멤버에는 접근할 수 없다.

임시 다형성(ad hoc polymorphism)

함수 오버로딩(function overloading)

C++ C# JAVA 

같은 이름의 함수가 매개변수의 형이 다른거나 개수가 다르면 서로 다른 기능으로 정의할 수 있다.

연산자 오버로딩(operator overloading)

C++ C# 

연산자를 오버로딩해서 다른 역할을 수행하게 하는게 가능함

강제 다형성(coercion polymorphism)

묵시적 형 변환 (implicit type coercion)

연산시 자료형이 작은 쪽에서 자료형이 큰쪽으로 형변환이 일어남

explicit이라는 키워드를 사용하면 막을 수 있음

명시적 형 변환(explicit type coercion)

형변환을 명시적으로 표현

 

원칙

SRP : Single Responsibility Principle 단일 책임 원칙

객체는 하나의 책을을 하져야 한다(객체는 하나의 변경만을 이유로 가져야 한다.)

 

사칙연산 함수를 가지고 있는 클래스가 있다면 이 상태의 계산 클래스는 오직 사칙연산 기능만을 책임진다.

프로그램이 대대적으로 수정되어도 계산 클래스가 수정될만한 사유는 사직연산 함수와 관련된 문제 뿐이다.

클래스의 목적을 명확히 적절한 범위로 함으로서 구조를 간단히 수정사항을 명확히한다.

기능 수정시 영향을 받는 범위가 너무 넓으면 예상치못한 결과가 나올 수 있다. 

OCP : Open-Closed Principle

객체는 확장에 대해서는 개방적이고 수정에 대해서는 폐쇄적이어야 한다, 즉 객체 기능의 확장을 허용하고 스스로의 변경은 피해야 한다. // 수정할 사항이 있으면 자식 객체를 구현하는것을 고려하는것을 말한다고 볼 수 있을것 같다

LSP : Liskov Substitution Principle

자식 클래스는 언제나 자신의 부모클래스를 대체할 수 있다는 원칙이다 즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 잘 잘동해야한다는것. 상속의 본질이다. 이를 지키지 않으면 부모 클래스 본래 의미가 변해서 is-a 관계가 망가져 다형성을 지킬 수 없게 된다.

//부연 설명을 보니 아마 상속을 하고나서 재정의를 하지 않았을때 발생하는 예상외의 결과를 방지하기 위함인것 같다.

ISP : Interface Segregation Principle

클라이언트에서 사용하지 않는 메서드는 사용해서는 안된다. 그러므로 인터페이스를 다시 작게 나누어 만든다.

OCP와 비슷한 느낌도 들지만 엄연히 다른 원칙이다. 하지만 ISP를 잘 지키면 OCP도 잘 지키게 될 확률이 비약적으로 증가한다. 정확히 말하자면 인터페이스의 SRP라고 할 수 있다.

//두개의 다른 일을 하는 인터페이스를 만들지 말자는 규칙같다

DIP : Dependency Inversion Principle

추상성이 높고 안정적인 고수준의 클래스는 구체적이고 불안정한 저수준의 클래스에 의존해서는 안된다는 원칙

일반적으로 인터페이스를 통해 이원칙을 준수 할 수 있게 된다. (상대적 고수준인)클라이언트는 저수준의 클래스에서 추상화한 인터페이스만을 바라보기 때문에 이 인터페이스를 구현한 클래스는 클라이언트에 어떤 변경도 없이 얼마든지 나중에 교체될 수 있다.

디자인 패턴 중 전략 패턴을 떠올리면 된다.

장단점

여러가지 고려할 점들이 많아져 처음 설계는 쉽지 않지만

잘 만들어진 색체지향 코드는 가독성과 유지보수가 용이해진다.

https://computasha.github.io/CS-OOP/

 

객체 지향 프로그래밍, OOP의 개념과 특징

블로그 이전했습니다! https://computasha.com/basic/term/객체+지향+프로그래밍%2C+OOP의+개념과+특징 프로그래밍 패러다임과 함수형 프로그래밍에 관해서는 여기를 참고해주세요! OOP란? 객체 지향 프로그

computasha.github.io

 

캡슐화는 필요한 기능만을 하나로 묶는다.

은닉화도 필요한 기능만 밖에 보여준다

상속은 기존의 클래스를 재사용해 새로운 클래스를 만든다

추상화는 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다

다형성 하나의 변수명이 다른의미로 해석될 수 있다

동적바인딩 실행중의 값에따라 데이터 타입과 호출될 함수가 결정된다.

 

 

 

 

Getter랑 Setter를 왜 써야할까?

자바의 접근 제한자 private : 같은 클래스 내에서만 접근 가능 default : 같은 패키지 내에서만 접근 가능 protected : 같은 패키지내 또는 자손 클래스일 경우 접근 가능 public : 제한 없음 캡슐화 접근

www.blog.ecsimsw.com

 

 

[OOP] Getter와 Setter는 지양하는게 좋다

목차 들어가기 전에 얼마 전 사내에서 Getter와 Setter를 함부로 사용하면 안되는 이유에 대한 세미나가 있었다. Setter에 대한 이야기는 워낙 많이 알려져있었지만 Getter에 대한 이야기는 잘 하지 않

colabear754.tistory.com

Getter와 Setter을 사용하면

입력값과 출력값을 검사하는 조건들을 추가나 수정할때 하나씩 찾아서 수정할 필요없이 Getter와 Sette만 수정하면 된다

하지만 이름을 좀더 목적을 명확히 하여 사용하는게 더 가독성이 좋아지기때문에 다른 이름의 필요에 따라 여러 방식의 Getter와 Setter를 사용하는게 좋다고 말하는것 같다.

728x90