-
[Java] 객체 지향 프로그래밍언어/Java 2024. 11. 6. 10:27
김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런
김영한 | 실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문
www.inflearn.com
아래 내용은 위 링크에서 더 자세히 볼 수 있습니다.
절차 지향 프로그래밍 vs 객체 지향 프로그래밍
- 절차 지향 프로그래밍
- 절차를 지향한다. 실행 순서를 중요하게 생각함.
- "어떻게" 를 중심으로 프로그래밍한다.
- 객체 지향 프로그래밍
- 객체를 지향한다. 객체를 중요하게 생각.
- "무엇"을 중심으로 프로그래밍한다.
- 둘의 차이
- 절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다.
- 객체 지향은 데이터와 그 데이터에 대한 행동(메서드)이 하나의 객체 안에 함께 포함되어 있다.
절차 지향 프로그래밍 예시
package oop1; public class MusicPlayerMain1 { public static void main(String[] args) { int volume = 0; boolean isOn = false; // 음악 플에이어 켜기 isOn = true; System.out.println("음악 플레이엉를 시작합니다."); // 볼륨 증가 volume ++; System.out.println("음악 플레이어 볼륨: " + volume); volume ++; System.out.println("음악 플레이어 볼륨: " + volume); // 볼륨 감소 volume --; System.out.println("음악 플레이어 볼륨: " + volume); // 음악 플레이어 상태 if (isOn) { System.out.println("음악 플레이어 ON : " + volume); } else { System.out.println("음악 플레이어 OFF"); } isOn = false; System.out.println("음악 플레이어를 종료합니다."); } }
- 절차적으로 프로그래밍이 진행되고 있다. 기능을 분리 해줘보자.
package oop1; public class MusicPlayerMain2 { public static void main(String[] args) { MusicPlayData data = new MusicPlayData(); // 음악 플에이어 켜기 data.isOn = true; System.out.println("음악 플레이엉를 시작합니다."); // 볼륨 증가 data.volume ++; System.out.println("음악 플레이어 볼륨: " + data.volume); data.volume ++; System.out.println("음악 플레이어 볼륨: " + data.volume); // 볼륨 감소 data.volume --; System.out.println("음악 플레이어 볼륨: " + data.volume); // 음악 플레이어 상태 if (data.isOn) { System.out.println("음악 플레이어 ON : " + data.volume); } else { System.out.println("음악 플레이어 OFF"); } data.isOn = false; System.out.println("음악 플레이어를 종료합니다."); } }
- 음악 플레이어와 관련된 데이터는 MusicPlayData 클래스에 존재한다. 이후 프로그램 로직이 더 복잡해져 다양한 변수들이 추가되더라도 음악 플레이어와 관련된 변수들을 MusicPlayData data 객체에 속해 있으므로 쉽게 구분할 수 있다.
- 메서드도 추출해보자
- 지금 볼륨 증감이 중복된다.
- 뮤직 on/off 도 중복된다.
package oop1; public class MusicPlayerMain3 { public static void main(String[] args) { MusicPlayData data = new MusicPlayData(); // 음악 플에이어 켜기 on(data); // 볼륨 증가 volumeUp(data); volumeUp(data); // 볼륨 감소 volumeDown(data); // 음악 플레이어 상태 showStatus(data); // 음악플레이어 종료 off(data); } static void on(MusicPlayData data) { data.isOn = true; System.out.println("음악 플레이어를 시작합니다."); } static void off(MusicPlayData data) { data.isOn = false; System.out.println("음악 플레이어를 종료힙니다."); } static void volumeUp(MusicPlayData data) { data.volume ++; System.out.println("음악 플레이어 volume." + data.volume); } static void volumeDown(MusicPlayData data) { data.volume --; System.out.println("음악 플레이어 volume." + data.volume); } static void showStatus(MusicPlayData data) { if (data.isOn) { System.out.println("음악 플레이어 ON : " + data.volume); } else { System.out.println("음악 플레이어 OFF"); } } }
- 중복 제거
- 로직 중복이 제거되었다. 같은 로직이 필요하면 해당 메서드를 여러 번 호출하면 된다.
- 변경 영향 범위
- 기능을 수정할 때도 해당 메서드 내부만 변경하면 된다.
- 메서드 이름 추가
- 메서드 이름을 통해 코드를 더 쉽게 이해할 수 있다.
모듈화란 쉽게 이야기해서 레고 블럭을 생각해보자. 필요한 블럭을 가져다 꼽아서 사용할 수 있다. 여기서는 음악 플레이어의 기능이 필요하면 해당 기능을 메서드 호출만으로 손 쉽게 사용할 수 있다. 이제 음악 플레이어와 관련된 메서드를 조립해서 프로그램을 작성할 수 있다.
절차 지향의 한계
클래스를 사용해서 관련된 데이터를 하나로 묶고, 또 메서드를 사용해서 각각의 기능을 모듈화 했다.
-> 덕분에 깔끔하고 읽기 좋고 유지보수도 좋아보임. 하지만 여기서 더 개선할 수는 없나?
-> 위 소스 코드의 한계는 데이터와 기능의 분리이다.
-> 그렇다면 데이터와 기능을 하나로 묶는다는 것은?클래스와 메서드
package oop1; public class ValueDataMain { public static void main(String[] args) { ValueData valueData = new ValueData(); add(valueData); add(valueData); add(valueData); System.out.println("최종 숫자 = " + valueData.value); } static void add(ValueData valueData) { valueData.value++; System.out.println("숫자증가 value = " + valueData.value); } }
- 자바와 같은 객체 지향 언어는 클래스 내부에 속성(데이터)과 기능(메서드)을 함께 포함할 수 있다.
- 클래스 내부에 멤버 변수뿐만 아니라 메서드도 함께 포함할 수 있다.
package oop1; public class ValueData { int value; void add() { value++; System.out.println("숫자 증가 value = " + value); } }
- 현재 클래스 안에 메서드도 포함되어 있다.
- 데이터인 value
- 데이터를 사용하는 기능인 add() 메서드 함께 정의
참고로 add() 메서드는 static 키워드를 사용하지 않는다. 메서드는 객체를 생성해야 호출할 수 있다. 그런데 static 이 붙으면 객체를 생성하지 않고도 메서드를 호출할 수 있다.
package oop1; public class ValueObjectMain { public static void main(String[] args) { ValueData valueData = new ValueData(); valueData.add(); valueData.add(); valueData.add(); System.out.println("최종 숫자 = " + valueData.value); } }
- 클래스는 속성(데이터, 멤버 변수)과 기능(메서드)을 정의할 수 있다.
- 객체는 자신의 메서드를 통해 자신의 멤버 변수에 접근할 수 있다.
- 객체의 메서드 내부에서 접근하는 멤버 변수는 객체 자신의 멤버 변수이다.
- 궁금한 점.
- int value 는 data.add()를 불릴 때마다 초기화 되지 않았구나( 결론적 ) 왜 그럴까?
- value는 valueData 객체가 생성될 때 한 번만 초기화된다. 따라서 재호출해도 value는 이전 호출 시 증가된 값을 유지하게 된다.
- int value 는 data.add()를 불릴 때마다 초기화 되지 않았구나( 결론적 ) 왜 그럴까?
[최종 플레이어 뮤직]
package oop1; public class MusicPlayerMain4 { public static void main(String[] args) { MusicPlayer player = new MusicPlayer(); // 음악 플레이어 켜기 player.on(); // 볼륨 증가 player.off(); // 볼륨 증가 player.volumeUp(); // 볼륨 감소 player.volumeDown(); // 음악 플레이어 상태 player.showStatus(); // 음악 플레이어 끄기 player.off(); } }
- 코드의 가독성이 높아지고 유지보수도 뛰어나다.
객체 지향 프로그램에서는 객체를 어떻게 잘 만들지
속성과 기능이 하나의 클래스에 만들 수 있다. .. 추상화를 엄청한 속성과 기능'언어 > Java' 카테고리의 다른 글
[Java] 접근제어자 (1) 2024.11.08 [Java] 생성자, 패키지 (0) 2024.11.06 [Java] 변수와 초기화, null, nullPointerException (0) 2024.11.05 [Java] 기본형 vs 참조형 (0) 2024.11.05 [Java] 클래스, 객체(인스턴스) (5) 2024.11.04 - 절차 지향 프로그래밍