본문 바로가기
국비학원 전 강의 필사/점프 투 자바

#05-01 객체지향 프로그래밍이란? - <점프 투 자바>

by kkooHan 2022. 9. 2.

 

출처 : https://wikidocs.net/book/31

 

 

점프 투 자바

**초보 프로그래머를 위한 자바 입문서** 이 책은 문법위주의 지식보다는 이해중심의 지식을 전달하는 것을 주 목적으로 한다. 예를 들어 자바에서 잘 파악하기 힘든 개념 ...

wikidocs.net

 

 

 

 

 

 

필사 :

 

여러분 모두 계산기를 사용해 보았을 것이다. 

계산기에 숫자 3을 입력하고 + 기호를 입력한 후 4를 입력하면

결과값으로 7을 보여 준다.

다시 한 번 + 기호를 입력한 후 3을 입력하면

기존 결과값 7에 3을 더해 10을 보여 준다.

즉 계산기는 이전에 계산한 결과값을 항상 메모리 어딘가에 저장하고 있어야 한다.

 

 

이런 내용을 자바 코드로 구현해 보자.

계산기의 "더하기" 기능을 구현한 코드는 다음과 같다.

 

===

여기서 다루는 코드들은 아직은 이해하지 못해도 좋다.

곧 자세하게 배울 것이다. 여기에서는 객체지향에 대한 개념만 이해하면 된다.

===

 

 

class Calculator {

    static int result = 0;

 

    static int add(int num) {

        result += num;

        return result;

    }

}

 

public class Sample {

    public static void main(String[] args) {

        System.out.println(Calculator.add(3));

        System.out.println(Calculator.add(4));

    }

}

 

add 메소드는 매개변수 num으로 받은 값을

이전에 계산한 결과값에 더한 후 돌려주는 메소드이다.

이전에 계산한 결과값을 유지하기 위해서

result 전역 변수(static)를 사용했다.

 

 

===

static 키워드는 조금 후에 자세하게 공부한다.

여기서는 변수에 저장된 값을 계속유지하기 위해 사용되었다.

===

 

 

프로그램을 실행하면 예상한 대로 다음과 같은 결과값이 출력된다.

 

3

7

 

 

그런데 만일 Sample 클래스에서

2대의 계산기가 필요한 상황이 발생하면 어떻게 해야 할까?

각 계산기는 각각의 결과값을 유지해야 하기 때문에

위와 같이 Calculator 클래스 하나만으로는 결과값을 따로 유지할 수 없다.

 

 

이런 상황을 해결하려면 다음과 같이 클래스를 각각 따로 만들어야 한다.

 

class Calculator 1 {

    static int result = 0;

 

    static int add(int num) {

        result += num;

        return result;

    }

}

 

class Calculator 2 {

    static int result = 0;

 

    static int add(int num) {

        result += num;

        return result;

    }

}

 

public class Sample {

    public static void main(String[] args) {

        System.out.println(Calculator1.add(3));

        System.out.println(Calculator1.add(4));

 

        System.out.println(Calculator2.add(3));

        System.out.println(Calculator2.add(7));

    }

}

 

 

똑같은 일을 하는 Calculator1과 Calculator2 클래스를 만들었다.

 

결과값은 다음과 같이 의도한 대로 출력된다.

 

3

7

3

10

 

 

계산기1의 결과값이 계산기2에 아무 영향을 끼치지 않음을 확인할 수 있다.

하지만 계산기가 3개, 5개, 10개로 점점 더 많이 필요해진다면 어떻게 해야 할까?

그때마다 클래스를 추가할 것인가?

여기에 빼기나 곱하기 등의 기능을 추가해야 한다면

상황은 점점 더 어려워질 것이다.

 

 

아직은 객체에 대해 배우지 않았지만,

위와 같은 경우 객체를 사용하면 다음과 같이 간단하게 해결할 수 있다.

 

class Calculator {

    int result = 0;

 

    int add(int num) {

        result += num;

        return result;

    }

}

 

public class Sample {

    public static void main(String[] args) {

        Calculator cal1 = new Calculator();   // 계산기1 객체를 생성한다.

        Calculator cal2 = new Calculator();   // 계산기2 객체를 생성한다.

 

        System.out.println(cal1.add(3));

        System.out.println(cal1.add(4));

 

        System.out.println(cal2.add(3));

        System.out.println(cal2.add(7));

    }

}

 

===

Calculator 클래스의 static 키워드를 모두 삭제했다.

===

 

 

프로그램을 실행하면 클래스 2개를 사용했을 때와 동일한 결과가 출력된다.

 

3

7

3

10

 

 

Calculator 클래스로 만든 별개의 계산기 cal1, cal2(이것을 객체라고 부른다)가

각각의 역할을 수행한다.

그리고 계산기(cal1, cal2)의 결과값 역시 다른 계산기의 결과값과 상관없이

독립적인 값을 유지한다.

 

객체를 사용하면 계산기 대수가 늘어나더라도

객체를 생성만 하면 되기 때문에

클래스만을 사용하는 경우와 달리 매우 간단해진다.

 

 

만약 빼기 기능을 추가하려면

Calculator 클래스에 다음처럼 sub 메소드를 추가하면 된다.

 

class Calculator {

    int result = 0;

 

    int add(int num) {

        result += num;

        return result;

    }

 

    int sub(int num) {

        result -= num;

        return result;

    }

}

 

 

객체지향 프로그래밍의 이점은 이것만이 아니다.

하지만 이것 하나만으로도 "도대체 왜 객체가 필요한 것일까?"라는

근본적인 물음에 대한 해답이 되었을 것이다.

 

 

 

 

 

느낀점 : 

 

메소드를 사용하기 전 객체를 만들어왔다.
객체 만드는 이유가 이거구나~~

 


클래스와 메소드를 만드는 원리도 
조금 감이 왔다.

 

 

계산기 더하기(+=), 빼기(-=) 뿐만 아니라곱하기(*=), 나누기(/=), 나머지 구하기(%=)도 잘 된다.신기한 점은 나누기를 할 때 몫만 출력된다는 점. (int라 정수부분만 표시되서 그런가보다.)

 

 

처음에는 클래스 자체를 불러왔고,

나중에는 클래스는 그대로 둔 채 객체를 만들어서 사용했다. (값을 각각 보존하고 싶어서)

 

 

static이 빠짐으로서 생기는 문제는 없을까?

댓글