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

해니·2023년 9월 6일
0

CS

목록 보기
5/15
post-thumbnail



등장배경


순차적 (비구조적) 프로그래밍

  • 정의한 기능의 흐름에 따라 순서대로 동작을 추가하며 프로그램을 완성하는 방식
  • GOTO문을 이용하여 흐름제어
    • A → B → C 라는 동작을 구현하다가, C 에서 A 로 돌아가야할 상황이라면 GOTO 를 활용
    • 무분별하게 사용시 스파게티 소스가 될 가능성이 높다
  • 유지보수가 어렵고, 흐름이 복잡해져 코드의 파악이 어려우며, 코드 재사용성을 떨어뜨린다



절차적 (구조적) 프로그래밍

  • 비구조적 프로그래밍의 문제점을 보완하고자 등장한 패러다임

  • 프로그램이 실행될 때 코드의 위에서 아래 방향(Top-Down)으로만 진행되도록 절차와 순서를 갖게 하는 패러다임

  • 순차, 선택, 반복의 구조를 반복해나가면 코드를 진행한다

    • 순차: 코드를 순서대로 진행한다.
    • 선택: 조건문, 선택문 (if 문, switch~case 문)
    • 반복: 반복문 (for, while, do~while 문)
  • 흐름 제어를 사용하지 않음으로써 코드 가독성을 높인다

  • 기능을 함수 등으로 모듈화시키면서 비구조적 프로그래밍 방식보다 유지보수가 더 쉽고, 코드 의미 파악이 쉬우며, 코드의 재사용성도 높여준다

  • 속성과 행위가 개별로 분리된다

    • 갈수록 협업이 중시되며 여러 사람이 함께 작업을 하고, 코드가 점점 거대화 되면서 속성과 행위의 연관 여부를 바로 알아내기 힘들어졌다
    • 이에 대한 대책으로 이들을 하나의 개념으로 묶어서 표현하자는 개념인 객체지향 프로그래밍이 등장하게 된다



객체지향 프로그래밍

*객체(object)를 주된 관심(Oriented)으로 삼는 프로그래밍 방법론

  • 컴퓨터 프로그램을 어떤 데이터를 입력받아 순서대로 처리하고 결과를 도출하는 명령어들의 목록으로 보는 시각에서 벗어나 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임
    ex) 수 많은 부품들의 결합과 연결로 하나의 완전한 자동차가 만들어진다
  • Bottom-Up 방식을 지향
    • 어떤 프로그램의 일부분에 해당하는 작은 부품, 즉 객체를 먼저 만들고 이렇게 만들어진 여러 객체들을 조립해서 하나의 완성된 프로그램을 만드는 프로그래밍 방법론
  • 장점
    • 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다
      • 컴퓨터 부품을 갈아 끼울 때, 해당하는 부품만 쉽게 교체하고 나머지 부품들을 건드리지 않아도 되는 것처럼 소프트웨어를 설계할 때 객체 지향적 원리를 잘 적용해 둔 프로그램은 각각의 부품들이 각자의 독립적인 역할을 가지기 때문에 코드의 변경을 최소화하고 유지보수를 하는 데 유리하다
    • 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현할 수 있다




💡 객체(object)란?

  • “모든 실재(實在)하는 대상”을 객체 지향 프로그래밍 언어에서는 객체라고 부른다 ex) 사물, 사상, 철학, 개념, 공식
  • 객체 지향 프로그래밍에서는 이와 같은 각각의 객체를 추상화시켜 속성(state)기능(behavior)으로 분류한 후에 이것을 다시 각각 변수(variable)함수(function)로 정의하고 있다






객체지향 프로그래밍의 4가지 특징


1. 추상화 (Abstraction)

  • 중요한 부분을 강조하기 위해 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현하는 것
  • 객체 지향 프로그래밍에서 의미하는 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는것
  • 인터페이스(interface)
    • 역할과 구현의 분리
      • 객체의 역할만을 정의하여 객체들 간의 관계를 보다 유연하게 연결하는 역할을 담당
      • 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계하는 것

2. 캡슐화 (Encapsulation)

  • 정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것
  • 목적
    • 외부로부터 클래스에 정의된 속성과 기능들을 보호한다
    • 필요한 부분만 외부로 노출될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을 안전하게 지킨다
  • 구현 방법
    • 외부에서 접근할 필요 없는 것들은 접근 지정자를 private으로 두어 접근에 제한을 둔다

🎈 객체 각각은 독립적으로 작용할 수 있도록 응집도는 강해야 하고 다른 모듈을 참조하는 결합도는 낮아야 한다!


3. 상속 (Inheritance)

  • 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종
  • 클래스 간 공유될 수 있는 속성과 기능들을 부모 클래스로 추상화 시켜 해당 부모 클래스로부터 확장된 여러 개의 자식 클래스들이 모두 부모 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다
    • 재사용 용이
    • 반복적인 코드를 최소화
  • 클래스 상속
    • 상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적는다
    • 자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야한다
    • 각각의 클래스의 맥락에 맞게 메서드 오버라이딩(method overriding)을 사용하여 기능을 재정의할 수도 있다. ( @Override )

public Class Parent{ .... }; // 부모 클래스
public Class Child extends parent { .... }; // 자식 클래스



🍞 추상화 vs 상속

추상화 상속
부모 클래스-자식 클래스의 관계를 전제하면서 공통적인 속성과 기능을 공유한다.
인터페이스를 통한 구현은 반드시 인터페이스에 정의된 추상 메서드의 내용이 하위 클래스에서 정의되어야 한다. (강제) 부모 클래스의 속성과 기능들을 하위 클래스에서 그대로 받아 사용하거나 오버라이딩을 통해 선택적으로 재정의하여 사용한다
인터페이스를 사용하는 구현에 비해 추상화의 정도가 낮다



4.다형성 (Polymorphism)

  • 사전적 의미: 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질
    예) 어떤 중년의 남성이 있다고 했을 때 그 남자의 역할이 아내에게는 남편, 자식에게는 아버지, 부모님에게는 자식, 회사에서는 회사원, 동아리에서 총무 등 상황과 환경에 따라서 달라진다.
  • 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성
    • 메서드 오버라이딩 (method overriding): 같은 이름의 메서드가 상황에 따라 다른 역할을 수행하는 것
    • 메서드 오버로딩(method overloading): 하나의 클래스 내에서 같은 이름의 메서드를 여러 개 중복하여 정의하는 것
  • 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것
    • 다형성을 활용한 객체 생성 방식에서는 자식 클래스의 객체를 생성하여 자식 클래스 타입의 참조변수에 할당해준다

    • 넓은 범위의 타입, 즉 부모 클래스 타입의 참조 변수로 그것과 관계있는 자식 클래스들을 참조할 수 있다


    	public static void main(String[] args) {
    		
           // 1. 기존 객체 생성 방식
           // 자식 클래스의 객체를 생성하여 자식 클래스 타입의 참조 변수에 할당
           
               Bread bread = new Bread();
               Cookie cookie = new Cookie();
           	
          // 2. 다형성을 활용한 객체 생성 방식
          // 자식 클래스 객체를 생성하여 부모 클래스 타입의 참조 변수에 할당
        
          	Food bread2 = new Bread();
           
    		}







출처
객체지향 프로그래밍 제대로 이해하기
[객체지향] Object-Oriented Programming 핵심 개념의 이해
비구조적 프로그래밍과 구조적 프로그래밍
객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화

profile
💻 ⚾️ 🐻

0개의 댓글