[Java] OOP(Object-Oriented Programming)

Wonjun Seo·2023년 8월 7일
0

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

객체지향 프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나로 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메세지를 주고 받고, 데이터를 처리할 수 있다.

이처럼 가능한 모든 물리적, 논리적 요소를 객체로 만드려는 것이 객체지향 프로그래밍 이라고 말할 수 있다.

객체지향으로 구현하게 되면, 객체 간의 독립성이 생기고 중복코드의 양이 줄어드는 장점이 있고, 독립성이 확립되면 유지보수에도 도움이 될 것이다.

객체지향 프로그래밍 특징

객체지향은 크게 4가지의 특징을 가지고 있다.

추상화 (Abstraction)

  • 객체들의 공통적인 특징(기능, 속성)을 추출해서 정의하는 것을 말한다.
  • 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통적인 특성을 파악하여 하나의 묶음으로 만들어내는 과정을 가르킨다.
  • 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.

ex. 아우디, BMW, 벤츠는 모두 자동차라는 공통점이 있다.
자동차라는 추상화 집합을 만들어두고, 자동차들이 가진 공통적인 특징들을 만들어 사용한다.

만약 나중에 다른 자동차 브랜드가 추가될 경우, 다른 곳의 코드는 수정할 필요 없이 추가로 만들 부분만 새로 생성해주면 된다는 장점이 있다.

객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 기법이다.
다시 말해, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라고 할 수 있다.

캡슐화 (Encapsulation)

  • 캡슐화는 관련이 있는 변수와 함수를 하나의 클래스로 묶고, 외부에서 쉽게 접근할 수 없도록 은닉하는 것이다.
  • 클래스를 만들 때 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록 사용해야할 변수와 그 변수를 가지고 특정한 메서드를 관련성 있게 클래스에 구성해야한다.
  • 캡슐화는 높은 응집도와 낮은 결합도를 유지한다. 즉, 한 곳에서 변화가 일어난도 다른 곳에 미치는 영향을 최소화 한다.
  • 일반적인 객체지향 언어에서는 접근 제한자(Access Modifier)라는 문법을 지원합니다.
    • public: 클래스 외부에서 제한 없이 접근 가능
    • private: 클래스 내부에서만 접근 가능
    • protected: 상속한 하위 클래스에서만 접근 가능

정보은닉

캡슐화의 주된 목적 중 하나는 정보은닉이다. 유저 정보를 가지고 있는 User 객체에서 유저의 정보가 public으로 선언되어 있다면, 누구나 접근해서 유저 정보를 변경할 수 있다. 그렇기 때문에 private으로 선언하여 데이터를 보호하고 접근을 제한해야 한다.

이렇게 보호된 변수는 Getter 또는 Setter 등의 메서드를 통해서만 간접적으로 접근할 수 있도록 하는 것이 캡슐화의 중요한 목적이다.

상속성 (Inheritence)

  • 이미 정의된 상위 클래스(부모 클래스)의 모든 속성과 연산을 하위 클래스(자식 클래스)가 물려받는 것을 의미한다.
  • 상속이란 기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념이다.
  • 기존 클래스의 기능을 가져와 재사용함으로써 코드의 생산성을 높여주고, 새롭게 만든 클래스에서 새로운 기능을 추가할 수 있게 해준다.

상속이 필요한 이유

상속이 필요한 이유는 코드의 중복을 없애기 위함이다.
코드의 중복이 많아지면 유지보수에 많은 비용이 들게된다.

OOP에서는 상속을 통해 코드 중복 문제를 일부 해결할 수 있다.
포유류 클래스에 여러 속성들을 정의해 놓고 포유류에 해당하는 종이 필요한 경우 포유류 클래스와 상속 관계를 맺는다.
상속 관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려 받으므로 자식 클래스에서 이를 다시 정의할 필요가 없다.

다형성 (Polymorphism)

다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다. 즉, 다형성은 서로 다른 클래스이 객체가 같은 메세지를 받았을 때 각자의 방식으로 동작하는 능력을 의미한다.
이를 통해 코드의 재사용성, 코드의 길이가 감소되어 유지보수에 용이하다.

고양이 클래스에 울음이라는 속성이 정의되어 있다고 가정하면, 사자는 고양이 과이므로 사자 클래스가 고양이 클래스를 상속받는다면, 사자 클래스에도 울음이라는 속성이 자동으로 추가된다. 이것을 상속이라고 한다.

그런데 고양이와 사자의 울음소리는 서로 다르다. 이러한 것을 다형성이라고 말할 수 있다.

Overriding

  • 부모 클래스를 상속받은 자식 클래스에서 부모 클래스에서 만들어진 메서드를 재정의해서 사용하는 것을 말한다.
class A {

	int x;
    int y;

	public void test() {
    	System.out.println("x = " + this.x + ", y = " + this.y);
    }
}

class B extends class A {

	int z;

	@Override
    public void test() {
    	System.out.println("x = " + this.x + ", y = " + this.y);
        System.out.println("x = " + this.x + ", y = " + this.y + ", z = " + this.z);
    }
}

Overloading

  • 같은 이름의 메서드를 여러 개 정의한 후 매개변수를 다르게하여 이 메서드들을 경우에 따라 호출하여 사용하는 것을 말한다. (매개변수의 개수나 데이터 타입이 서로 달라야한다)
public class Test {
	public void test() {
    	System.out.println("정보 없음");
    }
    
    public void test(String name) {
    	System.out.println("이름 = " + name;
    }
    
    public void test(String name, int age) {
    	System.out.println("이름 = " + name + ", 나이 = " + age);
    }
}

객체지향 설계 원칙(SOLID)

객체지향에는 SOLID라고 불리는 5가지 설계 원칙이 존재한다.

1. SRP(Single Responsibility)

  • 한 클래스는 한 개의 책임만 가져야한다.
  • 클래스를 변경하는 이유는 단 한 개여야 한다.

2. OCP(Open-Closed)

  • 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.
  • 기능을 변경하거나 확장할 수 있으면서, 그 기능을 사용하는 코드는 수정하지 않는다.

3. LSP(Liskov Substitution)

  • 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 작동해야 한다.

4. ISP(Interface Segregation)

  • 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.

5. DIP(Dependency Inversion)

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.
  • 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.

객체지향 프로그래밍의 장점/단점

장점

  1. 모듈화, 캡슐화로 인해 유지보수에 용이하다.
  2. 객체지향적이므로 현실 세계와의 유사성에 의해 코드를 쉽게 이해할 수 있다.
  3. 모듈화된 객체와 상속을 통해 코드의 재사용성을 높일 수 있다.

단점

  1. 대부분의 객체지향 프로그램은 속도가 상대적으로 느리고, 많은 양의 메모리를 사용하는 경향이 있다.
  2. 현실 세계와 유사성에 의해 코드를 이해하기 쉽게 만드는 만큼 설계 과정에 많은 시간이 투자된다.

References

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Software%20Engineering/Object-Oriented%20Programming.md

https://velog.io/@khy226/%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-OOP-%EC%9D%B4%EB%9E%80#4-%EB%8B%A4%ED%98%95%EC%84%B1-polymorphism

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

0개의 댓글