728x90
반응형
SMALL

단일 책임 원칙

Single Responsibility Principle, SRP

“어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다” - 로버트 C. 마틴

'하나의 객체는 단 하나의 책임을 가져야 한다'

왜? 객체는 꼭 하나의 책임을 가져야 하는 걸까요?

 

단 하나의 책임을 갖는 객체

위 원칙을 이해하기 위해 한번 우리 사람을 대상으로 생각해 보겠습니다.

한번 생각해 본적 있나요? 우리가 살아가는데 얼마나 많은 역할 및 책임을 다하고 있는지를?

저만 예를 들어봐도 아들, 남동생, 개발자, 친구, 예비군, 남자친구(?)... 아무튼 셀수 없이 많은 역할 및 책임을 가지고 있습니다.

그럼 저를 클래스화 해볼까요?

class 사람속성 : 성별, 나이, 주민번호, 주소...기능 : 효도하기, 안부묻기, 코드 리뷰하기, 등산하기, 게임하기, 훈련하기, 데이트하기...

만약 제가 예비군 훈련을 하다 다리를 다치거나 혹은 여자친구와 헤어졌다면?

그 여파가 모든 기능에 영향을 미치지 않을까요?

따라서 회사-개발자, 국방부-예비군, 여자친구-남자친구 이런식으로 개발자 클래스, 예비군 클래스, 남자친구 클래스와 같이 역할과 책임을 클래스별로 분리하여 연관이 있는 클래스와 각각 따로 관계를 맺는 것이 서로 영향을 미치지 않아서 좋지 않을까요?

 

단일 책임 원칙을 위반한 계산기

원칙 위반 증상

기능 변경이 발생했을 때 연쇄적으로 코드를 수정해야 합니다.기능이 너무 복잡해서 재사용하기 어렵습니다.메서드의 크기가 비대해 집니다.

public class Calculator {

    public int calculate(String operator, int firstNumber, int secondNumber) {
        int answer = 0;

        if(operator.equals("+")){
            answer = firstNumber + secondNumber;
        }else if(operator.equals("-")){
            answer = firstNumber - secondNumber;
        }else if(operator.equals("*")){
            answer = firstNumber * secondNumber;
        }else if(operator.equals("/")){
            answer = firstNumber / secondNumber;
        }

        return answer;
    }
}
public class Client {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        int firNum = 140;
        int secNum = 60;

        String operator = "+";
        int answer = calculator.calculate(operator, firNum, secNum);
        System.out.println(operator + " answer = " + answer);

        operator = "-";
        answer = calculator.calculate(operator, firNum, secNum);
        System.out.println(operator + " answer = " + answer);

        operator = "*";
        answer = calculator.calculate(operator, firNum, secNum);
        System.out.println(operator + " answer = " + answer);

        operator = "/";
        answer = calculator.calculate(operator, firNum, secNum);
        System.out.println(operator + " answer = " + answer);
    }
}

Calculator 에게 주어진 책임과 역할이 너무 큽니다.

각각의 연산자의 연산 과정에 변화가 생겼을 때 calculate 메서드의 크기가 비대해 지거나 다른 연산 과정에 영향을 미칠 수 있습니다.

원칙 적용 방법

더하기, 빼기, 곱하기, 나누기 연산을 기능별로 연산 클래스를 구현합니다.

계산기 클래스는 계산을 진행할 때 연산 클래스들을 이용합니다.

AddOperation : +operate : 메서드

SubstractOperation : -operate : 메서드

MultiplyOperation : *operate : 메서드

DivideOperation : /operate : 메서드

 

728x90
반응형
LIST

'개발 > JAVA' 카테고리의 다른 글

리스코프 치환 원칙  (0) 2023.01.27
개방-폐쇄 원칙  (0) 2023.01.27
SOLID  (0) 2023.01.27
변수의 종류  (0) 2023.01.20
변수의 초기화  (0) 2023.01.20
728x90
반응형
SMALL

절차적/구조적 프로그래밍이란?

절차적 프로그래밍

물이 아래로 흐르는 것 처럼 프로그램의 순차적인 처리를 중요시 하며 프로그램 전체가 유기적으로 연결 되도록 개발하는 것을 뜻합니다.

컴퓨터의 작업 처리 방식과 유사하기 때문에 처리 속도가 빨라 시간적으로 유리합니다.

프로그램의 기능을 중심으로 개발이 진행됩니다.

구조적 프로그래밍은 쉽게 표현하자면 '함수를 사용해서 개발' 하는 것을 뜻합니다.

함수를 사용하면 중복 코드를 한 곳에 모아서 관리할 수 있기 때문에 이해하기 쉬운 코드를 작성할 수 있습니다.

그렇다면 객체지향은 무엇일까요?

 

 

객체지향이란?

기존의 구조적 프로그래밍에서 가장 중요한 것은 '함수' 였습니다.

소스코드를 논리적인 단위로 구분하고 분할 해서 개발하여 프로그래밍을 조금 더 편하게 만들어줬습니다.

이에 그치지 않고 개발자들은 더욱더 나아가 '우리가 주변 사물들을 인지하는 것 처럼 프로그래밍을 할 수 있지 않을까?' 라고 생각하기 시작했습니다.

이렇게 시작된 것이 객체지향입니다.

세상에 존재하는 것은 모두 사물 즉, 객체이다.각각의 사물은 고유하다.사물은 속성을 갖는다.사물은 행동을 한다.

위처럼 사물을 덩어리로 한번에 크게 이해하기 보다는 분류하여 이해할 수 있도록 시도 하였고 이를 프로그래밍에서 class 라는 표현 방법으로 만들어냈습니다.

책임과 권한을 가진 객체들이 서로 메시지를 주고 받으며 협력하여 필요한 기능을 수행할 수 있도록 프로그램을 개발하는 것을 객체지향 개발이라고 할 수 있습니다.

그렇다면 우리는 객체지향의 개념을 프로그래밍에 녹아냄으로써 무슨 이점을 얻을 수 있었을까요?

객체지향 개발은 복잡한 프로그램을 효과적으로 분해하고 구성할 수 있고, 쉽게 이해하며 효율적으로 다룰 수 있게 도와줍니다.

 

 

객체지향의 4대 특성

캡슐화 : 정보의 은닉상속 : 재사용추상화 : 모델링다형성 : 사용의 편의

객체지향의 특성이 무엇인지 물어본다면 위 4가지로 말할 수 있습니다.

 

캡슐화

객체 내부의 세부적인 사항을 감추는 것을 '캡슐화' 라고 부릅니다.변경하기 쉬운 객체를 만들기 위해 사용됩니다.캡슐화를 통하여 객체 내부의 접근을 제한함으로써 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 좀 더 유연한 객체 설계를 할 수 있습니다.

 

상속

상위 클래스의 특징을 하위 클래스가 물려받아 코드의 중복을 제거하고 코드 재사용성을 증가 시킵니다.각각의 클래스들을 상속 관계로 묶음으로써 클래스 간의 체계화된 구조를 파악하기 쉬워집니다.데이터와 메서드를 변경할 때 상위에 있는 것만 수정하여 전체적으로 일관성을 유지시킬 수 있습니다.

 

추상화

객체에서 공통된 부분을 모아 상위 개념으로 새롭게 선언하는 것을 추상화라고 합니다.공통적이고 중요한 것을 모아 모델링합니다.복잡한 내부 구현에는 신경을 쓰지 않고 외부에 노출되어 있는 인터페이스만을 사용하여 코드를 작성할 수 있습니다. 추상화 -> 추상 클래스 -> 인터페이스 순서로 모델링하여 다형성으로 확장될 수 있도록 설계합니다.

 

다형성

객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러가지 형태로 재구성 되는 것을 의미합니다.동일한 메서드의 이름을 사용하지만 클래스 마다 다르게 구현됨 을 예로 들 수 있습니다.오버로딩, 오버라이딩을 생각하시면 좋습니다.

 

추가 용어 정리

의존성이란?

객체들이 협력을 하는 과정에서 해당 객체들이 다른 객체를 의존하게 됨을 뜻합니다.

어떤 객체가 변경될 때 그 객체에 의존하고 있는 다른 객체도 함께 변경될 수 있음 을 의미합니다.

결합도란?

의존성의 정도를 나타내며 다른 모듈에 대해 얼마나 높은 의존성을 가지고 있는지를 뜻합니다.

객체 사이의 의존성이 높은 경우를 가리켜 결합도가 높다 라고 표현합니다.

반대로 합리적인 수준으로 의존을 하는 경우에는 결합도가 낮다고 표현합니다.

결합도가 높으면 함께 변경될 확률도 높기 때문에 설계를 할 때는 객체 사이의 결합도를 합리적인 수준으로 낮춰 변경에 용이하게 설계하는 것이 좋습니다.

응집도란?

모듈에 포함되어 있는 내부 요소들이 각각 연관되어 있는 관계의 정도를 뜻합니다.

밀접하게 연관된 작업만 수행하고 연관성이 적은 다른 작업은 다른 객체에 위임하는 객체를 가리켜 응집도가 높다고 표현합니다.

객체 스스로가 자신의 데이터를 직접 처리하면 할 수록 응집도를 높일 수 있습니다.

 

객체지향 설계의 5원칙

유지 보수와 확장이 쉬운 프로그램을 만들기 위한 객체지향 설계의 다섯가지 기본원칙을 뜻합니다.

SRP(Single Responsibility Principle): 단일 책임 원칙

OCP(Open-Closed Principle): 개방-폐쇄 원칙

LSP(Liskov Substitution Principle): 리스코프 치환 원칙

ISP(Interface Segregation Principle): 인터페이스 분리 원칙

DIP(Dependency Inversion Principle): 의존성 역전 원칙

728x90
반응형
LIST

'개발 > JAVA' 카테고리의 다른 글

개방-폐쇄 원칙  (0) 2023.01.27
단일 책임 원칙  (0) 2023.01.27
변수의 종류  (0) 2023.01.20
변수의 초기화  (0) 2023.01.20
변수의 초기화  (0) 2023.01.20
728x90
반응형
SMALL

선언 위치에 따른 변수의 종류

클래스 영역 : 클래스 변수

  • 클래스가 메모리에 올라갈 때 생성됩니다.객체 생성을 하지 않아도 생성되고 언제든지 사용 가능합니다.
  • 접근 방법 : 클래스명.클래스변수명

클래스 영역 : 인스턴스 변수

  • 객체가 생성될 때 인스턴스 변수가 생성됩니다.
  • 접근 방법 : 참조변수명.인스턴스변수명

메서드 영역 : 지역 변수

  • 메서드가 호출 되서 실행될 때 생성됩니다.메서드가 종료되면 자동으로 제거됩니다.
class Obj4_1 {
    int iv;        // 인스턴스 변수
    static int cv; // 클래스 변수(static 변수, 공유 변수)

    void method() {
        int lv;
        lv = 30;
        // 지역변수는 자동으로 초기화가 되지 않기 때문에 사용하려면 반드시 초기화 필요
        System.out.println("lv 지역 변수 = " + lv);
    }
}

class Obj4_1Main {
    public static void main(String[] args) {

        // 클래스 변수 접근 및 사용
        // 접근방법 : 클래스명.클래스변수이름
        Obj4_1.cv = 10;
        System.out.println("ObjVar.cv 클래스 변수 = " + Obj4_1.cv);

        // 인스턴스 변수 생성 및 사용
        // Obj4_1.iv = 20; // Error, 인스턴스를 통해서만 생성 및 사용 가능
        Obj4_1 objVar = new Obj4_1();
        objVar.iv = 20;
        System.out.println("objVar.iv 인스턴스 변수 = " + objVar.iv);

        // 지역 변수 생성 및 사용
        // objVar.lv // Error, 인스턴스로 지역 변수 바로 접근 불가능
        objVar.method(); // 메서드 호출 시 지역 변수 생성
        // 메서드 종료시 지역 변수 삭제
    }
}
728x90
반응형
LIST

'개발 > JAVA' 카테고리의 다른 글

단일 책임 원칙  (0) 2023.01.27
SOLID  (0) 2023.01.27
변수의 초기화  (0) 2023.01.20
변수의 초기화  (0) 2023.01.20
생성자  (0) 2023.01.20

+ Recent posts