hongcheol / CS-study

cs지식을 정리하는 공간
MIT License
248 stars 30 forks source link

OOP #117

Open KimDaBin opened 3 years ago

KimDaBin commented 3 years ago

OOP

OOP(Object Oriented Programming)란?

OOP란 객체 지향 프로그래밍 즉, 절차 지향 프로그래밍이 아닌 객체의 관점에서 프로그래밍을 한다는 것이다.


프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.


절차 지향 프로그래밍 VS 객체 지향 프로그래밍


OOP의 기본 구성 요소

붕어빵 틀 = 클래스, 붕어빵의 실체 = 인스턴스, 붕어빵 한 마리 = 객체, 굽기() = 인스턴스화


클래스(Class)

객체(Object)

인스턴스(Instance)


OOP의 장/단점

장점 👍

단점 👎


OOP의 특징

  1. 추상화 (Abstraction)
  2. 캡슐화 (Encapsulation)
  3. 상속(재사용성) (Inheritance)
  4. 다형성 (Polymorphism)


1. 추상화

어떤 영역에서 필요로 하는 속성이나 행동을 추출하는 작업



인터페이스

추상 클래스


2. 캡슐화

하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것

따라서 클래스를 만들 때 사용할 변수와 그 변수를 가지고 특정한 액션, 즉 메소드를 관련성 있게 클래스에 구성해야한다.


정보은닉


정보은닉이 왜 필요할까?

응집도(Cohesion) : 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타낸다.
결합도(Coupling) : 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지를 나타낸다.


캡슐화 -> 정보은닉 (private, getter, setter) -> 높은 응집도, 낮은 결합도


3. 상속

상속이란 기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념이다.

기존 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 준다.


상속의 장점 👍

상속의 단점 👎


해결책

  1. 객체 조립(컴포지션)을 사용한다.

    • 필드에서 다른 객체를 참조하는 방식으로 구현된다.
  2. 상속은 IS-A 관계가 성립하고, 재사용 관점이 아닌 기능의 확장 관점일 때 사용한다.


4. 다형성

다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다.

다형성을 구현하는 방법은 대표적으로 오버로딩, 오버라이딩이 있다.


오버로딩 (Overloading)

같은 이름의 메소드를 사용하지만 메소드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념

오버로딩이 가능하려면 메소드끼리 이름은 같지만 매개변수의 갯수나 데이터 타입이 다르면 오버로딩이 적용


public class OverloadingTest{

  public void test(){
    System.out.println("사용자 없음");
  }

  public void test(String name){
    System.out.println("사용자 이름 = " +name);
  }

  public void test(String name, int money){
    System.out.println("사용자 이름 = "+name+" , 사용료 = "+money);
  }

  // 리턴 타입이 다르므로 오버로딩 적용 X
  public String test(String name){
    System.out.println("사용자 이름 = " +name);
    return name;
  }
}


오버라이딩 (Overriding)

부모 클래스에서 상속받은 자식 클래스에서 부모클래스에서 만들어진 메소드를 자식 클래스에서 다시 재정의해서 사용하는 것을 말한다.

public class Employee{

  public String name;
  public int age;

  public void print(){
    System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
  }
}

// Emplyee 상속
public class Manager extends Employee{

  String jobOfManage;

  // Employee의 print() 메소드 오버라이딩
  public void print(){
    System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
    System.out.println("관리자 "+this.name+"은 "+this.jobOfManage+" 담당입니다.");
  }
}


KimDaBin commented 3 years ago