삽질블로그

객체 지향 프로그래밍이란?(OOP, Object-Oriented Programming) 본문

객체지향

객체 지향 프로그래밍이란?(OOP, Object-Oriented Programming)

삽질블로그 2022. 9. 27. 11:47

객체 지향 프로그래밍(OOP)은 절차 지향 프로그래밍이 아닌 ‘객체’들의 상호작용(메시지 주고받기, 데이터 처리 등)으로 프로그램 로직을 구성하는 프로그래밍이다.

절차 지향 프로그래밍으로는 대표적으로 C언어가 있고,       

객체 지향 프로그래밍으로는 대표적으로 자바가 있다.

 

OOP는 캡슐화, 추상화, 다형성, 상속성 이 4가지 대표적인 특징을 알아야 한다.

 

1. 캡슐화 (Encapsulation)

한 객체가 특정한 하나의 목적을 위해 필요한 데이터(변수)나 메소드를 하나로 묶는 것을 의미한다.     

               

즉, 클래스를 만들 때 나중에 이클래스에서 만들어진 객체가 특정한 목적을 가지고 사용할

변수와 특정한 액션을 취하는 메서드를 관련성 있게 클래스에 구성해야한다.

쉽게 말해서 연관 있는 변수와 함수를 클래스로 묶는 작업을 말한다.

 

캡슐화의 주요 목적으로 정보은닉이 있다.

즉, 캡슐화 한 클래스의 내부 구조는 private하게 감춰두고 외부에서 조작할 수 있는 정보만 public으로 공개한다

이렇게 하는 이유는 누군가 외부에서 데이터를 임의로 조작할 수 없게 하기 위해서이다.

 

캡슐화와 정보은닉은 동일한 개념이 아니다.
캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다는 것이다.

예를 들면 전기 관련된 기기(노트북, 냉장고 등등)를 쓸 때 내부에 있는 회로(private)는 사용자가 몰라도 된다.

사용자는 public으로 정의된 속성만 알면 된다.(ex. 노트북 전원키기)

 

2. 추상화(Abstraction)

추상화란 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.

즉, 구체적인 사물들간의 공통점을 취하고 차이점을 버리는 일반화를 하거나,

중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것,

핵심은 결국 불필요한 부분을 제거하고 중요한 부분을 살리는 것이다.

 

우리가 사는 주거공간으로 예를 들면 주택, 아파트, 오피스텔 등이 있는데, 

이를 각각 클래스화하고 변수와 메소드 등을 개별적으로 만드는 것은 비효율적인 코드를 작성하게 된다.

 

이 주거공간들 중에 중요하거나 공통적인 부분을 따로 추출해서 추상화하는 과정을 끄집어내야 한다.

예를 들면 창문, 변기, 세탁기 등 필수적인 부품이 있다.

 

또 창문은 열고 닫기가 되어야 하며, 변기는 물이 내려가야하고, 세탁기도 세탁이 되어야 한다.

이러한 공통적인 행동들을 통해 필요한 메소드가 추출된다.

 

이러한 과정이 추상화이다.

 

3. 다형성(Polymorphism)

다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다.

이를 통해 코드의 재사용, 코드길이 감소가 되어 유지보수가 용이하도록 도와주는 개념이다.

 

예를 들어 테슬라 클래스에 자율주행이라는 속성이 정의되어 있다고 치자.

만약 벤츠 클래스에서 테슬라를 상속받아서 사용한다면 자율주행이라는 속성을 사용할 수 있다.

하지만 테슬라와 벤츠의 자율주행은 서로 다르다. 같은 자율주행의 속성을 가지지만 서로 다르게 구성이 되어있다.

이런 형태를 다형성이라고 할 수 있는데,

 

OOP에서 다형성의 개념을 녹여내는 방법은

오버라이딩(Overriding)과 오버로딩(Overloading)이 있다.

 

- 오버라이딩(Overriding)

오버라이딩이란 어떤 클래스에서 상속받은 자식 클래스가 부모 클래스의 속성을 이용하고 싶을 때 

자신이 원하는대로 사용할 수 있도록 재정의해서 사용하는 것을 말한다.

class human{
    public String name;
    public int age;

    public void info(){
        System.out.println("이름은 "+name+", 나이는 "+age+"살입니다.");
    }

}

class men extends human{
    String gender;

    public void info() {
        super.info();
        System.out.println("성별은 "+gender+"입니다.");
    }
}

 

 

-오버로딩(Overloading)

일반적으로 한 클래스에 정의된 메서드의 이름은 중복될 수 없지만

오버로딩은 한 클래스에서 같은 이름을 가진 메서드가 여러개 존재할 수 있게 허용하는 개념이다.

중요한 점은 메서드의 이름은 같아도 되지만, 매개변수까지 같아서는 안된다.

public class A
{
   public int sum(int a, int b)
   {
        return a+b;
   }
   public int sum(float a, float b)
   {
        return a+b;
   }
}

다형성을 사용하면 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고,

메서드 이름을 낭비하지 않는다는 장점이 있다.

아까 자동차를 예로 teslaAutonomousDriving(), benzAutonomousDriving()으로 각각 정의하지 않고

각 객체에서 AutonomousDriving()으로 사용하면 된다는 것이다.

 

 

4. 상속성(Inheritance)

상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념이다.

기존 클래스에서 메소드와 변수를 물려받아 재사용할 수 있을 뿐만 아니라

필요한 기능을 더 추가하거나 자식클래스에 맞게 재정의할 수 있게 해준다.

 

예를 들어 파충류 클래스에 여러 속성들을 정의해놨다고 치자.(예를 들어 알을 낳는다.)

후에 카멜레온 클래스가 필요한 상황이 온다면 파충류 클래스를 상속을 받는다면

카멜레온 클래스에서 알을 낳는다는 속성을 다시 정의할 필요가 없어지기 때문에 코드가 간결해진다.

 

상속이 필요한 이유는 코드의 중복을 없애기 위함이다.
코드의 중복이 많아지면 개발 단계에서도 피곤할 뿐만아니라 유지 보수에서도 많은 비용이 들게 된다.
그래서 개발을 할때 코드의 중복은 반드시 피해야한다.

 

개발자는 코드를 작성하는 것보다 설계하는 것이 더 중요하다는 말을 들었는데,

무슨 뜻인지 이제 조금 알아가는 것 같다.

 

참고자료

https://ykss.github.io/oop1

https://limkydev.tistory.com/30

https://velog.io/@hkoo9329/OOPObject-Oriented-Programming-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9D%B4%EB%9E%80

Comments