Java, 객체 지향 프로그래밍 - 클래스와 메소드

이전 객체 지향 기본 글에서 음악 플레이어를 코드를 작성하면서 절차 지향에 대해 알아보았다. 절차 지향에는 데이터 영역과 데이터와 연관된 기능 영역이 분리되어 유지보수 관점에서도 두 곳을 살펴보아야 했는데, 이번에는 데이터와 기능를 한 곳에서 관리하는 객체 지향 프로그래밍을 알아보도록 한다.


클래스와 메소드

클래스는 데이터인 멤버변수를 추가할 수 있을 뿐 아니라 기능 역할을 하는 메소드도 포함할 수 있다.

멤버변수만 갖는 클래스로 코드를 작성해보도록 한다.

ValueData 클래스

public static class ValueData {
    int value;
}

ValueData 클래스 활용

public class Main {
    public static class ValueData {
        int value;
    }

    public static void main(String[] args) {
        ValueData v = new ValueData();
        add(v);
        add(v);
        System.out.println(v.value);
    }

    public static void add(ValueData data) {
        data.value++;
    }
}

이 코드는 변수 v 에게 ValueData 인스턴스를 생성하고 add 메소드는 파라미터 ValueData.value의 숫자 값을 하나씩 증가시켰다.

자바는 객체지향 프로그래밍으로 클래스 내부에 속성(데이터) 뿐 아니라 기능(메소드)도 포함할 수 있다.

새 클래스를 만들어보도록 한다. 숫자를 증가 시키는 add 메소드를 클래스 내부로 포함해서 클래스를 ValueObject 이름으로 정의한다.

ValueObject 활용 코드

public class Main {
    public static class ValueObject {
        int value;

        public void add() {
            value++;
        }
    }

    public static void main(String[] args) {
        ValueObject v = new ValueObject();
        v.add();
        v.add();
        System.out.println(v.value);
    }
}
참고: class 내부 add() 메소드 추가 시 static 키워드를 사용하지 않는다.
메소드는 객체를 생성해야 호출할 수 있는데, 클래스 내부인 경우 클래스 사용 전에 이미 객체를 생성하기 때문에 static이 필요없다.

ValueObject 인스턴스 생성

new 연산자로 객체를 생성한 경우 그림처럼 변수는 메모리 주소값을 담고 주소값 에는 클래스는 add() 메소드가 있는 것을 확인할 수 있다.

ValueObject v = new ValueObject();

ValueObject 메소드 호출

ValueObject 클래스 내부 메소드를 호출하면 add() 라는 메소드를 실행시키고 클래스의 value 값을 증감시키는 모습을 볼 수 있다.

v.add();

객체 변수에 dot(.) 를 찍어 객체 접근한 다음 add() 메소드를 호출하면 인스턴스 x0001의 value 데이터값이 증가한 것을 볼 수 있다.