캡상추다 알아보기 !💊 캡슐화OOP의 장점응집도(Cohesion)결합도(Coupling)그래서 캡슐화가 뭐에요?🤔 캡슐화와 정보은닉의 차이?👨👩👦 상속하위클래스 - 상위클래스인터페이스🫥 추상화👥 다형성오버라이딩오버로딩📚. REF
캡상추다 알아보기 !
💊 캡슐화
OOP의 장점
- OOP의 장점은 프로그램을 유연하고 변경이 용이하게 만듭니다.
- 또한 개발과 유지보수를 편하게 만들며 직관적인 코드 분석이 가능합니다.
- 위의 장점들을 관통하는 객체지향 프로그래밍의 중요한 특성은 응집도와 결합도입니다.
응집도(Cohesion)
- 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타냅니다.
- 모듈 내부의 기능적인 응집 정도를 나타내며 높을수록 좋습니다.
- 응집도가 높으면, 변경 대상과 범위가 명확해지는 장점이 있어서 코드를 수정하기 쉬워집니다.

- 높은 응집도
- 각 모듈에 관련된 기능들이 흩어져 있지 않고 잘 모여있다.
- 유지보수를 위해 모듈을 수정할 때 해당 모듈만 수정하면 되서 유지보수하기 편리하다.

- 낮은 응집도
- 각 모듈 안에 다른 모듈과 관련된 기능들이 포함되어 있다.
- 유지보수를 할때 수정할 모듈의 관련된 기능들을 다 찾아서 수정해야 하며 찾는것도 힘들다.
결합도(Coupling)
- 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지를 나타냅니다.
- 즉 모듈과 모듈간의 상호 결합 정보를 나타내며 낮을수록 좋습니다.

- 유지보수를 하기 위해 B 모듈에 있는 기능을 수정 하는데, 다른 모듈(C~H)과 기능들이 연관되어서 수정하려면 다른 모듈의 코드도 다 확인해야하는 번거로움이 있습니다.
- 필요하다면 관련된 모듈까지 수정해야 하기 때문에 유지보수가 더욱 힘들 것입니다.
- 반대로 A 모듈은 다른 모듈을 참조하는 부분의 B 밖에 존재하지 않기 때문에 의존도가 낮아 유지보수하기 편합니다. 이렇게 참조가 적은 상황을 “느슨한 결합"이라고 표현합니다.
- 즉 결합도가 높으면 검토해야 하는 모듈의 수가 많아지는 단점이 있기 때문에 결합도는 낮을수록 검토해야하는 코드의 수가 적어서 수정하기 쉽습니다.
- 흔히 저희가 인터페이스에 의존하도록 작성하는 코드가 낮은 결합도를 얻는 예시로 들 수 있습니다 ! 🙂
그래서 캡슐화가 뭐에요?


- 특정 객체가 독립적으로 역할을 제대로 수행하기 위해 필요한 데이터와 기능을 하나로 묶은 것(모듈화)
- 정보를 객체 안에 포함시키고 그 정보에 대한 직접 접근은 허용하지 않는 대신, 필요에 따라 확인할 수 있는 인터페이스를 외부에 공개하는 방식
- 캡슐화는 정보 은닉을 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계 원리입니다.
- 정보은닉 : 필요없는 정보는 외부에서 접근하지 못하도록 제한하는것 (private)
- 정보은닉의 필요성 : SW는 결합이 많을 수록 문제가 많이 발생하며 한 클래스가 변경이 발생하면 변경된 클래스의 비밀에 의존하는 다른 클래스들도 변경해야 할 가능성이 커진다는 의미를 가지고 있습니다.
- 데이터를 절대로 외부에서 직접 접근을 하면 안되고, 오로지 함수를 통해서만 접근해야하는데 이를 가능하게 해주는 것이 바로 캡슐화 입니다.
- 접근제어자 종류
- public - All
- protected - 클래스, 패키지, 상속
- default - 클래스, 패키지
- private - 클래스
🤔 캡슐화와 정보은닉의 차이?
- 은닉화는 외부에서 객체의 속성을 함부로 접근하지 못하도록 하는 것입니다.
- 캡슐화는 메서드 안에서 어떤 일이 일어나고 있는지 모르게 해야한다는 뜻입니다.
- 왜 사용할까?
- 캡슐화를 하게되면 내부에 데이터를 어떻게 저장하는지, 그 데이터를 어떻게 처리하는지, 또는 특정 기능을 어떻게 제공하는 지에 대한 내용은 드러나지 않는다. 보안 이슈 때문에 사용한다고 생각하면 됩니다.
👨👩👦 상속
- 상위 개념의 특징을 하위 개념이 물려받는 것 입니다.
- 상위 클래스를 하위 클래스에서 상속 받게 되면 상위 클래스의 멤버변수나 메서드를 그대로 물려받을 수 있습니다.
- 상속이 있기 때문에 코드를 재활용 할 수 있고 그렇기 때문에 생산성이 높고 유지보수 하기가 좋습니다.
- 상위클래스로 갈 수록 더 추상화되고 일반화됩니다.
- 하위클래스로 갈 수록 더 구체화되고 특수화됩니다.
하위클래스 - 상위클래스

- 하위 클래스는 상위 클래스 특성을 재사용하고 확장합니다.
- 상위 클래스의 물려줄 특성이 많을수록 좋습니다.
인터페이스
- 다중 상속 대신 도입되었습니다.
- 어떤 객체가 해야할 일을 정의하는 추상 자료형
- 구현 클래스 is able to 인터페이스 (ex. Runnable)
- 인터페이스는 구현을 강제할 메서드가 적을수록 좋다.

- 형욱이라는 녀석은 부모님에게 유전적인 특성을 물려받는다.
- 예를들면 부모님은 한국인 이기 때문에 나도 한국인이다.
- 하지만 프로그래밍은 유전적인 특성을 물려받은게 아니라 배워서 할 수 있는것이다.
- 상속 : Is - a | 인터페이스 : Has - a
🫥 추상화
- 구체적인 것을 분해해서 관심 영역(애플리케이션 경계)에 있는 특성만 가지고 재조합 하는것(모델링)
- 추상화는 객체들이 가진 공통의 특성을 파악하고, 속성, 기능을 묶어 이름을 붙이는 것입니다.
- 클래스 VS 객체
- 클래스 : 분류에 대한 개념 → 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념 (ex. 사람)
- 객체 : 실체 → 유일무이한 사물 (ex. 나)
👥 다형성
- 부모클래스에서 물려받은 메서드를 자식 클래스 내에서 오버라이딩 되어 사용되는 것 입니다.
- 다형성이 상속과 연관디어 동작하면 매우 강력한 힘을 발휘하게 됩니다.
- 다형성을 사용하는 경우에는 구체적으로 현재 어떤 클래스 객체가 참조되는지와 무관하게 프로그래밍을 할 수 있습니다.
- 일반화 관계에 있을 때 부모 클래스의 참조 변수가 자식 클래스의 객체를 참조할 수 있기 때문에 새로운 자식 클래스가 추가되더라도 코드는 영향을 받지 않습니다.
오버라이딩
- 같은 메서드 이름 / 같은 인자 목록 / 상위 클래스의 메서드 재정의
- 상위 클래스 타입의 객체 참조 변수에서 자동으로 하위 클래스가 오버라이딩한 메서드를 호출해준다
// 상위클래스 public int mul(int a, int b) { int result = 0; for(int i=1; i<=b; i++) { result += a; } return result; } // 하위클래스 public int mul(int a, int b) { return a * b; }
오버로딩
- 같은 메서드 이름 / 다른 인자 목록 / 다수의 메서드 중복 정의
public int add(int a, int b) { return a + b; } public int add(int a, int b, int c, int d) { return a + b + c + d; }