class - object-oriented programming(OOP)

sangwoo noh·2022년 9월 3일
0

info

목록 보기
10/14

간단정리

객체들이 서로 유기적으로 동작하는 프로그래밍 이론
코드의 재사용성과 중복제거가 가장 큰 목적

추상화

  • 관련된 것들이 번들링된 클래스의 이름을 정의하는 것
  • 또는 요소를 관련된 것으로만 구성하는 것

캡슐화

  • 변수와 함수를 한데 묶어 놓는 것(데이터 번들링)
  • 외부에 노출할 필요가 없는 정보를 은닉

상속

  • 부모 클래스의 변수와 함수를 자식클래스에게 물려주는 것
  • 물려받은 자식 클래스는 부모 클래스의 변수와 함수를 전부 사용할 수 있다
  • 코드의 재사용이 목적

다형성

  • 같은 형태이지만 다른 기능을 하는 것
  • 그중에 상속받고 오버라이딩 하는 것이 제일 보편적인 다형성
  • 또는 데이터 타입이 변경될때 다른 기능을 하는 것

1. 추상화(Abstraciton)

  • 공통의 속성이나 기능을 묶어 네이밍 하는 것
  • 객체 지향적 관점에서 클래스를 정의하는 것
  • 뱀, 개, 호랑이 등이 있을 때 우리는 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할 때, 동물 또는 생물이라고 묶는 것을 추상화

2. 캡슐화(encapsulation)

  • 변수와 함수를 하나의 단위로 묶는 것을 의미한다. 즉, 데이터의 번들링(bundling)이다. 대개 프로그래밍 언어에서 이 번들링은 클래스를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드에 쉽게 접근할 수 있다. 클래스는 객체 지향 프로그래밍을 지원하는 거의 대부분의 언어가 제공하는 제1요소이다.

2-1. 정보 은닉(information hiding)

  • 프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다. 내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높이는 개념은 거의 모든 현대 프로그래밍 언어에 녹아 있다. 많은 객체 지향 언어에서 사용되는 클래스를 기준으로 보면, 클래스 외부에서는 바깥으로 노출된 특정 메소드에만 접근이 가능하며 클래스 내부에서 어떤 식으로 처리가 이루어지는지는 알지 못하도록 설계된다.

일반적으로 세 종류의 접근 제한이 사용된다.
public: 클래스의 외부에서 사용 가능하도록 노출시키는 것이다.
protected: 다른 클래스에게는 노출되지 않지만, 상속받은 자식 클래스에게는 노출되는 것이다.
private: 클래스의 내부에서만 사용되며 외부로 노출되지 않는다.

보통 캡슐화와 정보 은닉을 묶어서 생각하는 경우가 많은데, 정보 은닉은 캡슐화로부터 파생된 보조 개념이지 '캡슐화 = 정보 은닉'은 아니다. Python은 정보 은닉을 지원하지 않지만 클래스를 통한 캡슐화를 지원하기 때문에 객체지향 언어로 분류된다.

3. 상속(inheritance)

  • 상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것을 말한다. 기능의 일부분을 변경해야 할 경우 자식 클래스에서 상속받은 그 기능만을 수정해서 다시 정의하게 되는데, 이러한 작업을 '오버라이딩(overriding)'이라고 한다. 상속은 캡슐화를 유지하면서도 클래스의 재사용이 용이하도록 해 준다.
    상세 내용 아이콘 자세한 내용은 상속(프로그래밍) 문서를 참고하십시오.

4. 다형성(polymorphism)

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

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

우리가 일반적으로 접하는 OOP의 그것. 기초 클래스 또는 어떠한 인터페이스를 구현하는 상위 클래스를 생성하고, 해당 클래스를 상속받는 다수의 하위 클래스들을 만들어 상위 클래스의 포인터나 참조변수 등이 하위 클래스의 객체를 참조하게 하는 것이다. 이 때 각각의 하위 클래스는 상위 클래스의 메소드 위에 자신의 메소드를 덮어쓰는 메소드 오버라이딩(method overriding)을 수행하며, 상위 클래스의 참조변수가 어떤 하위 클래스의 객체를 참조하느냐에 따라 호출되는 메소드가 달라진다., Java, C++, C#, Python, Ruby 등의 객체 지향 언어들은 기본적으로 지원하는 개념.

매개변수 다형성(parametric polymorphism)

타입을 매개변수로 받아 새로운 타입을 되돌려주는 기능이다. 타입 매개변수를 정의한 클래스 혹은 메소드는 사용할 때 매개변수에 타입을 지정하게 되며, 컴파일 시 지정한 타입에 따라 해석된다.

  • 템플릿(template)
    C++에서 사용하는 개념으로, 타입 매개변수를 입력한 타입으로 치환한 코드를 생성하는 방식이다. 타입 뿐 아니라 변수도 입력할 수 있으며, 객체 내부에서 연산이나 함수 호출을 할 수 있지만, 해당 연산이나 함수가 정의되지 않은 타입을 매개변수로 넣으면 컴파일 에러가 발생하며 컴파일이 느려지고 파일이 커진다.
  • 제네릭(generic)
    Java와 C# 등에 도입된 개념으로, 지정한 타입 매개변수에 해당하는 타입만을 사용하겠다고 약속하는 방식이다. 타입 매개변수가 특정 객체를 상속할 경우 상속하는 객체의 함수는 호출할 수 있지만 그렇지 않을 경우 타입 매개변수로 지정된 객체의 멤버에는 접근할 수 없다.

임시 다형성(ad hoc polymorphism)

  • 함수 오버로딩(function overloading)
    C++과 C#, Java에서는 함수 오버로딩을 통해 동일한 이름의 함수를 매개변수에 따라 다른 기능으로 동작하도록 할 수 있다. 함수 오버로딩을 너무 많이 사용하면 전체적인 코드의 유지보수가 어려워지므로, 템플릿 또는 제네릭으로 대체하는 것이 일반적이다.
  • 연산자 오버로딩(operator overloading)
    C++, C# 등에서는 연산자를 오버로딩해서 기본 연산자가 해당 클래스에 맞는 역할을 수행하게 하는 것이 가능하다. Java에서는 연산자의 오버로딩이 불가능하다. Perl 6나 Smalltalk, F#, Kotlin 등 연산자의 신규 정의가 가능한 언어도 있다. 한글 위키백과의 연산자 오버로딩에 대한 프로그래밍 언어 분류

강제 다형성(coercion polymorphism)

  • 묵시적 형 변환(implicit type coercion)
    'double a = 30;'이라는 식이 실행되면 int형 값 30은 double로 묵시적 형 변환이 이루어진다. double은 int보다 크기가 큰 자료형이므로, 이러한 형 변환을 자료형 승급(type promotion)이라고 한다. C++의 변환 생성자에 의한 형 변환도 묵시적 변환에 속하며, 이를 막으려면 생성자 앞에 explicit 키워드를 추가해야 한다.
  • 명시적 형 변환(explicit type coercion)
    'double a = (double)30;'이라는 식은 위와 동일한 결과를 내지만, (double)을 통해 int형 값 30이 double형으로 변환됨을 명시적으로 표현하였다
profile
하기로 했으면 하자

0개의 댓글