[SEB_FE_45] 2023.05.11 / 객체 지향 프로그래밍

Kay·2023년 5월 11일
0

📖 [강의 내용 및 개념 정리]
목차

  • 객체지향
  • 절차 지향 프로그래밍과 객체 지향 프로그래밍
  • 객체 지향 프로그래밍의 네가지 기본 개념

객체지향

메서드 호출 실습하기

메서드는 객체에 정의된 함수를 의미하며, 객체.메서드()로 호출할 수 있다.

⚠️ 메서드 호출 방식을 이용할 때에는 화살표 함수를 쓰지 않습니다. 그 이유는 mdn 화살표 함수 설명에서 찾을 수 있습니다.
(이에 대해 더 자세히 설명을 작성한 글 🤿 (10) 자바스크립트 - this)

용어 정리

  • 객체: 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음
  • class: 객체를 생성하기 위한 템플릿(붕어빵틀로 주로 비유된다.)
  • instance: 객체를 실체화한 것. 즉 프로그램 코드 상에서 자료형이 임의의 클래스로 선언된 식별자는 '객체'라 하고, 코드 컴파일 후 프로그램이 실행될 때 해당 객체가 메모리에 적재되면 '인스턴스’ (붕어빵틀에서 만들어진 붕어빵들로 주로 비유된다.)
  • prototype: 모델의 청사진을 만들 때 쓰는 원형 객체(original form)
  • contructor: 인스턴스가 초기화될 때 실행하는 생성자 함수
  • this: 함수가 실행될 때, 해당 scope마다 생성되는 고유한 실행 context
    (new 키워드로 인스턴스를 생성했을 때는, 해당 인스턴스가 this의 값이 됨)

클래스와 인스턴스

클래스에 대한 더 자세한 글
🤿 (11) 자바스크립트 - class
ES6 이전 함수로 클래스 정의하기

function Car(brand, name, color) {
  	// 속성 정의
	this.brand = brand;
  	this.name = name;
  	this.color = color;
}

// 메서드 정의
Car.prototype.drive = function () {
	//
}

// 인스턴스에서의 사용
let avante = new Car('hyundai', 'avante', 'black');
console.log(avante.name); // anvante

ES6 이후 클래스로 클래스 정의하기

class Car {
  	// 속성 정의
	constructor(brand, name, color) {
    	this.brand = brand;
      	this.name = name;
      	this.color = color;
    }
  
  	// 메서드 정의
  	drive() {
    	//
    }
}

// 인스턴스에서의 사용
let avante = new Car('hyundai', 'avante', 'black');
console.log(avante.name); // anvante

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

프로그래밍 언어

  • 기계어 → 어셈블리어(니모닉 기호) → 고급 언어 → 인공지능 언어

절차 지향적 언어 → 객체 지향적 언어

[절차(Procedural) 지향적 언어]

  • 프로시저(Procedural): 루틴, 서브루틴, 메소드, 함수 등
  • 프로그램이라는 큰 문제를 해결하기 위해 그것을 몇개의 작은 문제들로 나누어 해결하기 때문에 하향식(Top-down) 방식
  • 장점: 프로시저를 이용하여 프로그래밍을 하게 되면 기본적으로 함수를 통해 코드의 재활용성이 높아짐
  • 단점: 코드를 그냥 쓰는 것(인라인)보다 적어도 네 번의 메모리 접근을 더 요구하고, 인자를 전달하는 경우 적어도 인자의 개수만큼 의 메모리 접근을 추가적으로 필요로 하는 등 매우매우매우 많은 시간과 자원을 잡아먹음

[객체 지향적 언어]

  • 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식
  • 큰 문제를 작게 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법

객체 지향 프로그래밍의 네가지 기본 개념

캡슐화

속성과 메서드를 하나의 단위로 묶는 것

  • 속성과 메서드를 따로 정의하는 것이 아닌 하나의 객체 안에 넣어서 묶는 것, 즉 느슨하게 결합되는 것을 의미

느슨한 결합(Loose Coupling)에 유리: 언제든 구현을 수정할 수 잇음

  • 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합

은닉화: 내부 데이터나 내부 구현이 외부로 노출되지 않도록 함

  • 내부 메서드의 변경이 일어나더라도 노출된 메서드를 사용하는 코드 흐름은 바꾸지 않게 할 수 있음
  • 따라서 내부 데이터 접근을 제어하기 위해 setter, getter 함수를 철저하게 나누기도 함

추상화

불필요한 속성을 제거 → 중요 정보 → 클래스 표현

참고) 캡슐화가 코드나 데이터 은닉에 포커스가 맞춰져 있다면, 추상화는 클래스를 사용하는 사람이 필요하지 않은 메서드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있음

상속

슈퍼 클래스와 서브 클래스의 관계
서브 클래스는 상위 객체를 확장해서 추가 가능

  • 상속 대상: 필드와 메소드
  • 효과: 상위 객체 재사용, 반복 코드 중복 줄임, 유지 보수 편리성, 객체 다형성 구현, 캡슐화를 유지하면서도 클래스의 재사용이 용이하도록 함
  • 오버라이딩(overriding): 기능의 일부분을 변경해야 할 경우 자식 클래스에서 상속받은 그 기능만을 수정해서 다시 정의

- 다형성

클래스 상속 관계 이용: 다양한 객체 대입 (부모 타입, 인터페이스 타입)
효과: 객체 부품화, 유지 보수 용이

객체 지향 프로그래밍 장점 요약

  • 캡슐화는 코드가 복잡하지 않게 만들고, 재사용성을 높임
  • 추상화는 마찬가지로 코드가 복잡하지 않게 만들고, 단순화된 사용으로 변화에 대한 영향을 최소화
  • 상속 역시 불필요한 코드를 줄여 재사용성을 높임
  • 다형성으로 인해 동일한 메서드에 대해 if/else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능

0개의 댓글