🌱 객체 지향 프로그래밍의 정의
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다.
각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. (협력)
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
🌱 객체 지향의 4대 특성
1. 캡슐화(Encapsulation) : 정보 은닉(information hiding)
캡슐화하면 접근제어자와 관련이 있다.
public : 모두가 접근 가능
protected : 상속/같은 패키지 내의 클래스에서 접근 가능
default : 같은 패키지 내의 클래스에서 접근 가능
private : 본인만 접근 가능
상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변수를 이용해 접근해야 한다.
정적 멤버는 클래스명.정적멤버 형식으로 접근하는 것을 권장한다.
2. 상속 : 재사용+확장
객체 지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속(특성 상속)하고 거기에 더해 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미다.
알기 쉽게 예를 들어보면 이런 것이다.
동물 뽀로로 = new 펭귄();
3. 추상화(Abstraction) : 모델링
추상 [명] 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용
일반적인 뜻의 추상화는 다음과 같다.
추상화 : 구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합하는 것이다.
위의 정의를 IT 용어를 이용해 바뀌 보면 다음과 같다.
추상화 : 구체적인 것을 분해해서 관심 영역(애플리케이션 경계)에 있는 특성만 가지고 와서 재조합하는 것 = 모델링
위의 그림을 보면 추상화가 무엇인지 감이 올 것이다.
자바에서는 이러한 객체 지향의 추상화를 class 키워드를 통해 지원하고 있다.
4. 다형성(Polymorphism) : 사용 편의
객체 지향에서 다형성이라고 하면 오버라이딩(overriding)과 오버로딩(overloading)이라고 할 수 있다.
헷갈리는 두 개념을 확실하게 알아보자
영단어 뜻을 생각하면 좀 더 이해하기 쉬울 것이다.
오버라이딩(overriding) : 재정의. 상위클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트
오버로딩(overloading) : 중복정의. 같은 메서드 이름, 다른 인자 리스트.
코드로 살펴보면 다음과 같다.
// Animal.java
public class Animal {
public String name;
public void showName() {
System.out.println("안녕 나는 %s야. 반가워\n", name);
}
}
// Penguin.java
public class Penguin extends Animal {
public String habitat;
public void showHabitat() {
System.out.printf("%s는 %s에 살아\n", name, habitat);
}
// 오버라이딩 (재정의)
// 상위클래스의 메서드와 같은 이름, 같은 인자 리스트
public void showName() {
System.out.println("어머. 내 이름은 알아서 뭐하게요?");
}
// 오버로딩 (중복정의)
// 상위클래스의 메서드와 같은 이름, 다른 인자 리스트
public void showName(String yourName) {
System.out.println("%s 안녕, 나는 %s라고 해./n", yourName, name);
}
}
// Driver.java
public class Driver {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName();
pororo.showName("초보람보");
pororo.showHabitat();
Animal pingu = new Penguin();
pingu.name = "핑구";
pingu.showName();
}
}
[실행결과]
어머. 내 이름은 알아서 뭐하게요?
초보람보 안녕, 나는 뽀로로라고 해.
뽀로로는 남극에 살아
어머. 내 이름은 알아서 뭐하게요?
🌱 좋은 객체 지향 프로그래밍이란?
지금까지 객체 지향 프로그래밍의 의미와 객체 지향의 특성 4가지를 알아보았다.
이 모든 것은 좋은 객체 지향 프로그래밍이 무엇인지 알기 위해 우선으로 알아본 것이였다.
그렇다면, 좋은 객체 지향 프로그래밍이란 무엇인가?
다형성이라는 특성을 활용하여 역할과 구현을 분리하는 것이다.
역할과 구현으로 구분하면 세상이 단순해지고, 유연해지며 변경이 편리해진다.
장점으로는
자바에서의 역할과 구현은 다음과 같다.
객체를 설계할 때 역할과 구현을 명확히 분리하는 것이 좋으며, 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만드는 것이 좋다.
객체는 혼자 있지 않고 협력한다. 클라이언트가 요청하면, 서버는 응답한다.
수 많은 객체 클라이언트와 객체 서버는 서로 협력관계를 가지는 것이다.
우리가 계속 이야기 해왔던 다형성의 본질은 다음에 있다.
지금까지 설명이 길고 이해햐기까지 쉽지 않았을 것이다.
요약하고 정리하자면 다음과 같다.
역할과 구현을 분리하라.
🌱 스프링과 객체 지향