[Java] 자바를 자바랏~! - (2) 객체 지향 프로그래밍

jiveloper·2024년 8월 11일
0

Java

목록 보기
2/2
post-thumbnail
post-custom-banner

안녕하세요. 지난 포스팅에 이어 자바를 자바랏의 두번째 개념 시간을 가져보겠습니다~!!

이번 포스팅은 객체 지향 프로그래밍에 대해 알아보겠습니다.

1. 절차 지향 프로그래밍 vs. 객체지향 프로그래밍

프로그램 방식은 크게 절차 지향 프로그래밍과 객체 지향 프로그래밍으로 나눌 수 있습니다.

절차 지향 프로그래밍

  • 절차 지향 프로그래밍은 이름 그대로 절차를 지향합니다.
  • 실행 순서를 중요하게 생각하기 때문에 프로그램의 흐름을 순차적으로 따르며 처리하는 방식입니다.

객체 지향 프로그래밍

  • 객체 지향 프로그래밍은 이름 그대로 객체를 지향합니다.
  • 실제 세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍 하는 방식.

두 프로그래밍 방식은 데이터 처리 방식에 있어 중요한 차이가 있습니다.
절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있으나, 객체 지향은 데이터와 그 데이터에 대한 메서드가 하나의 객체 안에 포함 되어있다는 것입니다!!!!

바로 예시로 보겠습니다.

예시


고객이 카페 가서 커피를 주문하여 받는 과정을 프로그래밍의 관점으로 보겠습니다.

절차 지향 방식은 상황을 중심으로 순서대로 조합하는 방식입니다.

반면, 객체 지향 방식은 객체를 중심으로 프로그래밍 합니다. 커피 주문 상황에서 필요한 객체들에게(고객, 직원) 역할을 지정해놓고, 역할을 가진 각 객체들을 순서대로 조합하는 방식입니다.


2. 클래스와 메서드

클래스는 데이터인 멤버 변수 뿐 아니라 기능 역할을 하는 메서드도 포함할 수 있습니다. 위의 예시로 절차 지향 방식과 객체 지향 방식의 코드 차이를 알아봅시다.

먼저 절차 지향 방식부터 알아보겠습니다!

1. 절차 지향 방식

public class CafeData {
  int coffeeCount;
}
public class CafeDataMain {
     public static void main(String[] args) {
         CafeData cafeData = new CafeData();
         add(cafeData);
         add(cafeData);
         add(cafeData);
         System.out.println("커피 개수=" + cafeData.coffeeCount);
     }

     static void add(CafeData cafeData) {
         cafeData.coffeeCount++;
         System.out.println("커피 개수 증가 coffeeCount=" + cafeData.coffeeCount);
      }
}

결과

커피 개수 증가 coffeeCount=1
커피 개수 증가 coffeeCount=2
커피 개수 증가 coffeeCount=3
커피 개수=3

절차 지향 방식은 상황을 순서대로 조합하는 방식이라고 하였죠? 코드를 하나하나 분석해봅시다. 🧐

  1. coffeeData에 coffeeCount 멤버 변수가 존재합니다. // 메모리 주소는 예시입니다.

  2. 메인에 cafeData를 파라미터로 받아서, cafeData에서 coffeeCount를 꺼내어 증가시키는 메서드 add가 있습니다.

  3. 메인에서 상황(add)을 순서대로 호출하고 있습니다.


과정



다음으로 객체 지향 방식을 알아보겠습니다!

2. 객체 지향 방식

public class CafeData {
  int coffeeCount;

  void add() {
    coffeeCount++;
    System.out.println("커피 개수 증가 coffeeCount=" + cafeData.coffeeCount);
  }
}
public class CafeDataMain {
     public static void main(String[] args) {
         CafeData cafeData = new CafeData();
         cafeData.add();
         cafeData.add();
         cafeData.add();
         System.out.println("커피 개수=" + cafeData.coffeeCount);
     }
}

결과

커피 개수 증가 coffeeCount=1
커피 개수 증가 coffeeCount=2
커피 개수 증가 coffeeCount=3
커피 개수=3

객체 지향 방식은 역할을 가진 각 객체들을 순서대로 조합하는 방식이라고 하였죠? 코드를 하나하나 분석해봅시다. 🧐

  1. cafeData에 coffeeCount 멤버 변수와 coffeeCount 개수를 늘리는 add 메서드가 존재합니다.

    cafeData는 coffeeCount 개수를 늘리는 역할을 하는 객체입니다.
    이 add에는 자신의 멤버 변수에 접근하여 계산하였다는 점이 절차 지향 방식과의 차이 입니다.

  2. 메인에서 cafeData 객체에서 역할 add를 꺼내 호출합니다.

    메인에서는 CafeData의 데이터인 coffeeCount 같은 데이터는 전혀 사용하지 않습니다. CafeData를 사용하는 입장에서는 CafeData 내부에 어떤 속성이 있는지 전혀 몰라도 CafeData가 제공하는 기능 중에 필요한 기능을 호출해서 사용합니다.

    💡 이렇게 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것캡슐화라고 합니다.

과정

정리

  • 클래스에는 속성(멤버 변수)과 기능(메서드)을 정의할 수 있습니다.
  • 객체는 자신의 메서드를 통해 자신의 멤버변수에 접근 할 수 있습니다. (객체의 메서드 내부에서 접근하는 멤버 변수는 객체 자신의 멤버 변수입니다.)

다음 시간엔 생성자에 대해 알아보도록 하겠습니다!! :)

profile
👩🏻‍💻 Clean Code와 Refactoring에 관심이 많은 개발자 입니다.
post-custom-banner

0개의 댓글