OOP
OOP란?
자바프로그래밍하면 객체지향프로그래밍 OOP(Object Oriented Programming)이라 해도 무방하다.
객체지향프로그래밍의 특성은으로 크게 캡슐화, 추상화, 다형성, 상속성정도는 명확하게 알고있어야한다.
OOP하면 자동으로 4가지(캡슐화,추상화,다형성,상속성)가 떠올라야 한다.
이러한 특징을 이용해 코드의 재사용성을 증가하고 유지보수를 쉽게 하기 위해 객체지향적으로 프로그래밍을 한다고 보면 된다.
결합도(Coupling) vs 응집도(Cohension)
모듈의 독립성을 판단하는 두 가지 지표입니다.
결합도는 낮고, 응집도는 높을수록 이상적인 모듈화입니다(High Cohension - Loose Coupling).
- 결합도 : 모듈과 모듈 간의 상호 의존 정도
- 응집도 : 모듈 내부의 기능적인 집중 정도
추상화(Abstraction)
추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것이다.
예를 들면, 물고기, 사자, 토끼, 뱀이 있을 때 우리는 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할 때, 만약 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의할 수 있다. 이때 동물 또는 생물이라고 묶는 것을 추상화라고 한다.
abstract class Action {
// 달리다
public abstract void running();
// 치다
public abstract void hitting();
// 돌다
public abstract void turnning();
}
위 와 같이 Action이라는 추상 클래스를 생성했다.
Class Man extends Action { // 사람 객체
public void running() {
System.out.println("운동장을 달린다.");
}
public void hitting() {
System.out.println("바닥을 치다.");
}
public void turnning() {
System.out.println(“찻길 옆으로 돌다.");
}
}
public class Animal extends Action {
public void running() {
System.out.println("동물을 피해 달린다.");
}
public void hitting() {
System.out.println("앞에선 동물을 치다.");
}
public void turnning() {
System.out.println("앞에선 동물을 피해 돌다.");
}
}
Class Main {
public static void main(String[] args) {
Action manAction = new Man(); // 사람의 액션
Action animalAction = new Animal(); // 동물의 액션
manAction.running(); // 결과 : 운동장을 달린다.
manAction.hitting(); // 결과 : 바닥을 치다.
manAction.turning(); // 결과 : 찻길 옆으로 돌다.
animalAction.running(); // 결과 : 동물을 피해 달린다.
animalAction.hitting(); // 결과 : 앞에선 동물을 치다.
animalAction.turnning(); // 결과 : 앞에선 동물을 피해 돌다.
}
}
캡슐화(Encapsulation)
캡슐화란 쉽게 말하면 변수나 메소드들을 캡슐로 감싸서 안보이게 하는 정보 은닉 개념중 하나이다.
우리가 먹는 알약을 생각해보면 된다.
알약의 실제 약 내용은 가루약이지만, 이것을 캡슐로 감싸면서 맛을 은닉하여 사람이 먹기 편하게 하였으며, 또한 복잡한 재료들의 배합을 캡슐로 포장하여 다루기 편하게 하였다.
캡슐화는 객체의 속성(Field)과 행위(Method)를 하나로 묶고, 외부로 부터 내부를 감싸 숨겨 은닉한다. 또한 외부의 잘못된 접근으로 값이 변하는 의도치 않는 동작을 방지하는 보호 효과도 누릴 수 있다.
자바에서는 대표적으로 protected , default , private의 접근제어자를 통해 구현이 가능하다.
class Time {
private int hour; // hour는 외부에서 접근하지 못하게private으로 선언한다.
// Setter
public void setHour(int hour) {
if (hour < 0 || hour > 24) { // hour에 대한 유효성 검사
return;
} else {
this.hour = hour;
}
}
// Getter
public int getHour() {
return hour;
}
}
public class Main {
public static void main(String[] args) {
MyTime time = new MyTime();
// 유효하지 않은 parameter 입력
time.setHour(25);
System.out.println("Hour: " + time.getHour()); // 0
// 유효한 parameter 입력
time.setHour(13);
System.out.println("Hour: " + time.getHour()); // 13
}
}
위의 코드는 시간을 메서드로 입력받고, 출력하는 아주 간단한 캡슐화 예제이다.
여기서 클래스의 hour 멤버변수는 private으로 선언함으로써 다른 클래스에서의 접근을 제한해 두었다.
그리고 이 private hour 변수를 다루기 위해서는 setter method인 setHour(int hour)와 getter method인 getHour()의 호출을 통해서만 가능하다.
특히 이러한 메서드로 통한 접근 기법의 좋은 점은 유효하지 않은 숫자로 직접 변수 hour를 셋팅하려는 시도를 메서드 내부에서 유효성 체크 로직을 통해 거를 수 있다는 점이다.
상속성
부모의 특징(멤버변수와 메서드)을 상속받아서 자식객체에서 재정의하지 않아도 사용이 가능하기 때문에 코드의 중복을 없애고 재사용성을 높이는 효과가 있다.
다형성
다형성(多形性) 이란, 그 자체의 의미를 표준 국어사전에서 찾아보면, ‘같은 종의 생물이면서도 어떤 형태나 형질이 다양하게 나타나는 현상’ 이라 정의되어 있다.
이를 프로그래밍에 대입해보면, 다형성(polymorphism)이란 같은 자료형에 여러가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질을 의미한다.
이를 통해 조상 클래스의 참조 변수로 자손 클래스의 참조 변수를 다루거나, 동일한 이름을 같은 여러 형태의 매소드를 만들 수 있다.
자바에선 대표적으로 오버로딩, 오버라이딩, 업캐스팅, 다운캐스팅, 인터페이스, 추상메소드, 추상클래스 방법이 모두 다형성에 속하다고 생각하면 된다.
즉, 다형성은 클래스가 상속 관계에 있을때 나타나는 다채로운 성질 인 것이다.