post-custom-banner
이전 포스트에서도 학원에서 공부를 하면서도 인강을 들으면서 공부를 하면서도 면접을 가서도 '자바'를 배웠다면 꼬리표처럼 따라다니면서 질문하는것은 바로 객체지향 일 것이다. 오늘 포스팅에서는 객체지향의 4대 특성에 대해 알아볼 것이다.

객체의 3가지 요소

  1. 상태 유지(객체의 상태) : 객체는 상태 정보를 저장하고, 유지되어져야 하며, 이러한 속성(variable)은 변수로 정의 되어져야 한다. 이러한 속성값이 바뀜으로 인해 객체의 상태가 변경 될 수 있어야 한다.

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

  3. 고유 식별자 제공(객체의 유일성) : 각각의 객체는 고유한 식별자를 가져야 한다.

객체지향의 4대 특성

자, 다시 본론으로 돌아왔다. 우리가 객체 지향을 왜 사용하는 것인가? 바로 효과적인 개발방식을 위해 사용한다. 이렇게 객체 지향의 특성에는 추상화, 상속, 은닉, 재사용, 인터페이스 등이 있다. 이에 대해 알아볼 것이다.

1. 캡슐화(Encapsulation)

  • 캡슐화는 객체의 속성(variable)을 보호하기 위해서 사용된다.
    ex) 객체의 캡슐화는 현실 세계에서도 볼 수 있는데, 컴퓨터 본체 안에 수 많은 부품이 있지만 전원을 켜기 위해서는 메인보드에 전기 신호를 직접 주는 것이 아닌 외부 케이스에 있는 전원 스위치를 통해 상태 속성을 ON/OFF하도록 변경 하는 것과 같다.

  • 메서드 설계

    • 속성이 선언되었으나, 이의 상태를 변경하는 method가 없다면, 잘못 선언된 속성이다. 즉, 자신이 갖고 있는 속성에 대해서는 해당 상태를 변경하는 기능을 제공해야 한다.
    • 실물 객체가 가진 기능을 모두 제공해야 한다.
    • 각각의 Method는 서로 관련성이 있어야한다. 즉, 차량의 렌탈/반납 또는 자동차 등록등 등록/해지 등 각 속성의 상대 되는 기능을 제공해야 한다는 것이다.
    • 객체 안의 Method는 객체 안의 속성을 처리해야 하며, 다른 객체를 전달받아 해당 다른 객체에 정의된 속성을 직접처리하면 안된다.
    • Getter/Setter Method: 외부에서 내부 속성에 직접 접근하는 것이 아닌 Getter/Setter Method를 통해 접근 하도록 적용한다
    • CRUD Method: 데이터 처리를 위한 기본적인 CRUD를 제공한다
    • Business Logic Method: 비즈니스 로직 처리를 위한 Method 제공
    • 객체 생명 주기 처리 Method: 흔히 destroy(), disconnect(), quit() 등 소멸에 대한 method를 말한다
    • 객체의 영구성 관리 Method: 영구성(유효성) 속성에 대한 변경이 필요한 경우 외부에서는 접근이 불가능 하도록 private으로 선언하며, 내부의 다른 Method를 통해서 사용되도록 한다.
  • 무결성 : 보통의 캡슐화 코딩이라고 한다면, 주로 변수는 private으로 선언하고, Method를 public으로 선언하는 형태를 많이 가진다. 이러한 경우를 객체의 무결성을 위함인데, Getter/Setter를 제외하고는 public method는 입력된 매개변수를 Validation을 한 후 실행하는 것을 기본으로 한다. 이 Validation을 통해 객체의 값을 바꾸거나, 값에 대한 유효성을 가질 수 있다.

  • 그래서 캡슐화의 장점은?

  1. 객체지향의 패러다임 중 하나인 추상화를 제공한다. 실제로 Method가 어떻게 동작하는지는 외부에서는 이해할 필요가 없으며, 이를 단순 호출만으로 해당 기능을 실행 할 수 있고, 이를 통해서 객체 단위로 프로그램 설계가 가능하다.
  2. 재 사용성이 향상한다. 한 객체에 관련된 속성 및 Method는 모두 캡슐화의 형태로 제공되므로, 객체의 모듈성과 응집도가 높아진다. 그러므로 재사용성이 향상하는 것이다. 만약 절차 지향 프로그래밍에서 Method를 재사용 해야한다면, 함수가 참조하고 있는 전역변수 및 내부에서 호출하는 Method가 미치는 영향을 모두 체크해야 하지만, 객체의 경우는 단일 객체에만 영향을 주기 때문에 재사용성이 높다.

2. 상속(Inheritance)

  • 객체지향에서의 상속은 클래스가 곧 대상이다. 즉, 클래스에서 클래스로 물려준다는 말이다. 또한, 상속은 속성의 상속이 아닌, 하위로 내려갈 수록 구체화 된다.
  • 상속으로 기대할 수 있는 것은 뭐가 있을까?
    • 프로그램 구조에 대한 이해도가 향상된다. 최상위 클래스의 구조를 보고, 하위 클래스의 동작을 이해할 수 있는 것이다.
    • 재사용성이 향상된다. 해당 클래스에 필요한 속성 및 메소드를 모두 정의하지 않고, 상속을 받아서 사용할 수 있다.
    • 확장성이 향상된다. 일관된 형태의 클래스 객체를 추가 할 수 있어, 간단하게 프로그램 확장이 가능하다.
    • 유지보수성이 향상한다. 각 객체마다 자신의 메소드를 정의하고 있다면, 코드 수정에서 많은 작업이 필요하지만 상속을 사용한 경우 일관된 형태로 작성이 가능하기 때문이다.

3. 다형성(Polymorphism)

  • 다형성은 하나의 개체가 여러개의 형태로 변화 하는 것을 말하며, 이를 객체지향에서도 유사하게 사용을 하고 있다. 이 다형성은 오버라이딩을 통해서 가능하다.
  • 여러가지 형태를 가질 수 있는 능력이자, 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것이다. 즉, 조상 타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것이 다형성인 것이다.
  • 조상 타입의 참조변수로 자손타입의 인스턴스를 참조할 수는 있지만, 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.
class Tv {
   boolean power;
   int channer;
   
   void power() {
      power = !power;
   }
   void channelUp() {
      ++channel;
   }
   void channelDown() {
      --channel;
   }
}

class SmartTv {
   boolean soundBarPower;
   
   void soundBar() {
      soundBarPower = !soundBarPower;
   }
}

4. 추상화(Abstraction)

  • 객체지향에서의 추상화는 모델링이다.
  • 구체적으로 공통적인 부분, 또는 특정 특성을 분리해서 재조합하는 부분이다.
  • 다형성과 상속 모두 추상화에 속한다.

ㄴ ✨ 인터페이스(Interface) ✨

  • 일종의 추상클래스(미완성 설계도)이지만, 추상클래스 보다는 추상화 정도가 높다.

  • 실제 구현된 것이 전혀 없는 기본 설계도 👉 알맹이 없는 껍데기인 것

  • 추상 메서드와 상수만을 멤버로 가질 수 있음

  • 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용됨

  • 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다

  • 인터페이스의 장점

    • 개발 시간 단축OK 인터페이스가 작성되면 이를 사용해 프로그램을 작성하는 것이 가능하다. 메서드를 호출하는 쪽에서는 선언부만 알면 되기 때문! 동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 해, 인터페이스를 구현하는 클래스가 작성될 때 까지 기다리지 않고 양쪽에서 동시에 개발을 진행 할 수 있다.
    • 표준화가 가능😎 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다는 것.
    • 서로 관계없는 클래스들에게 관계도 맺어주는 기능을 한다🔥 서로 상속 관계도 아니고 같은 조상 클래스를 갖고 있지도 않은 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다는 것
    • 독립적인 프로그래밍이 가능👌🏼 클래스의 선언과 구현을 분리 시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다. 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다는 것.

<JPA를 이용해 게시판 만들기에서 사용된 상속>

@Service
public class BoardService {
    @Autowired
    private BoardRepository boardRepository;

    @Autowired
    private UserRepository userRepository;

    public Board save(String username, Board board) {
        User user = userRepository.findByUsername(username);
        board.setUser(user);
        return boardRepository.save(board);
    }
}
profile
Welcome to my velog! I love learning something new to build up my ability in development field. I don't think it is shame not to know, but it is shame to pretend to know about something you don't know.
post-custom-banner

0개의 댓글