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

코공·2020년 12월 9일
0
post-custom-banner

프로그램 언어의 종류

  1. Machine Language
    기계어. 0과 1의 조합으로 만들어진 언어이다. 컴퓨터가 이해하는 언어.

  2. Assembly Language
    기계어를 사람이 이해하고 작성할 수 있도록 만든 간단한 언어.

  3. High-level Language
    우리가 코드를 만들 때 사용하는 언어이다. 여기에는 절차 지향과 객체지향으로 나뉘어 진다. 여기서 우리는 객체지향 OOP를 집중 공부할 것.


OOP의 정의와 개념

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.(위키백과)

너무 어려운 말이다..
여기서 객체란 우리가 javascript에서 사용하는 class, method와 같은 것들이 포함된다.

어떠한 큰 문제를 해결하기 위해, 작은 코드들을 만들고 이를 객체로 만든다. 그 이후, 작은 객체들을 조합하고, 재사용하면서 큰 문제를 해결하는 방식이다.

나중에 코드 예제를 보며 하나씩 이해해보자. 글로는 설명하기 어렵다.


OOP의 장점

  • 코드가 간결해지고, 코드의 재사용이 쉽다.
  • 코드의 유지보수가 쉽다. 클래스 내부의 메소드나, 할당만 바꿔주면 되기 때문.
  • 대형 프로젝트를 할 때 업무 분담하기 좋다.
  • 소프트웨어 공학의 관점에서 볼 때 S/W의 질을 향상하기 위한 강한 응집력과 약한 결합력을 지향할 수 있다.

추가 설명
응집력(cohesion) : 프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를 나타내는 정도. 프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을 응집력이 높다고 표현한다.

결합력(coupling) : 프로그램 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 얼마나 의존적인지를 나타내는 정도. 결합력이 낮다는 것은 한 요소가 다른 요소들과 관계를 크게 맺고 있지 않은 상태를 의미한다.

일은 적당히 하고, 다른 코드들에게 피해를 끼치지 않는 것


OOP의 기본 요소

  • 클래스(Class) - 같은 종류의 집단에 속하는 속성과 행위를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형(user defined data type)이라고 할 수 있다.

_ex) 게임 캐릭터를 만들어 보자. 캐릭터 생성할 때 키, 무게, 머리 색 등을 커스터마이징 할 수 있다. 여기서 캐릭터라는 클래스 안에 키, 무게 머리 색의 속성이 있고, 걷기 뛰기의 행위(기능이 있는 것)

  • 객체(Object) - 클래스의 인스턴스이다. 객체는 자신 고유의 속성을 가지며 클래스에서 정의한 행위를 수행할 수 있다.

_ex) 위 캐릭터 클래스로 만든 당신만의 캐릭터가 객체가 된다.

  • 메서드(Method), 메시지(Message) - 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라 할 수 있다.

_ex) 캐릭터 클래스 안에 새로운 함수 기능을 넣으면 그것이 그 클래스의 매소드다.


OOP의 4가지 특징

캡슐화 (Encapsulation)

변수와 함수를 하나의 단위로 묶는 것을 의미.
기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는것이 캡슐화다.
이를 통해 데이터를 외부에서 직접 접근하지 못하게 막고, 함수를 통해서만 조작이 가능하게 하는 작업.

캡슐화 전
let age = 20;
let name = "Kogong";
let hairColor = "black";
let height = 180;

function character(age, name, hairColor, height) {
return `나이는 ${age} 이름은 ${name} 머리색은 ${hairColor}
키는 ${height} 캐릭터 생성`
}

캡슐화 후

let character = {
    age: 20,
    name : "Kogong",
    hairColor: "black",
    height: 180,
    nextyear: function() { // 이 클래스의 메소드
    this.age++
    },
    create: function() {
        return `나이는 ${this.age} 이름은 ${this.name}
        머리색은 ${this.hairColor} 키는 ${this.height} 캐릭터 생성`
    }
}
   character.create()

이렇게 캡슐화를 하고 나면, 다음에는 class 안에 있는 값만 바꿔서 만들면 된다.
캡슐화를 통해 재사용과 유지보수가 쉽다

추상화 (Abstraction)

자료 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다.

우리는 캐릭터를 조작할 때, 캐릭터의 내부 함수들이나 구조가 어떻게 만들어졌는지는 몰라도, 방향키 등을 통해 조작을 할 수 있다.

객체들이 가진 메소드들을 기준으로 이용자들이 동작만 쉽게 구동할 수 있도록 하는 것.

class character {
    constructor(age, name, hairColor, height) {
        this.age = age;
        this.name = name;
        this.hairColor = hairColor;
        this.height = height;
        this.day = 0;
        this.sleep = function () { //character클래스의 메소드
            this.day++
            if (this.day === 365){ 
                this.age++
                this.day = 0;
             } 
        }
    }
}
kogong = new character(20, "코공", "검은색", 180)
  이렇게 만들면 코공 캐릭터 정보 완성이 된다.
  그 후 사용자가 
  잠자기 kogong.sleep()  // 사용자가 하는 동작
  하는 것이 추상화. 

위에 캐릭터에서 sleep이라는 동작을 만들어 보았다.
내가 만든 캐릭터가 잠을 자고, 하루가 지나고, 365일이 쌓이면 나이를 먹는 과정의 함수 내용은 몰라도
사용자가 잠을 자다보면 나이를 먹는 것은 조작할 수 있다.

kogong.sleep()

요런 것이 추상화이다.

상속 (Inheritance)

상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것을 말한다.
기능의 일부분을 변경해야 할 경우 자식 클래스에서 상속받은 그 기능만을 수정하면 된다.
이러한 작업을 '오버라이딩(Overriding)'이라고 한다. 상속은 캡슐화를 유지하면서도 클래스의 재사용이 용이하도록 해 준다.

예시.
캐릭터를 여러 개 만들다가, 특별한 캐릭터에 추가 기능을 넣고 싶다. 그럴 때 상속 기능을 쓰면 좋다. 위에 class Character는 power가 없지만 추가해보자.

class Jisang extends Character 하면
extends(상속)를 이용해 기존 Character에 있는 속성을 이용이 가능.
새로운 Jisang class에 추가 기능을 넣어보자.

class Character { // 기존 클래스
    constructor(age, name, hairColor, height) {
        this.age = age;
        this.name = name;
        this.hairColor = hairColor;
        this.height = height;
        this.day = 0;
        this.sleep = function () {
            this.day++
            if (this.day === 365){ 
                this.age++
                this.day = 0;
             } 
        }
    }
}

// 
class Jisang extends Character { // 기존 클래스를 상속하며 만든 새로운 클래스
    constructor(age, name, hairColor, height) {
        super(age, name, hairColor, height)
        this.power = 100; // 지상 클래스의 추가 기능
    }
}

let God = new Jisang(20, "Jisang", "red", 185) //
추가 기능이 있는 클래스를 통해 만든 캐릭터.

console.log(God)  // 결과를 보면 Jisang에게만 power가 추가 됨.
Jisang {
  age: 20,           // 상속을 통해 기존 class 정보를 다 가져옴
  name: 'Jisang',    // 상속을 통해 기존 class 정보를 다 가져옴
  hairColor: 'red',  // 상속을 통해 기존 class 정보를 다 가져옴
  height: 185,       // 상속을 통해 기존 class 정보를 다 가져옴
  day: 0,            // 상속을 통해 기존 class 정보를 다 가져옴
  sleep: [Function], // 상속을 통해 기존 class 정보를 다 가져옴
  power: 100 }  // 기존 class에는 없던 기능을 추가함.
  

다형성 (Polymorphism)

다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로
오버라이딩(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)이나
오버로딩(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미.

오버라이드

같은 메소드에 다른 기능을 넣는 것.

class Character {
    constructor(age) {
        this.age = age;
        this.day = 0;
        this.sleep = function () {
            this.day++ // 원래는 1씩 늘어나지만
            if (this.day === 365){ 
                this.age++
                this.day = 0;
             } 
        }
    }
}

class Kogong2 extends Character {
    constructor(age) {
        super(age);
        this.sleep = function () {
            this.day += 2; // 요기서 같은 sleep에 2씩 늘어나게 함.
            if (this.day === 365){ 
                this.age++
                this.day = 0;
             } 
        }
    }
}

this.sleep=function() 부분을 오버라이드 했다.

오버로딩

같은 이름의 메소드에 인자의 개수를 다르게 하여 다른 기능을 하는 것.

오버라이드랑 비슷한 개념이다.

profile
코딩하는 공자
post-custom-banner

4개의 댓글

comment-user-thumbnail
2020년 12월 9일

Detail 👍

답글 달기
comment-user-thumbnail
2020년 12월 9일

아니왜 깨우는건없는건데 아 ㅋㅋ

답글 달기
comment-user-thumbnail
2020년 12월 9일

근데 정리 오지게잘햇네이것도

답글 달기
comment-user-thumbnail
2020년 12월 9일

여기 코공이 블로그 맞냐? 졸라 어디까지 성장할 거임

답글 달기