객체지향 프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나로 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메세지를 주고 받고, 데이터를 처리할 수 있다.
이처럼 가능한 모든 물리적, 논리적 요소를 객체로 만드려는 것이 객체지향 프로그래밍 이라고 말할 수 있다.
객체지향으로 구현하게 되면, 객체 간의 독립성이 생기고 중복코드의 양이 줄어드는 장점이 있고, 독립성이 확립되면 유지보수에도 도움이 될 것이다.
객체지향은 크게 4가지의 특징을 가지고 있다.
ex. 아우디, BMW, 벤츠는 모두 자동차라는 공통점이 있다.
자동차라는 추상화 집합을 만들어두고, 자동차들이 가진 공통적인 특징들을 만들어 사용한다.
만약 나중에 다른 자동차 브랜드가 추가될 경우, 다른 곳의 코드는 수정할 필요 없이 추가로 만들 부분만 새로 생성해주면 된다는 장점이 있다.
객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 기법이다.
다시 말해, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라고 할 수 있다.
캡슐화의 주된 목적 중 하나는 정보은닉이다. 유저 정보를 가지고 있는 User 객체에서 유저의 정보가 public으로 선언되어 있다면, 누구나 접근해서 유저 정보를 변경할 수 있다. 그렇기 때문에 private으로 선언하여 데이터를 보호하고 접근을 제한해야 한다.
이렇게 보호된 변수는 Getter 또는 Setter 등의 메서드를 통해서만 간접적으로 접근할 수 있도록 하는 것이 캡슐화의 중요한 목적이다.
상속이 필요한 이유는 코드의 중복을 없애기 위함이다.
코드의 중복이 많아지면 유지보수에 많은 비용이 들게된다.
OOP에서는 상속을 통해 코드 중복 문제를 일부 해결할 수 있다.
포유류 클래스에 여러 속성들을 정의해 놓고 포유류에 해당하는 종이 필요한 경우 포유류 클래스와 상속 관계를 맺는다.
상속 관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려 받으므로 자식 클래스에서 이를 다시 정의할 필요가 없다.
다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다. 즉, 다형성은 서로 다른 클래스이 객체가 같은 메세지를 받았을 때 각자의 방식으로 동작하는 능력을 의미한다.
이를 통해 코드의 재사용성, 코드의 길이가 감소되어 유지보수에 용이하다.
고양이 클래스에 울음이라는 속성이 정의되어 있다고 가정하면, 사자는 고양이 과이므로 사자 클래스가 고양이 클래스를 상속받는다면, 사자 클래스에도 울음이라는 속성이 자동으로 추가된다. 이것을 상속이라고 한다.
그런데 고양이와 사자의 울음소리는 서로 다르다. 이러한 것을 다형성이라고 말할 수 있다.
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);
}
}
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라고 불리는 5가지 설계 원칙이 존재한다.
1. SRP(Single Responsibility)
2. OCP(Open-Closed)
3. LSP(Liskov Substitution)
4. ISP(Interface Segregation)
5. DIP(Dependency Inversion)