5주차 로그

이태형·2024년 7월 29일

Growth Log

목록 보기
3/18

모듈을 설계하는 부분에서 코드가 많이 복잡해지고, 중복 코드가 많아짐을 느꼈다.
전에는 시간적으로 여유가 있어 많은 고민을 하고, 이것저것 찾아보며 모듈 설계를 해왔지만, 요즘에는 시간이 부족해서 급하게 코드를 짜느라 코드가 많이 더러워졌다. 그래서 객체지향 개념에 대한 전반적인 내용을 다시 공부하기로 했고, 놓쳤던 내용은 없었는지 다시 생각해보는 시간을 갖기로 했다.

추상화

  • 컴퓨터 과학에서 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것
  • 보통 알고는 있지만 정확하게 표현하기 힘든 것들을 중요한 부분이나 특징점을 잡아 설명하는 것
  • 프로그래밍에서 추상화는 클래스를 정의할 때 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것
    • 클래스들의 중요하고 공통된 성질들을 추출하여 부모 클래스를 선정하는 개념과, 이벤트 발생의 정확한 절차나 방법을 정의하지 않고 대표할 수 있는 표현으로 대체하는 것
  • 데이터 추상화와 제어 추상화로 나뉨
  • 추상화라는 개념이 바로 머릿속에 들어오지 않았던 이유는, 프로그래밍을 처음 배울때 ‘설계’가 아닌 ‘사용’ 하는 법을 먼저 배웠기 때문
  • 객체 지향은 설계 이론이지, 사용 이론이 아님

제어 추상화

  • 어떤 클래스의 메소드를 사용하는 사용자에게 해당 메소드의 작동방식과 같은 내부 로직을 숨기는 것
  • 자동차를 운전하는데 운전 동작 ( 시동, 정지, 가속 등) 만 신경 쓰지, 실제 어떻게 연료를 태우는 지등 내부적 동작은 몰라도 됨
  • 내부 동작을 궁금해하고, 그 이해를 필요한 게 아니라, 동작한 결과만 알면 되기 때문에 사용자들이 알 필요가 없음
  • 제어 추상화로 잘 설계가 되면 생산성 증가, 가독성 증가, 에러 감소, 유지보수 시간 단축 등 효과를 얻음

데이터 추상화

  • 데이터 추상화란, 대상을 간단한 개념으로 일반화 하는 과정
    • 삼각형, 사각형, 원이라는 객체가 있을 때, 이들을 하나로 묶을 때 객체들의 공통 특징인 “도형” 으로 묶어 이름을 붙이는 것
  • 객체의 디테일함이 사라지고 공통된 특징만 남게됨

추상화 예제 코드

abstract class 사람 {
	걷기();
}

abstract class 운동선수 extends 사람 {
	달리기();
}

abstract class 축구선수 extends 운동선수 { 
	걷기(); 
    달리기();
	축구선수 특정 운동();
}

abstract class 야구선수 extends 운동선수 {
	걷기();
    달리기();
    야구선수 특정 운동();
}

위 코드와 같이 특정 운동선수 하나만 만들 때는 비효율적으로 보일 수 있지만, 종류가 늘어날 수록 장점
공통 기능을 미리 개발해 두면 기능 상속을 통해 빠르게 구조를 확장 할 수 있음

다형성

  • 같은 자료형에 여러가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질
  • 이를 통해 조상 클래스의 참조 변수로 자손 클래스의 참조 변수를 다루거나, 동일한 이름을 같은 여러 형태의 메소드를 만드는 것
  • 대표적으로 오버로딩, 오버라이딩, 업캐스팅, 다운캐스팅, 인터페이스, 추상메소드, 추상클래스 방법이 모두 다형성에 속함

다형성 예제 코드

class 시계 {
	void showTime() {}
}

class 애플워치 {
	void appAlarm() {}
    void healthcare() {}
}

시계 watch = new 애플워치();

위 인스턴스가 생성된 것을 보면 시계 참조변수에 애플워치 인스턴스가 생성이 되었다. 이렇게 생성이 되는 경우 애플워치에 부가적인 기능을 사용할 수 없을 뿐이지, 시계 본연의 기능인 시간을 보는 기능은 그대로 사용할 수 있다.
그렇다면 기능이 줄어드는 데 이와같이 사용하는 이유는 무엇일까?? 바로 타입묶음을 위해서이다.

다형성을 적용하지 않는 경우, List 에 저장하는 경우가 있을 때 각 타입별로 List 에 저장해줘야 함

class 애플워치 {
} 
class 갤럭시워치 {
}
class 샤오미핏 {
}

ArrayList<애플워치> apple = new ArrayList<>();
apple.add(new 애플워치()); 
apple.add(new 애플워치());

ArrayList<갤럭시워치> galaxy = new ArrayList<>();
galaxy.add(new 갤럭시워치()); 
galaxy.add(new 갤럭시워치());

ArrayList<샤오미핏> fit = new ArrayList<>();
fit.add(new 샤오미핏()); 
fit.add(new 샤오미핏());

다형성을 적용하는 경우, 아래와 같이 적용 가능

class 시계 {} 
class 애플워치 extends 시계{
} 
class 갤럭시워치 extends 시계{
}
class 샤오미핏 extends 시계{
}

ArrayList<시계> watch = new ArrayList<>();
watch.add(new 애플워치()); 
watch.add(new 애플워치());
watch.add(new 갤럭시워치()); 
watch.add(new 갤럭시워치());
watch.add(new 샤오미핏()); 
watch.add(new 샤오미핏());

사용자 입장에서는 저장되는 타입이 어떻게 동작되는지 알 필요가 없으므로 내부적으로 하나의 타입으로 묶어서 저장하면 코드가 더 간단해진다.
또한 메서드의 매개변수로 객체가 사용되는 경우, 타입 묶음으로 각 클래스별로 메서드를 만들 필요 없이 하나의 메서드로 사용이 가능해져 새로운 클래스가 선언되어도 수정할 필요가 없어진다.

캡슐화

  • 변수나 메소드들을 캡슐로 감싸서 안보이게 하는 정보 은닉 개념 중 하나
  • 객체의 속성과 행위를 하나로 묶고, 외부로 부터 내부를 감싸 숨겨 은닉
  • 외부의 잘못된 접근으로 값이 변하는 의도치 않는 동작을 방지하는 보호 효과도 누릴 수 있음
  • Java 에선 private, protect, public 으로 구현

정보은닉

  • 객체지향 언어적 요소를 활용하여 객체에 -대한 구체적인 정보를 노출시키지 않도록 하는 기법
  • 정보은닉 대표 기법 3 가지
    • 객체의 구체적인 타입 은닉 ( 업캐스팅 )
    • 객체의 필드 및 메소드 은닉 ( 캡슐화 )
    • 구현 은닉 ( 인터페이스 & 추상 클래스 )
  • 캡슐화 == 정보 은닉이 아니라, 정보 은닉 기법중 하나가 캡슐화
  • 업캐스팅과 인터페이스 구현 역시 정보 은닉 측면에 포함됨, 부모 클래스 타입으로 통합을 하거나 인터페이스 타입을 사용하는 것 역시 구체적인 클래스 타입을 은닉 함으로써 보다 다형하게 사용할 수 있기 때문
  • 정보 은닉은 보안적인 측면 뿐만 아니라, 은닉되어 알 필요가 없어 덜 알아도 간편하게 사용할 수 있게 해주는 의미도 내포

결합도(의존도)

  • 모듈과 모듈 간의 상호 의존 정도를 의미
  • 결합도가 높은 클래스를 수정하면 연관된 클래스들도 싹 변경해야 할 수도 있어, 유지보수 측면에서 매우 마이너스적인 요소로 작용
  • 객체지향의 관점에서 결합도는 클래스 또는 메서드가 협력에 필요한 적절한 수준의 관계만을 유지하고 있는지를 나타냄
  • 결합도가 낮은 클래스 특징
    • Open Closed Principle 의 원칙을 잘 지킨 클래스 ( 확장에는 열려있고 변경에는 닫힌 클래스)
    • 다형성을 잘 지킨 클래스

자료 결합도 (Data Coupling)

  • 모듈 간의 인터페이스로 전달되는 파라미터(데이터)를 통해서만 상호 작용이 일어나는 경우
  • 가장 결합도가 낮고, 가장 좋은 형태
  • 모듈끼리 단순히 데이터를 주고 받는 경우( 기능 수행에 있어서 로직을 제어하거나 하지 않는 순수한 자료형 요소의 데이터를 주고 받는 것)
  • 한 모듈을 변경하더라도 다른 모듈에는 영향을 끼치지 않는 결합 형태

스탬프 결합도 (Stamp Coupling)

  • 모듈간의 인터페이스로 배열이나 객체 , 자료 구조 등이 전달되는 경우
  • 두 모듈이 인터페이스로 배열이나 오브젝트와 같은 동일한 자료 구조를 참조하는 형태의 결합도
  • 자료구조 형태가 변경되면 그것을 참조하는 모든 모듈에 영향을 줌

제어 결합도(Control Coupling)

  • 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하는 제어 요소를 전달하는 경우
  • 상위 모듈이 하위 모듈의 상세한 처리 절차를 알고 있어 이를 통제하는 경우
  • 제어 결합은 정보 은닉을 위배하는 결합으로 한 모듈이 다른 모듈 내부에 관여하여 관계가 복잡해짐

외부 결합도(External Coupling)

  • 어떤 모듈이 외부에 있는 다른 모듈의 데이터를 참조하는 경우( 데이터, 통신, 프로토콜 등 )
  • 외부의 데이터, 통신 프로토콜 등을 공유할 때 발생 ( 참조할 데이터가 외부 모듈에 위치할때 )
  • 어떤 외부 모듈에서 반환한 값을 다른 모듈에서 참조하는 경우
  • 참조되는 데이터의 범위를 각 모듈에서 제한할 수 있음

공통 결합도(Common Coupling)

  • 여러 개의 모듈이 하나의 공통 데이터 영역을 사용하는 경우
  • 대표적으로 전역 변수(global variable)를 예로 들 수 있음 (전역 변수의 변경이 여러 모듈에 영향을 줌)
  • 공통 데이터 영역의 내용을 조금만 변경하더라도 이를 사용하는 모든 모듈에 영향을 미침
  • 위의 외부 결합도와 유사하게 볼 수 있으나 공통 데이터가 외부냐 내부냐에 따라 차이가 있음
  • 공통 결합도가 외부 결합도 보다 결합도가 높은 이유는, 전역 변수의 값에 따라 결국은 외부의 모듈 반환 값 까지 결정될 수 있는 가능성이 있기 때문에 외부 결합도 보다 더 결합도가 높도록 평가된다고 보면 됨

내용 결합도(Content Coupling)

  • 어떤 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우
  • 가장 높은 결합도를 갖으며, 가장 좋지 않은 형태
  • 어떤 모듈이 사용하려면 다른 모듈의 내부 기능과 데이터를 직접 참조해 그대로 가져와 사용하거나 수정하는 경우
  • 이렇게 되면 A모듈, B모듈 모두 코드를 알고 있어야 하며 A 모듈이 변경되면 B모듈도 영향을 미쳐 변경해야 함

응집도

  • 한 모듈 내의 구성 요소들 간의 연관 정도를 의미
  • 한 모듈이 하나의 기능을 갖는 것은 응집도가 높은 것이고, 한 모듈이 여러 기능을 갖고 있는 것은 응집도가 낮은 것
  • 응집도가 높은 모듈은 하나의 모듈 안에 함수나 데이터와 같은 구성 요소들이 하나의 기능을 구현하기 위해 필요한 것들만 배치되어 있고 긴밀하게 협력
  • 응집도가 낮은 모듈은 모듈 내부에 서로 관련 없는 함수나 데이터들이 존재하거나 관련성이 적은 여러 기능들이 서로 다른 목적을 추구하며 산재해있음

기능적 응집도

  • 모듈 내부의 모든 기능이 단일 목적을 위해 수행되는 경우 (응집도 가장 높음)
  • 대입 되는 변수가 공통적으로 사용되는 경우
  • 대표적인 예로 수학 연산에 관련된 모듈들을 모은 Math 클래스

순차적 응집도

  • 모듈 내에서 한 활동으로부터 나온 출력 값을 다른 활동이 사용할 경우
  • 어떤 모듈이 특정 파일을 읽고 처리하는 기능을 하는 등과 같음

교환적(통신적) 응집도

  • 동일한 입력과 출력을 사용해 다른 기능을 수행하는 활동들이 모여있을 경우
  • 메소드 호출에 공통된 파라미터가 입력되는 경우
  • 순차적 응집도와 차이점은 처리 순서가 중요치 않은 것

절차적 응집도

  • 모듈이 다수 관련 기능을 가질 때 모듈 안의 구성요소들이 그 기능을 순차적으로 수행할 경우
  • 하나의 클래스에 있는 메소드들을 여러 개 호출하는 경우

시간적 응집도

  • 연관된 기능이라기 보단 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우
  • 각 기능 요소들이 순서에 상관없이 특정 시점에 반드시 수행
  • 메소드 호출이 일어나지 않고 변수의 초기화만 실행되거나, Exception 에러 로그를 보내거나 등

논리적 응집도

  • 유사한 성격을 갖거나 특정 형태로 분류되는처리 요소들이 한 모듈에서 처리되는 경우
  • 논리적으로 비슷한 기능을 수행하지만 서로의 관계는 밀접하지 않은 형태
  • switch 문이 쓰여 case 에 따라 비슷하지만 다른 작업을 수행하는 경우

우연적 응집도

  • 모듈 내부의 각 구성요소들이 연관이 없을 경우 ( 응집도 제일 낮음 )

0개의 댓글