[CS] 객체지향 프로그래밍이란?

Intro

자바 복습을 전체적으로 다시 진행하면서 가장 기본이 되는 객체지향 프로그래밍 개념과 관련된 키워드들을 정리하고자 포스팅한다!

1. 객체지향 프로그래밍이란?

객체지향 프로그래밍이란, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

객체지향을 쉽게 설명하자면, 컴퓨터를 생산하는 것을 비유할 수 있다.

컴퓨터 각 부품을 결합하고 연결하여 하나의 컴퓨터를 생산, 제작하는 것처럼 객체지향 프로그래밍도 객체를 만들고 여러 객체들을 조립하여 하나의 프로그램을 생산, 제작한다고 생각하면 된다.

왜 객체지향 프로그래밍을 사용하는 걸까? 먼저 언급하자면, 객체지향적인 설계 및 작업이 이뤄질 경우 코드의 재사용을 통해서 중복을 방지, 반복적인 코드 최소화, 유지보수 용이라는 장점을 갖고 있기 때문이다.

2. 객체지향 장단점

2-1. 객체지향 장점

  1. 코드의 재사용을 통해 중복을 최소화한다.
    • 상속을 통해 중복되는 코드들을 최소화하여 사용할 수 있다.(상속은 별도 설명.)
  2. 유지보수에 용이하다.
    • 컴퓨터 부품을 고장난 부분만 수정하면 되는 것 처럼 객체지향도 다른 객체들 건드리지 않아도 유지보수에 용이하다.
  3. 대형 프로젝트에 적합하다.
    • 객체 단위로 개발할 수 있기에 대형 프로젝트에서 업무 분담하여 개발하기 용이하다.

2-2. 객체지향 단점

  1. 처리속도가 상대적으로 느리다.
  2. 객체가 많으면 용량이 커진다.
  3. 설계 시 많은 시간, 노력이 필요하다.

3. 객체지향 4가지 특징

객체지향에는 4가지 특징이 존재한다. 바로 추상화, 상속, 다형성, 캡슐화이다. 이제 자세하게 설명하고자 한다!

3-1. 추상화

추상화란, 여러 객체들의 공통된 속성, 행위를 추출하여 정의하는 것을 의미한다.

예를 들어 설명하자면, ‘자동차’와 ‘오토바이’에서 공통적인 속성, 행위를 추출하는 것을 추상화라고 생각하면 된다.

우선 자동차 및 오토바이의 공통점은 ‘이동 수단’이다. 이동 수단은 추상화 집합이 된다. 또한 전진과 후진이라는 공통적인 행위가 존재한다. 이러한 공통적인 행위는 추상화 집합의 메서드로 정의된다.

자바에서 추상화는 ‘추상 클래스’와 ‘인터페이스’로 구현된다. 인터페이스를 통해 위 예시를 설명하면 자동차와 오토바이의 공통적인 기능인 전진, 후진을 추출하여 인터페이스에 정의한다.

1
2
3
4
5
6
7
// 자동차(Car)와 오토바이(MotorBike)를 이동수단(Vehicle)이라는 인터페이스로 정의하였음.
public interface Vehicle { 
  public abstract void start() // 시동 켜기
  void moveForward(); // 전진
  void moveBackward(); // 후진

}

3-2. 상속

상속이란, 기존 클래스를 재활용하여 새로운 클래스를 작성하는 것을 의미한다.

상속은 상위 클래스의 속성 및 행위를 하위 클래스가 물려 받아서 재사용한다는 개념을 의미한다.

추상화를 한 상위 클래스(Vehicle)를 상속 받게 되면 하위 클래스(Car, MotoBike)는 상위 클래스의 속성 및 행위를 중복으로 작성하지 않고도 간편하게 사용할 수 있다는 큰 장점이 있다.

상속을 사용하지 않고, 각 클래스마다 중복된 코드를 작성하면 Car에도 moveForward, moveBackward 메서드를 작성하고, Motobike에도 moveForward, moveBackward를 작성하여 중복이 발생한다. 그렇기에 추상화를 통해 상위 클래스를 정의하고 상속 받아 하위 클래스를 구현하여 사용하면 된다.

여기서 ‘한 두개의 경우에는 상속을 왜 써야하지?’ 라는 생각이 들겠지만, 대형 프로젝트의 경우는 많은 클래스를 생성하고 사용 하는데 매 번 공통된 메서드를 작성하게 되면 작업에 있어 쓸모 없는 시간이 소요되며 만약 수정이 발생할 때 모든 클래스를 수정해야 한다.

반면, 추상화를 통한 상위 클래스를 사용하게 될 경우는 상위 클래스만 수정하면 되기에 유지보수에도 용이하다는 장점을 여기서 확인할 수 있다.

3-3. 다형성

다형성이란, 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것을 의미한다.

다형성을 비유하여 표현하면, 한 사람이 여러 개의 역할을 하는 것을 떠올리면 된다. 한 남성이 아버지, 동아리 회원, 누군가의 친구가 되는 것처럼 객체의 속성 및 기능이 여러 가지 형태를 가질 수 있다고 생각하면 된다.

자바에서 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현한다.

예를 들어, TV 클래스(부모)와 SmartTV 클래스(자식)가 있다고 가정한다. TV 객체를 생성할 때 SmartTV 타입의 인스턴스를 생성하는 것이 가능한데 다형성이 적용되기 때문이다.

1
2
3
4
5
6
7
8
9
// 객체와 인스턴스 타입 일치
Tv tv = new TV();
// 객체와 인스턴스 타입 일치
SmartTV smart = new SmartTV();
// 가능 (객체, 인스턴스 타입은 달라도 다형성 적용되어 가능.)
TV tv2 = new SmartTV();
// 불가능 
// 이유 : 부모타입 = 자식타입 형태로 되야 하지만 밑 코드는 자식타입 = 부모타입 이기에 컴파일 오류가 발생함.
SmartTV smart2 = new TV();

오버라이딩, 오버로딩을 가능하게 하는 개념이 다형성이다.

오버라이딩이란, 오버라이딩은 메서드 재정의라 할 수 있는데 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의 하는 것을 의미한다.

오버로딩이란, 같은 메서드명을 가진 함수를 매개변수의 타입, 개수를 다르게하여 매개변수에 따라 다르게 호출하게 하는 것을 의미한다.

두 가지의 차이점은 오버라이딩의 경우는 메서드 명, 매개변수, 리턴타입이 모두 동일해야 하지만 오버로딩의 경우는 메서드 명은 같지만 매개변수의 타입 및 개수가 달라야 한다.

3-4. 캡슐화

캡슐화란, 클래스의 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 말한다.

캡슐화를 하는 이유로는 데이터 은닉, 데이터 보호 2가지가 있다.

외부에서 클래스에 직접 접근할 수 있게 되면 클래스 파일이 변경될 수 있고 외부로 노출 될 위험이 있기 때문에 캡슐화를 한다.

자바에서 캡슐화를 구현하는 방법으로 2가지가 있다.

첫 번째는 접근제어자다. 외부에서 접근할 필요 없는 경우 private 를 두어 접근을 제한한다.

두 번째로는 getter/setter가 있다. 메서드를 getter, setter를 통해 접근하도록 설정하여 응집도를 높이고 낮은 결합도를 유지하게 한다.

대부분 멤버변수를 private로 선언하고, 메서드를 getter, setter를 사용하여 외부에서 멤버변수에 접근할 때 getter, setter를 사용하게 한다.

참고 사이트

객체지향 프로그래밍 참고 게시물1
객체지향 프로그래밍 참고 게시물2