728x90

개념

SOLID 원칙 중 개방폐쇄의 원칙에 따라 확장에 대해서는 개방적이고 변경에 대해서는 폐쇄적으로

기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 고안된 디자인 패턴이다.

 

변경될 것(전략)과 변하지 않는 것을 구분하여 두 모듈이 만나는 지점에 인터페이스를 정의해

인터페이스에 의존하도록 코드를 작성한다.

 

전략 패턴을 이용하는 역할을 수행하는 컨텍스트가 필요에 따라 구체적인 전략을 바꿀 수 있도록

의존관계를 주입하며, 전략은 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 호출할 수 있게

하며, 콘크리트 전략은 전략을 실제로 구현한 클래스를 의미한다.

 

장점

  1. 알고리즘을 캡슐화해 실행 중에 동적으로 바꿀 수 있다.
  2. 새로운 변경이 기존의 코드에 영향을 미치지 않는다.
  3. 전략은 독립적으로 사용될 수 있어, 다른 클래스에서도 재사용할 수 있다.
  4. 독립적이기 때문에 테스트가 용이하다.
  5. 의존관계를 역전시켜 확장성 있는 코드를 만들 수 있다.
  6. 각 알고리즘을 별도의 클래스로 분리하여 코드를 읽기 쉽고 유지보수가 용이하다.

 

단점

  1. 전략 패턴을 사용할 때마다 새로운 구현 클래스를 만들어야 한다.
  2. 전략 패턴을 사용하기 위해 의존성을 주입해야 하기 때문에 과한 의존 관계가 형성 될 수 있다.
  3. 구현이 어려워 적절한 분석과 설계가 필요하다.
  4. 런타임 시에 알고리즘을 선택하기 때문에 추가적인 오버헤드가 발생할 수 있다.
  5. 추가적인 클래스와 인터페이스가 필요해 코드가 복잡해질 수 있다.

 

사용하는 이유

if (분기1) {

} else if (분기2) {

} else if (분기3) {

} else if (분기4) {
	// 만약 이 중간에 새로운 분기를 추가하거나
   	// 분기가 수십 수백가지라면?
} else if (분기5) {

} else if (분기6) {

} else if (분기7) {

}
...
else {

}

 

조건문을 사용한 분기처리는 변경과 확장 시 코드가 복잡해지고 수정이 불편하고 실수가 발생할 확률이 높다.

= 유지보수에 유리하지 않다.

 

알고리즘의 변경이 빈번한 경우에 전략 패턴을 사용해 효율적으로 적용할 수 있다.

 

예시

interface Strategy {
	do();
}
class ConcreteStrategyA implements Strategy {
	do();
}

class ConcreteStrategyZ implements Strategy {
	do();
}

...

class ConcreteStrategyZ implements Strategy {
	do();
}
class Context {
    Strategy strategy;

    void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
	
    void do() {
        this.strategy.do();
    }
}

 

전략의 추상화와 이를 구현한 다양한 전략 구현 클래스

그리고 전략을 등록하고 실행하는 컨텍스트로 이루어져 있다.

 

기타

템플릿 메소드 패턴과의 차이점

  1. 전략 패턴은 컴포지션 방식을 템플릿 메소드 패턴은 상속을 사용한다.
  2. 전략 패턴은 알고리즘 자체를 캡슐화 한다면 템플릿 메서드 패턴은 알고리즘의 일부 단계만 변경한다.
  3. 전략 패턴은 실행 중에 동적으로 알고리즘 교환이 가능하지만 템플릿 메소드 패턴은 고정되어 있다.

 

'CS' 카테고리의 다른 글

CPU 작동 원리  (1) 2023.10.09
고정 소수점과 부동 소수점  (0) 2023.10.09
ARM 프로세서  (0) 2023.10.09
728x90

컴퓨터에서 인간의 두뇌 역할을 수행하는 부분으로

연산 장치, 제어 장치, 레지스터로 구성된다.

 

연산 장치 (산술 논리 연산 장치)

산술 및 논리 연산을 수행하는 장치로

레지스터에서 연산에 필요한 데이터를 가져오고, 결과를 레지스터에 보낸다.

 

제어 장치

명령어가 순서대로 실행되게 제어하는 장치로

주기억장치에서 명령어를 꺼내 해독한 후에, 결과에 따라 명령어 실행에 필요한

제어 신호를 기억 장치, 연산 장치, 입출력 장치로 보내며

해당 장치들이 보낸 신호를 받아 다음 동작을 결정한다.

 

레지스터

고속 기억 장치로 명령어 주소, 코드, 연산에 필요한 데이터, 연산 결과 등을

임시로 저장하는 장치로 용도에 따라 범용/특수 목적 레지스터로 구분된다.

  • 범용 레지스터 : 연산에 필요한 데이터 혹은 결과를 임시 저장
  • 특수 목적 레지스터 : 특별한 용도로 사용하는 레지스터
    • MAR(메모리 주소 레지스터) : 읽기와 쓰기 연산을 수행할 주기억장치의 주소 저장
    • PC(프로그램 카운터) : 다음에 수행할 명령어 주소 저장
    • IR(명령어 레지스터) : 현재 실행 중인 명령어 저장
    • MBR(메모리 버퍼 레지스터) : 주기억장치에서 읽어온 데이터 혹은 저장할 데이터 임시 저장
    • AC(누산기) : 연산 결과 임시 저장

 

CPU의 동작 과정

  1. 입력장치(입력받은 데이터) OR 보조기억장치(저장된 프로그램)  >>  주기억장치
  2. 주기억장치(프로그램의 명령어와 데이터)  >>  CPU
  3. CPU가 프로그램 실행 후 처리 결과를 주기억장치에 저장
  4. 주기억장치가 처리 결과를 보조기억장치에 저장하거나 출력장치로 보냄
  5. 제어장치가 위의 과정에서의 명령어들을 순서대로 실행되게 제어

 

명령어 세트

연산 코드(실행할 연산)와 피연산자(필요한 데이터 혹은 저장 위치)로

이루어진 CPU가 실행할 명령어의 집합

 

연산 코드 : 연산, 제어, 데이터 전달, 입출력 기능을 가진 코드

피연산자 : 주소, 숫자, 문자, 논리 데이터 등을 저장

 

명령어 사이클

CPU는 프로그램을 실행하기 위해 주기억장치에 있는 명령어를

순차적으로 인출한 후에 해독하고 실행하는 과정을 반복하며

이렇게 명령어를 인출하여 실행하는 활동을 명령어 사이클이라 함

 

인출(fetch)/실행(execution)/간접/인터럽트(interrupt) 사이클로 나누어진다.

 

fetch : CPU에서 명령어를 읽는 단계

execution : CPU가 명령어를 실행하는 단계로 연산 코드 해독, 피연산자 해독(간접 사이클)을 수행

interrupt : 프로그램 실행 중 예외 상황이 발생해 처리가 필요한 경우 예외 발생을 알려 주는 단계

 

코드로 표현하면 아래와 비슷하다.

for (int i = 0; i < 주소수; i++) {
	MAR = PC[i];
    MBR = 주기억장치.명령어인출();
    try {
    	명령어 연산 코드 해독
        명령어 피연산자 해독
        실행
    } catch (실행 중 예외 발생) {
    	예외 발생 알림
    }
}

'CS' 카테고리의 다른 글

[디자인 패턴] 전략 패턴  (0) 2024.02.26
고정 소수점과 부동 소수점  (0) 2023.10.09
ARM 프로세서  (0) 2023.10.09
728x90

컴퓨터에서 실수를 표현하는 방식은 고정/부동 소수점 방식이 있다.

 

고정 소수점

말 그대로 소수점이 찍힐 위치를 미리 정해두고 소수를 표현하는 방식으로

부호(+, -)와 정수부, 소수부를 사용해서 표현한다.

 

 

실수를 정수부와 소수부로 나누어 표현하여 정확하고 단순하지만

표현의 범위가 적다는 단점이 있다.

 

부동 소수점

고정 소수점과 반대로 지수의 값에 따라 소수점이 움직인다.

 

 

정수부와 소수부가 아닌 지수부가수부로 표현하며

지수는 크기를 표현하며 가수의 어느 지점에 소수점이 있는지를 나타내고

가수는 실수의 실제값을 표현한다.

 

표현의 범위가 넓다는 장점이 있지만 오차가 발생할 수 있다.

'CS' 카테고리의 다른 글

[디자인 패턴] 전략 패턴  (0) 2024.02.26
CPU 작동 원리  (1) 2023.10.09
ARM 프로세서  (0) 2023.10.09
728x90

프로세서

메모리에 저장된 명령어들을 실행하는 유한 상태의 오토마톤

 

오토마톤

일련의 상태와 규칙으로 구성된 추상적인 모델로

주어진 입력에 따라 상태를 전이하고 결과를 출력하는 역할

 

유한 오토마톤은 주로 문자열 인식, 정규 표현식, 언어 인식 등에 사용

 

ARM (Advanced RISC Machine)

진보된 RISC (Reduced Instruction Set Computing, 감소된 명령 집합 컴퓨팅) 기기로

단순한 명령 집합을 가진 프로세서가 복잡한 명령 집합을 가진 프로세서 보다

더 효율적이기 때문에 저전력이고 단순화된 CPU 명령체계를 가지는 기기를 뜻한다.

 

구조

 

ARM은 칩의 기본 설계 구조만 만들고, 실제 기능 추가 및 최적화는 반도체 제조사의 영역으로

자바로 비유하면 인터페이스와 구현 클래스의 관계다.

 

설계는 같아도 명령 집합이 모두 달라 제조사별로 서로 다른 칩이 만들어지기 때문에

물리적 설계 베이스가 같지만 용도가 다른 다양한 논리적 구조인 명령 집합으로 구성

제품군을 사용할 수 있다.

 

아키텍처는 명령어가 많고 복잡할수록 물리적인 칩 구조도 크고 복잡해지지만

ARM은 RISC 설계 기반으로 하여 명령 집합과 구조 자체가 단순하기 때문에

ARM 기반 프로세서는 더 작고 효율적이지만 상대적으로 느리다.

 

각각의 명령 집합이 단순하기 때문에 적은 수의 트랜지스터만 필요하여

간결한 설계과 작은 크기를 가능하게 한다.

 

이러한 장점 때문에 전력 소모가 낮고 크기가 작아

스마트폰과 태블릿 PC 같은 모바일 기기에 많이 사용된다.

 

장단점

ARM을 위해 개발된 프로그램은 ARM 프로세서가 탑재된

기기에서만 사용가능 하다는 단점이 있지만

하나의 ARM 기기에 동작하는 운영체제는 다른 ARM 기반 기기에서도 동작된다.

(하나의 인터페이스로 여러 구현체를 만들 수 있는 것과 비슷하다.)

'CS' 카테고리의 다른 글

[디자인 패턴] 전략 패턴  (0) 2024.02.26
CPU 작동 원리  (1) 2023.10.09
고정 소수점과 부동 소수점  (0) 2023.10.09

+ Recent posts