위클리 페이퍼

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

sgyeon 2025. 1. 31. 17:22
반응형
SMALL

1️⃣ 절차지향

  • 말 그대로 위에서 아래로 프로그램이 유기적으로 연결되도록 순차적인 처리를
    하는 방식입니다.
  • 보통 실행 속도가 빠르며 시간적 유리함을 가진다는 것이 특징입니다.
  • 다만 유지 보수가 어렵고 실행 순서가 정해져 있어 순서를 바꾸거나 수정 시
    결과값이 달라질 수 있고 그에 따라 디버깅이 어렵습니다.

2️⃣ 객체지향

  • 실제 세계를 모델링하여 소프트웨어를 개발하는 방법.
  • 즉, 프로그래밍에서 필요한 데이터를 추상화 시켜상태와 행위를 가진
    객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는
    프로그래밍 방법입니다.

 

객체 지향 프로그래밍은 크게 추상화 , 캡슐화 , 상속 , 다형성 
네가지 특징을 가집니다.


 

1. 추상화

  • 중요한 기능만 노출, 구현에 관한 세부 사항은 숨김
    즉, 불필요한 정보는 숨기고 중요한 정보만 표시
  • 장점
    • 다른 객체들은 노출된 속성, 기능만 신경쓰면 됨
    • 객체들 사이의 의존성이 낮아짐
    • 유연하게 개발이 가능함

ex)

|    Class: Singer     |    Object: Dean, Crush, Zion.T    |

|    Class: Game     |    Object: Lol, BattleGround, Overwatch    |

 

추상화를 통한 큰 카테고리 안에 부속을 자유롭게 넣을 수 있는 특징

 

 

2. 캡슐화

  • 추상화된 객체 내부에 접근하지 못하도록 막는 것 ( = 정보은닉의 특성 )
  • 장점
    • 개발자의 실수를 방지 할 수 있음
    • 안정성 높은 코드 개발이 가능함
  • Getter와 Setter를 통해 특정 프로퍼티의 수정이나 접근을 제한
    • ex) 코드 예시
class Customer	{
  #name; // 프라이빗 속성으로 외부에서 직접적인 접근 불가

  constructor(name)  {
    this.#name = name; // 생성자를 통한 초기화
  }

  // Getter: 외부에서 name 속성에 접근할 때 사용
  get name()  {
    return this.#name;
  }

  // Setter: 외부에서 name 속성을 변경할 때 사용
  set name(regName)  {
    if (regName.length > 0) { // 유효성 검사
      this.#name = regName;
    } else {
      console.log("이름을 입력해주세요.");
    }
  }
}

// 객체 생성
const customer = new Customer("김삿갓");

// Getter를 사용하여 name 읽기
console.log(customer.name); // 출력: 김삿갓

// Setter를 사용하여 name 변경
customer.name = "이상";
console.log(customer.name); // 출력: 이상

// 유효성 검사 시도
customer.name = ""; // 출력: 이름을 입력해주세요.
console.log(customer.name); // 출력: 이상

 

 

3. 상속

  • 하위 클래스가 상위 클래스의 프로퍼티와 메소드를 물려받는 것
  • 클래스 이름 옆에 `extends` 키워드 사용
  • 장점
    • 코드 재사용성이 좋아짐
    • ex) 코드 예시
// 상위 클래스
class Singer  {
	constructor(name, songName)  {
    this.name = name;
    this.songName = songName;
    }
    
    callArtist()  {
    	console.log(`${this.name}의 노래 ${this.songName} 입니다.`);
    }
}

// 하위 클래스
class Genre extends Singer  {
	constructor(name, songName, genre)  {
    super(name, songName);  // 상위 클래스의 생성자를 호출
    this.genre = genre;	  // 추가 속성
    }
    
    callGenre()  {
    	console.log(`${this.name}의 노래 중 ${this.songName}의 장르는 ${this.genre} 입니다.`);
    }
}

// 객체 생성
const explainGenre = new Genre("Crush", "NAPPA", "Hiphop R&B");

// 메서드 호출
explainGenre.callArtist();  //Crush의 노래 NAPPA 입니다.
explainGenre.callGenre();  //Crush의 노래 중 NAPPA의 장르는 Hiphop R&B 입니다.

 

 

4. 다형성

  • Polymorphism
  • 하나의 요소에 여러 개념을 넣어 놓는 것 (여러 의미로 해석 될 수 있는 것)
  • 장점
    • 코드의 재사용성, 확장성이 좋아짐
    • 특정 하위 클래스에 대한 의존성이 낮아짐
  • 오버라이딩: 상위 클래스의 메소드와 같은 이름의 메소드를 하위 클래스에서
    다르게 구현하는 것
  • 오버로딩: 같은 이름의 메소드가 형태( 매개변수의 개수, 타입 )에 따라 다른
    기능을 하는 것
    • ex) 코드 예시
// 부모 클래스
class Game {
  output() {
    console.log("게임을 시작합니다.");
  }
}

// 자식 클래스
class StarCraft extends Game {
  output() {
    console.log("스타크래프트를 실행합니다.");
  }
}

class BattleGround extends Game {
  output() {
    console.log("배틀그라운드를 실행합니다.");
  }
}

// 객체 생성
const mystarCraft = new StarCraft();
const mybattleGround = new BattleGround();

// 다형성: 동일한 메서드 호출, 다른 동작
mystarCraft.output();  // 출력: 스타크래프트를 실행합니다.
mybattleGround.output();  // 출력: 배틀그라운드를 실행합니다.

 


 

 

마지막으로 객체지향 프로그래밍과 절차지향 프로그래밍의 차이점을
표로 정리하고 마치겠습니다.

구분 객체지향 프로그래밍
(OOP)
절차지향 프로그래밍
구조 클래스와 객체 중심적 함수와 절차 중심적
재사용성 높음
(상속과 다향성 등의 특징)
낮음
속성 및 사용처 복잡한 시스템이나
규모가 큰 프로젝트에
적합함
간단한 프로그램
유지보수 업그레이드와
디버깅이 쉬움
유지 보수와
디버깅이 어려움
속도 느리고 설계 시간이 긴 편 빠름

 

부족한 내용이 있을 수 있습니다. 언제든지 코멘트 남겨주시면 감사하겠습니다.

이상입니다.

반응형
LIST