본문 바로가기

Java

객체지향 프로그래밍

객체?

객체란 우리 주변을 이루고 있는 모든것을 말할 수 있다. 객체는 보통 상태와 행위로 이루어져 있는데, 사람이라는 객체를 예를 들어보자. 사람의 키, 몸무게, 머리색 등과 같은것으로 사람의 상태를 묘사할 수 있을것이고, 밥을 먹거나 걷거나 앉거나하는것으로 행위를 묘사할 수 있다.


객체지향 프로그래밍?

위에서 객체에 대해서 말했다. 그렇다면 객체지향 프로그래밍은 무엇일까? 이를 말하기에 앞서 우리가 흔히 객체지향의 반대라고 생각하는 절차적 프로그래밍에 대해서 짚고 넘어가 보겠다.

 

절차적 프로그래밍?

먼저 절차적 프로그래밍은 절대 객체지향 프로그래밍의 반대가 아니다. 프로그래밍 접근 방법이 상이할 뿐이다. 

절차적 프로그래밍(Procedure Programming)이란 Procedure을 이용하여 작성하는 프로그래밍이다. 

그렇다면 Procedure란 뭘까? 이는 다음과 같이 구성되어 있다.

  • 루틴: main문
  • 서브 루틴: main문 밖에서 정의한 코드블록중 반환 값이 없는것
  • 함수: main문 밖에서 정의한 코드블록중 반환 값이 있는것

절차적 프로그래밍은 순차적인 처리를 중요시 여기며 프로그램 전체가 유기적으로 연결되어 있다는 특징을 갖는다.

이러한 특징을 바탕으로 다음과 같은 장점을 갖는다.

  • 컴퓨터 처리 구조와 유사해 빠른 속도를 갖는다.
  • 모듈 구성이 용이해 구조적인 프로그래밍이 가능하다.

이런 장점에도 불구하고 절차적 프로그래밍은 다음과 같은 단점을 갖는다.

  • 유지 보수가 어렵다.
  • 실행 순서가 정해져 있기 때문에 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.
  • 코드가 길어지면 가독성이 떨어져 이해하기 힘들다.

객체지향 프로그래밍

시간이 흐를수록 소프트웨어는 급격하게 발전하여 프로젝트의 규모가 커져 절차적 프로그래밍으로 프로그래밍을 하기 어려워 나온것이 객체지향 프로그래밍인데, 프로그램에 필요한 객체들을 파악하여 이를 정의하고 객체들간의 상호작용을 통한 프로그래밍을 객체지향 프로그래밍이라고 한다.


객체지향의 특징

객체지향의 특징으로 흔히 캡상추다 라고 알고 있다. 각각 캡슐화, 상속, 추상화, 다형성을 의미하며 각각의 개념을 예시를 통해 이해해보자.

 

캡슐화?

캡슐화란 객체의 상태와 행위를 하나로 묶어 외부로 부터 드러나지 않게 하는것을 말한다. 다시말해 외부에서 봤을때 해당 객체가 어떤일을 하는지 모르게 하는것을 의미한다.

 

예를들어 우리가 자동차를 봤을때 이를 보기만 해서는 자동차의 이름, 자동차의 기능을 알 수 없는것을 캡슐화가 되었다고 말할 수 있다.

 

상속?

상속이란 상위클래스의 기능을 하위클래스에서 물려받는것을 말한다. 너무 추상적이니 코드를 통해 살펴보자.

class Person { //상위 클래스
    protected String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void speak() {
        System.out.println("저는 " + name + "입니다.");
    }
}

class Dancer extends Person {//하위 클래스
    public Dancer(String name, int age) {
        super(name, age);
    }

    public void dance() {
        System.out.println(name + ": 춤을 춥니다.");
    }
}

public class Main {
	public static void main(Stirng[] args) {
    	Dancer dancer1 = new Dancer("홍길동", 20);
        
        dancer1.speak();
        dancer1.dance();
    }
}

 

코드에서와 같이 Dancer클래스에는 speak()메소드가 정의되어 있지 않지만 Person클래스를 상속받아 상위 클래스의 기능을 사용할 수 있다.

실생활에서 예를 들자면 자동차라는 클래스를 소나타, 아반떼, sm5라는 클래스가 물려받았을 때 자동차에서 정의한 기능을 모두 사용 가능한것을 의미한다.

 

추상화?

추상화란 공통된 점을 묶어 하나로 표현하는것을 말한다. 예를들어 불독, 진돗개, 시바견 모두 개라는 존재로 추상화 할 수 있으며, sm5, 아반떼, 소나타 모두 차라는 존재로 추상화 할 수 있다.

코드로 살펴보면 다음과 같이 표현할 수 있다.

public abstract class Car {

    public abstract void move();
}

public class Sm5 extends Car{

    @Override
    public void move() {
        System.out.println("sm5가 움직입니다.");
    }
}

public class Sonata extends Car {

    @Override
    public void move() {
        System.out.println("소나타가 움직입니다.");
    }
}

public class Avante extends Car {

    @Override
    public void move() {
        System.out.println("아반떼가 움직입니다.");
    }
}

 

다형성?

다형성이란 하나의 객체가 여러가지의 타입을 가질 수 있다는 것을 의미한다. 위의 예시를 재사용 하여 Car를 상속받은 여러가지 클래스를 다음의 코드처럼 쓸 수 있다.

Car car = new Car();
Car avante = new Avante();
Car sonata = new Sonata();
Car sm5 = new Sm5();

avante.move();
sonata.move();
sm5.move();

모두 Car로 선언했지만 각각 다른 타입을 갖고 있다.

'Java' 카테고리의 다른 글

자바의 Collection  (0) 2023.01.20
if-else 문과 switch, enum  (0) 2023.01.19
자바의 변수와 타입  (0) 2023.01.19
JVM & GC  (2) 2022.11.29