Java

객체 설계하기 및 객체의 4가지 특성(캡슐화, 상속,다형성,추상화)

dev_SiWoo 2022. 1. 5. 16:59
Unit 저글링 = new 저글링();
Unit 시즈탱크 = new 시즈탱크();
Unit 레이스 = new 레이스();
Unit 뮤탈 = new 뮤탈();

Unit뮤탈= new뮤탈();

unitMove(저글링);
unitMove(시즈탱크);
unitMove(레이스);
unitMove(뮤탈);

private void unitMove(Unit unit){
	if(is저글링){...
    }else{...
    } // 이런식으로 다형성을 가지게 할 수 있음.
	unit.move()
}

객체의 3가지 요소

 

1. 상태유지 ( 객체의 상태 )

 객체는 상태 정보를 저장하고, 유지되어져야하며 이러한 속성(variable)은 변수로 정의 되어져야 한다.

이러한 속성값이 바뀜으로 인하여, 객체의 상태가 변결될 수 있어야 한다.

 

2. 기능제공 ( 객체의 책임 )

 

 객체의 기능을 제공해야 한다. 이 부분은 Method의 제공으로 이루어진다. 

이 부분은 캡슐화와 연관이 있으며, 외부로 부터 직접 속성에 접근하여 변경하는 것이 아닌 객체가 제공하는 Method로 기능이 제공되어야 한다. 

 

(외부에서 내부에 속성에 직접접근하는 것이 아니라 getter/setter를 통해서 값을 가져가거나 값을 지정할 수 있어야한다.)

 

3. 고유 식별자 제공( 객체의 유일성 )

각각의 객체는 고유한 식별자를 가져야 한다.

예를 들면 카드번호, 계좌번호, 자동차 번호와 같은 속성을 통해서 각각 고유한 값을 줄 수 있으며

이는 이후 DB에서 Unique Key, Primary Key로도 작성이 가능하다.

 

객체의 4가지 특성

1. 캡슐화

2. 상속

3. 다형성

4. 추상화

1.0 캡슐화란? : 객체의 속성(variable)을 보호하기 위해서 사용함.

ex) 컴퓨터 전원을 키기 위해서 메인보드에 직접 전기신호를 주는 것이 아니라 케이스의 전원버튼을 눌러서 상태를 on으로 바꾸는 것처럼 설계되어야 한다.

 

1.1 Method 설계

- 속성이 선언되었으나, 이의 상태를 변경하는 method가 없다면 잘못 선언된 속성이다.

   즉 자신이 가지고 있는 속성에 대해서는 해당 상태를 변경하는 기능을 제공해야 한다.

 

- 실물 객체가 가진 기능을 모두 제공 해야 한다.

예를 들면, 자동차의 렌탈, 반납, 주행거리 계산 등등

 

- 각각의 Method는 서로 관련성이 있어야 한다.

 차량의 렌탈/반납, 자동차 등록증 등록/해지 등 각 속성의 상대되는 기능을 제공해야한다.

 

- 객체 안의 Method는 객체 안의 속성을 처리해야 하며, 다른 객체를 전달받아 해당 다른 객체에 정의 된 속성을 직접 처리 하면 안된다. 

 

단, Method에 실행에 필요한 값들은 객체의 형태가 아닌 매개변수 형태로 전달되어야한다.

  만약 다른 객체의 값을 전달받아 처리해야하는 경우라면 해당 객체를 매개변수로 받는게 아니라

  getter같은 메소드로 값자체를 받아와야함)

 

1.2 Method의 종류

- Getter/Setter Method : 외부에서 내부 속성(Variable)에 직접 접근 하는 것이 아닌 Getter/Setter를 통해서 접근하도록 적용 해야함

 

- CRUD Method : 데이터 처리를 위한 기본적인 CRUD Method를 제공

 

- Business Logic Method : 이건 비즈니스별로 매우 상이함.

 

- 객체의 생명 주기 처리 Method : 흔히 destroy(), disconnect()등 quit() 등 소멸에 대한 Method

 

- 객체의 영구성 관리 Method : 영구성(유효성) 속성에 대한 변경이 필요한 경우 외부에서는 접근이 불가능 하도록

   Private로 선언하며, 내부의 다른 Method를 통해서 사용 되도록 한다.

 

1.3 캡슐화의 장점

- 추상화 제공 : 실제로 Method가 어떻게 작동하는지 외부에서는 이해할 필요x, 객체 단위의 프로그램 설계가능

- 재사용성 향상 : 한 객체에 관련된 속성 및 Method는 모두 캡슐화 형태로 제공되기에 객체의 모듈성과 응집도가 높아                         진다. 이를 통해 재사용성이 높아진다.

            (절차지향에서는 Method를 재사용시 함수가 참조하고 있는 전역변수 및 내부에서 호출하는 Method가 미치는 영향을 모두체크해야한다. 하지만 객체지향에서는 단일 객체에만 영향을 주기 때문에 같은 동일한 목적의 Method라고 하더라도 절차지향에서보다 객체지향에서는 재사용할 수 있는 가능성이 훨씬높다.)

 

위와 같은 캡슐화의 장점으로 유지보수의 효율성이 향상된다.

 

1.4 캡슐화의 무결성 보장

 변수는 private로 선언해서 바로 접근이 불가능하게 막아버리고 메소드를 통해서 변경할 수 있게해준다.

 

 여기서 무결성이란 Getter/Setter를 제외하고는 public method는 입력된 매개변수를 Validation을 한 후에 실행하는 것을 기본으로 한다.

 

Validation을 통한 이후, 객체의 값을 바꾸거나 값의 대한 유효성을 가질 수 있도록 한다.

ex) 해당 메소드에서 허용하지 않는 범위내의 값에 대해서는 무시하거나 에러를 뱉어내도록 객체의 무결을 유지시켜줄 수 있어야 한다.

 

 

2.0 상속이란? : 객체지향에서의 상속은, 속성의 상속이 아닌, 하위로 내려갈 수록 구체화 되는 것이다.

2.1 상속의 효과

- 최상위 클래스의 구조를 보고, 하위 클래스의 동작을 이해할 수 있다.

- 재사용성 향상 : 상속을 통해 해당 클래스에 필요한 속성 및 메소드를 모두 정의할 필요가 없이 상속받아 사용하면 됨

  (ex : 저글링부분을 코딩한다고 하면 지상유닛의 속성과 메소드를 상속받아서 쓰면되므로 같은 속성과 메소드를 반복적으로 작성할 필요x)

 

- 확장성 향상 : 일관된 형태의 클래스 객체를 추가할 수있어, 간단하게 프로그램  확장 가능.(ex 신규 유닛)

- 유지보수성 향상 : 객체마다 각각의 자신의 메소드를 가지고있으면, 코드 수정시 많은 작업이 필요하지만, 상속을 이용하면 한번에 끝난다.

-

 

3.0 다형성

- Java에서 다형성을 가진다는 말은 즉 Overriding이 가능하다는 말이다.

Unit 저글링 = new 저글링();
Unit 시즈탱크 = new 시즈탱크();
Unit 레이스 = new 레이스();
Unit 뮤탈 = new 뮤탈();

Unit뮤탈= new뮤탈();

unitMove(저글링);
unitMove(시즈탱크);
unitMove(레이스);
unitMove(뮤탈);

private void unitMove(Unit unit){
	if(is저글링){...
    }else{...
    } // 이런식으로 다형성을 가지게 할 수 있음.
	unit.move()
}

 

4.0 추상화

추상화란? : 상속, 다형성 모두 추상화에 속한다. 즉 객체지향에서 말하는 추상화란 모델링이다. 

               구체적으로 공통적인 부분, 특정 특성을 분리해서 재조합 하는 것이 추상화라는 것이다.