카테고리 없음

[김영한_자바기본][3. 객체 지향 프로그래밍] 클래스와 메서드 / (복습) 객체 이해(p.8-11)

줌인. 2024. 2. 4. 00:32

 

두 코드 모두 원본 클래스 내의 데이터 값을 참조하는 특징이 있다. 
따라서 클래스의 내부 상태가 메서드에 의해 변경되며, 이 변경은 메서드를 호출한 외부에서도 반영된다.

이런식으로 객체의 상태를 직접 조작할 수 있기 때문에 "참조"라는 용어를 사용하게 된다.
또한, 캡슐화는 "참조하는 것은 똑같지만 참조 위치를 불러오지 않게 코드를 작성한다"로 설명할 수 있다.



 

 

1. 클래스와 메서드(기능) 분리 = 절차 지향형 프로그래밍

메서드에 별도의 매개변수를 전달해 값을 조작하며, 데이터를 명시적으로 전달한다.
데이터와 연산(기능)이 별도로 존재하고, 코드는 이들을 조작하는데 집중한다.

 

[p.8 / 클래스 ValueData] 

public class ValueData { //사탕 상자
    int value; //사탕 개수
}

 

[p.8 / ValueDataMain] 이해를 위해 셀프로 로직 그려보기

public class ValueDataMain {
        //int value
    public static void main(String[] args) {
        ValueData data = new ValueData(); // 사탕상자의 위치 담은 data 변수 생성
        add(data);
        add(data);
        add(data);
        System.out.println("최종 숫자 = " + data.value);
    }

    static void add(ValueData data) { //사탕상자의 위치를 전달받은 후 다음 절차가 이루어짐
        data.value++; //사탕안의 위치를 찾아 사탕값 증가시키기
        System.out.println("숫자 증가 value = " + data.value);
    }
    //참조값 대입 방식 그려보면 이해하기 쉽다.
}

 

 

 

2. 클래스 내부에 메서드(기능) 포함 = 객체 지향형 프로그래밍

클래스 내부에 있는 메서드는 클래스의 상태(인스턴스 변수)에 직접 접근하여 조작할 수 있다.
코드가 자체적으로 내부의 상태와 동작을 관리한다.


[p.9. / 클래스 ValueObject] 메서드에 별도의 참조를 전달하지 않아도 클래스 내의 상태를 조작할 수 있다.

public class ValueObject {
    int value;

    void add() { //클래스 자체내에서 static 키워드를 사용하지 않는다.
        value++; //사탕 상자안의 사탕 개수 증가
        System.out.println("숫자 증가 value = " + value);
    }
}

- 객체지향형 클래스에서 참조를 공유한다는 것은 메서드가 클래스의 자체 변수에 직접 접근하여 조작할 수 있다.

 

[p.9. / ValueObjectMain] 원본의 데이터 및 기능을 이용하기 위해서 동일하게 "."을 이용하면 된다.

public class ValueObjectMain {

    public static void main(String[] args) {
        ValueObject data = new ValueObject(); //상자 위치 접근할 수 있는 설계툴 생성

        data.add(); //상자 위치 내부 기능 작동 -> 절차 지향과 비슷하게 이루어진다고 생각
        data.add();
        data.add();
        System.out.println("최종 숫자 = " + data.value);
    }
}

- 외부에서는 객체의 인터페이스만 이해하면 되고, 내부의 복잡성은 숨겨진다.

- 코드의 변경 / 업데이트가 있을 때 외부 코드에 미치는 영향이 최소화되고, 불필요한 복잡성이 감소한다.

 

 

따라서 전반적으로 ValueObjectMain 클래스에서 ValueObject 클래스의 객체를 생성하고,
해당 객체의 메서드를 호출하며, 객체 내의 변수를 사용하는 예제이다.

 


 

[객체 개념 다시 정리하기]


객체 data와 그 객체의 메서드로 구성된 것은 전체적인 객체 지향적인 구조를 나타내고 있다.
즉 객체는 데이터와 그 데이터를 조작하는 메서드의 집합으로 이루어진 것으로 이해하자

 

 

1. 필드 = 멤버변수  = 인스턴스(객체) 변수

    public static void main(String[] args) {
        ValueObject data = new ValueObject(); 
    }

2. new ValueObject는 ValueObject 클래스 기반 객체 생성

3. data는 객체를 참조하기 위한 변수이며, 객체의 메모리 주소 참조

4. 주의할 점은 객체 (인스턴스)변수 자체도 객체의 일종이라는 것, 그러나 객체 자체가 아닌 주소만 가지고 있는 것

    이러한 변수(참조값)을 통해 메서드 호출 및 객체 접근이 가능하다.

data.add();
data.add();
add(data);
add(data);

5. 상기와 같은 코드 역시 객체의 일부분으로 본다.

- `data`는 `ValueObject` 클래스의 인스턴스를 참조하는 변수이고, `add()`는 (객체)인스턴스의 메서드다.

- 메서드를 호출하면 객체 내의 일부 로직이 실행되기 때문에 호출된 메서드 또한 해당 객체의 일부로 간주된다.

∴  모두 `ValueObject` 클래스의 객체를 참조하는 `data` 변수를 통해 해당 객체의 메서드를 호출하는 것이다.
   >> 코드를 전체적으로 보면, `data`가 참조하는 객체의 메서드를 호출하면서 해당 객체를 조작하고 있으므로

        이는 객체의 일부분으로 간주할 수 있다.

 

 

▶ 클래스 도입, 객체 이해하기
https://zoooom-in.tistory.com/43

 

[김영한_자바기본][1.클래스와 데이터] 클래스 도입, 객체 이해하기(인스턴스) (p.15-23)

Class는 설계도로, 객체(인스턴스)는 설계도를 구현한 설계툴로 보자 정보 참조는 설계툴을 통해 이루어지며, 입력 전까지는 설계툴에는 원본(설계도면) 위치만 뜬다. [코드 읽기 전, 이해 도모를

zoooom-in.tistory.com

 

728x90