해당 내용은 인프런에 있는 [김영한의 실전 자바 기본편] 강의를 보고 참고하여 정리한 글이다.
혹시 문제가 된다면 꼭 알려주시길 바랍니도...😢
객체 지향 프로그래밍
지금까지의 음악 플레이어는 데이터와 기능이 분리되어 있었음
이제 데이터와 기능을 하나로 묶어서 음악 플레이어라는 개념을 하나의 클래스에 담을 것임
프로그램을 작성하는 절차도 중요하지만 음악 플레이어라는 개념을 객체로 온전히 만드는 것이 더 중요, 음악 플레이어라는 객체를 지향해보자
프로그램의 실행 순서 보다는 음악 플레이어 클래스를 만드는 것 자체에 집중해야 함
음악 플레이어가 어떤 속성(데이터)을 가지고 어떤 기능(메서드)을 제공하는지 이 부분에 초점을 맞추어야 함
지금부터 우리는 음악 플레이어를 개발하는 개발자가 될 것임
이것을 어떻게 사용할지는 분리해서 생각할 것임
쉽게 말해, 음악 플레이어를 만들어 제공하는 개발자와 음악 플레이어를 사용하는 개발자가 분리되어 있다고 생각하면 됨
음악 플레이어
- 속성: volume, isOn
- 기능: on(), off(), volume(), showStatus()
객체 지향 음악 플레이어
package oop1;
public class MusicPlayer {
int volume = 0;
boolean isOn = false;
//보라색 단어 => 멤버변수
void on() {
isOn = true;
System.out.println("음악 플레이어를 시작합니다");
}
void off() {
isOn = false;
System.out.println("음악 플레이어를 종료합니다");
}
void volumeUp() {
volume++;
System.out.println("음악 플레이어 볼륨: " + volume);
}
void volumeDown() {
volume--;
System.out.println("음악 플레이어 볼륨: " + volume);
}
void showStatus() {
System.out.println("음악 플레이어 상태 확인");
if (isOn) {
System.out.println("음악 플레이어 ON, 볼륨:" + volume);
} else {
System.out.println("음악 플레이어 OFF");
}
}
}
MusicPlayer클래스에 필요한 속성과 기능 모두 정의함
이제 음악 플레이어가 필요한 곳에서 이 클래스만 있으면 온전한 음악 플레이어를 생성해서 사용할 수 있음
음악 플레이어를 사용하는데 필요한 모든 속성과 기능이 하나의 클래스에 포함되어 있음
package oop1;
public class MusicPlayerMain4 {
public static void main(String[] args) {
MusicPlayer player = new MusicPlayer();
//음악 플레이어 켜기
player.on();
//볼륨 증가
player.volumeUp();
//볼륨 증가
player.volumeUp();
//볼륨 감소
player.volumeDown();
//음악 플레이어 상태
player.showStatus();
//음악 플레이어 끄기
player.off();
}
}
실행 결과
음악 플레이어를 시작합니다
음악 플레이어 볼륨: 1
음악 플레이어 볼륨: 2
음악 플레이어 볼륨: 1
음악 플레이어 상태 확인
음악 플레이어 ON, 볼륨:1
음악 플레이어를 종료합니다
MusicPlayer를 사용하는 코드를 보면 MusicPlayer객체 생성하고 필요한 기능(메서드)을 호출하기만 하면 됨
- MusicPlayer를 사용하는 입장에서는 MusicPlayer의 데이터인 volume, isOn 같은 데이터는 전혀 사용하지 않음
- MusicPlayer를 사용하는 입장에서는 이제 MusicPlayer 내부에 어떤 속성(데이터)이 있는지 전혀 몰라도 됨
- MusicPlayer를 사용하는 입장에서는 단순하게 MusicPlayer가 제공하는 기능 중에 필요한 기능을 호출해서 사용하기만 하면 됨
캡슐화
MusicPlayer를 보면 음악 플레이어를 구성하기 위한 속성과 기능이 마치 하나의 캡슐에 쌓여있는 것 같음
이렇게 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화라고 함
객체 지향 프로그래밍 덕분에 음악 플레이어 객체를 사용하는 입장에서 진짜 음악 플레이어를 만들고 사용하는 것 처럼 친숙하게 느껴짐 / 그래서 코드가 더 읽기 쉬운 것은 물론이고, 속성과 기능이 한 곳에 있기 때문에 변경도 더 쉬워짐
예를 들어, MusicPlayer 내부 코드가 변하는 경우에 다른 코드는 변경하지 않아도 됨/ MusicPlayer의 volume이라는 필드 이름이 다른 이름으로 변한다고 할 때 MusicPlayer 내부만 변경하면 됨 / 또 음악 플레이어가 내부에서 출력하는 메세지를 변경할 때고 MusicPlayer 내부만 변경하면 됨 / 이 경우 MusicPlayer를 사용하는 개발자는 코드를 전혀 변경하지 않아도 됨
물론, 외부ㅔ서 호출하는 MusicPlayer의 메서드 이름을 변경한다면 MusicPlayer 를 사용하는 곳의 코드도 변경해야 함
정리
객체 지향 프로그래밍 vs 절차 지향 프로그래밍
객체 지향 프로그래밍과 절차 지향 프로그래밍은 서로 대치되는 개념이 아님
객체 지향이라도 프로그램의 작동 순서는 중요함 / 다만 어디에 더 초점을 맞추는가에 둘의 차이가 있음
객체 지향의 경우 객체의 설계와 관계를 중시함 / 반면 절차 지향의 경우 데이터와 기능이 분리되어 있고, 프로그램이 어떻게 작동하는지 그 순서에 초점을 맞춤
절차 지향 프로그래밍
- 절차 지향 프로그래밍은 이름 그대로 절차를 지향한다. 쉽게 말해, 실행 순서를 중요하게 생각하는 방식
- 절차 지향 프로그래밍은 프로그램의 흐름을 순차적으로 따르며 처리하는 방식임 / 즉, "어떻게"를 중심으로 프로그래밍을 함
객체 지향 프로그래밍
- 객체 지향 프로그래밍은 이름 그대로 객체를 지향함 / 쉽게 말해, 객체를 중요하게 생각하는 방식임
- 객체 지향 프로그래밍은 실제 세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식 / 즉, "무엇을"을 중심으로 프로그래밍 함
둘의 중요한 차이
- 절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있음 / 반면 객체 지향에서는 데이터와 그 데이터에 대한 행동(메서드)이 하나의 '객체' 안에 함께 포함되어 있음
객체란?
세상의 모든 사물을 단순하게 추상화 하면 속석(데이터)과 기능 딱 2가지로 설명할 수 있음
자동차
- 속성: 차량 색상, 현재 속도
- 기능: 엑셀, 브레이크, 문 열기, 문 닫기
동물
- 속성: 색상, 키, 온도
- 기능: 먹는다, 걷는다
게임 캐릭터
- 속성: 레벨, 경험치, 아이템
- 기능: 이동, 공격, 아이템 획득
객체 지향 프로그래밍은 모든 사무를 속성과 기능을 가진 객체로 생각하는 것임
객체에는 속성과 기능만 존재
이렇게 단순화하면 세상에 있는 객체들을 컴퓨터 프로그램으로 쉽게 설계 가능
이런 장점들 덕분에 지금은 객체 지향 프로그래밍이 가장 많이 사용됨
참고로 실세계와 객체가 항상 1:1로 매칭되는 것은 아님
객체 지향의 특징은 속성과 기능을 하나로 묶는 것 뿐만 아니라 캡슐화, 상속, 다형성, 추상화, 메세지 전달 같은 다양한 특징들이 있음
'개발 공부 > [java]' 카테고리의 다른 글
| 예외(Exception) (0) | 2024.08.07 |
|---|---|
| 오버로딩(Overloading)과 오버라이딩(Overriding) (0) | 2024.07.31 |
| [java] 김영한의 실전 자바 기본편 / 강의 정리 / 3. 객체 지향 프로그래밍 1 (0) | 2024.03.16 |
| [java] 김영한의 실전 자바 기본편 / 강의 정리 / 2. 기본형과 참조형 2 (0) | 2024.03.16 |
| [java] 김영한의 실전 자바 기본편 / 강의 정리 / 2. 기본형과 참조형 1 (0) | 2024.02.16 |