ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 객체 지향 프로그래밍
    언어/Java 2024. 11. 6. 10:27

    https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

     

    김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런

    김영한 | 실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 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는 이전 호출 시 증가된 값을 유지하게 된다.

    [최종 플레이어 뮤직]

    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
Designed by Tistory.